Я хочу определить, когда точка (позиция мыши) включена или близка к кривой, определенной рядом контрольных точек B-Spline.Какой алгоритм определяет близость точки к кривой Безье?
Информация, которую я буду иметь для B-Spline, представляет собой список из n контрольных точек (по координатам x, y). Список контрольных точек может быть любой длины (> = 4) и определять B-сплайн, состоящий из (n-1)/3 кубических кривых Безье. Кривые Безье все кубические. Я хочу установить параметр k (в пикселях) расстояния, определенного как «близкое» к кривой. Если позиция мыши находится в пределах k пикселей кривой, тогда мне нужно вернуть true, иначе false.
Есть ли алгоритм, который дает мне эту информацию. Любое решение не обязательно должно быть точным - я работаю с допуском в 1 пиксель (или координату).
Я обнаружил, что следующие вопросы могут помочь, но не отвечают на мой точный вопрос. В частности, первая ссылка представляется решением только для 4 контрольных точек и не учитывает фактор близости, который я хочу определить.
Position of a point relative to a Bezier curve
Intersection between bezier curve and a line segment
EDIT: Пример кривой:
e, 63.068, 127.26
29.124, 284.61
25.066, 258.56
20.926, 212.47
34, 176
38.706, 162.87
46.556, 149.82
54.393, 138.78
Описание формата: «Каждое ребро присваивается атрибут POS, который состоит из списка 3n + 1. Это контрольные точки B-сплайна: точки p0, p1, p2, p3 являются первым сплайном Безье, p3, p4, p5, p6 являются вторыми и т. Д. Точки представлены двумя целыми числами, разделенными запятой , представитель возмущая координаты X и Y места, указанного в точках (1/72 дюйма). В атрибуте pos списку контрольных точек может предшествовать начальная точка ps и/или конечная точка pe. Они имеют обычное представление позиции с «S», или «е» префикс, соответственно «
EDIT2: Дальнейшее объяснение„ е.“Точки (и с если она присутствует)
В атрибуту pos, списку контрольных точек может предшествовать старт точка ps и/или конечная точка pe. Они имеют обычное позиционное представление с префиксом "s" или "e", соответственно. точка присутствует, если в точке p0 есть стрелка. В этом случае стрелка находится от p0 до ps, где ps фактически находится на границе узла. Длина и направление стрелки задаются вектором (ps -p0). Если там нет стрелки, p0 находится на границе узла. Точно так же точка pe обозначает стрелку на другом конце края, соединяющуюся с последней точкой сплайна.
Как вы работаете с кривой Безье? Для чего вы пишете приложение? В большинстве случаев с элементами пользовательского интерфейса вы можете определить наведение мыши или что-то еще, вы пишете элемент пользовательского интерфейса с нуля? Какой язык? – jcolebrand 2010-11-25 06:47:01
Кубическая кривая Безье ВСЕГДА зависит от ровно 4 контрольных точек. Может быть, вы хотите создать http://en.wikipedia.org/wiki/Spline_(mathematics) из нескольких кривых или чего-то еще? – skalee 2010-11-25 10:55:32
@drachenstern Я эффективно пишу элемент пользовательского интерфейса с нуля. Я пишу графический редактор, где различные элементы редактора представляют собой визуальные представления базовых объектов и должны манипулировать ими в соответствии с правилами, управляющими объектами. – 2010-11-25 15:25:44