Как я могу определить, находится ли указатель мыши внутри пути, определенного кривыми Безье и линиями? - PullRequest
4 голосов
/ 22 июня 2011

У меня есть замкнутый путь, состоящий из нескольких кривых Безье и отрезков прямых линий. Как я могу определить, находится ли текущая позиция моего указателя мыши внутри или вне пути?

Пример выхода мыши из области:
on mouse leave

Пример входа мыши в область:
on mouse enter

Ответы [ 3 ]

5 голосов
/ 22 июня 2011

Сначала вы должны проверить, обеспечивает ли используемая вами графическая библиотека тестирование на попадание.

Если вам придется кодировать его самостоятельно, то для получения полностью точного ответа потребуется решить квадратные или кубические уравнения (в зависимости отна степени ваших кривых Безье), чтобы определить пересечение с этими путями.Кажется, есть статья по , как раз об этой проблеме .

Однако я думаю, что было бы гораздо разумнее построить линейную аппроксимацию вашего пути (т.е. плотно оценить путь) и затем использоватьстандартный тест точки-полигона .Это может быть с точностью до любого допустимого отклонения (например, один пиксель).

1 голос
/ 01 апреля 2013

Чтобы проверить, находится ли точка внутри или вне пути Безье, нарисуйте линию в любом направлении от точки и посчитайте, сколько раз линия пересекает путь.Если число нечетное, то вы внутри, если оно четное, то вы снаружи.

Таким образом, тест на внутренность может быть выражен как тест на пересечение.Пересечения могут быть решены несколькими способами.Относительно простой подход состоит в том, чтобы аппроксимировать ваши исправления Безье с помощью отрезков прямой линии с помощью алгоритма де Кастеляу, сводя тест пересечения линии Безье к серии испытаний пересечения линии.расчет.Если, например, линия, которую вы рисуете, лежит полностью за пределами ограничивающих рамок контрольных точек данного безье-патча, то вы можете предположить, что он не будет пересекать патч.Вы можете воспользоваться этим конкретным сочетанием клавиш при рекурсивном разделении кривых с помощью deCasteljau, чтобы отбросить разделенные участки кривых, которые не будут пересекать сегмент вашей линии.

1 голос
/ 22 июня 2011

Если регионы относительно малы, вы можете запустить заливку, начиная с местоположения мыши.Если заливка выходит за пределы ограничительной рамки (которую вы можете предварительно вычислить), то она находится за пределами региона.

...