Положение точки относительно кривой Безье

У меня есть кривая Безье, заданная 4 точками. Мне нужно знать, находится ли точка на левой или правой стороне кривой Безье. Вы можете предложить мне алгоритм?

Edit: Я уверен, что как я генерирую кривая Безье не будет формировать петли.

изменить Я понял, что моя первоначальная проблема может быть решена без использования относительного положения. Когда я разместил этот вопрос, я думал, что есть математический формула для относительного положения аналогично с проверкой, находится ли точка внутри круга. Кажется, что это невозможно. Поэтому я приму ответ, который предложит эффективное во времени решение.

5 ответов


вы можете определить ближайшую точку на кривой Безье с помощью довольно простого алгоритма (связанного с K-подразделением. Алгоритм DeCastleju по.) Посмотрите на графические драгоценные камни, Если вам нужна конкретика.

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

вы можете получить перекрестное произведение двух векторов. Отрицательный или положительный будет определять handedness и на какой стороне линии вы находитесь.

конечно, в петле боковина будет определена, как если бы Вы были автомобилем, едущим по линии, вы бы смотрели из правого или левого окна в точке, когда вы идете мимо... Нет, если вы находитесь справа или слева от всей закорючки Безье. Это зависит от того, как вы определяете "sideness"

Извините, если мои условия не горят. Прошло некоторое время с тех пор, как мне приходилось что-то делать с Безье

было бы проще нарисовать картинку;)


Если вы просто хотите, чтобы ваш объект следовал кривой (как вы говорите в своем комментарии), почему бы вам просто не переместить объект с параметрическим уравнением ? эту статью


тут мат для кубической и квадратичной имплицитации кривой Безье.


Я не могу вспомнить математику в этот поздний час, но вы, вероятно, захотите использовать алгоритм подразделения для кривой, чтобы постепенно уточнить ее, пока сегменты не станут "прямыми" достаточно, чтобы вы могли рассматривать их как сегменты линии для целей вашего определения.

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


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

Это то, что вы хотите, или я полностью потерял?