2009-05-28 5 views
8

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

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

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

+1

Возможно, вам потребуется немного конкретнее о том, чего вы пытаетесь достичь ...какой ответ вы ожидаете, например, если кривая Безье образует цикл? – jerryjvl

+0

Я хочу переместить объект по траектории кривой Безье. Если его текущая позиция находится на левой стороне кривой, я меняю направление вправо и наоборот. –

+0

Обратите внимание, что кривые Безье могут определенно формировать циклы ... если вы пересекаете управляющие вершины относительно конечных точек, например. имеют четыре вершины в порядке: (0, 0), (100, 100), (100, 0), (0, 100) должны делать трюк. – jerryjvl

ответ

5

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

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

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

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

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

Было бы легче нарисовать;)

+0

Я нашел решение в Graphic Gems: решение проблемы ближайшей точки по кривой Schneider, Philip J. Благодарим вас за рассказывая мне о Graphic Gems ;;) –

0

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

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

1

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

0

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

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

+0

Начиная с этой фотографии http://www.moshplant.com/direct-or/bezier/curve01.gif Я хочу знать, находится ли точка с левой или с правой стороны кривой. Конечно, есть несколько случаев, и некоторые из них, где нет правой или левой стороны. Но для примера я рассматриваю только случай кривой из изображения. Ответ jerryjvl кажется достаточно хорошим, но я хочу знать производительность этого алгоритма. Или если есть лучший алгоритм. Извините за то, что вы так бессвязны :(Английский язык не мой первый язык –

+0

мой нигде! Soy venezolano! – coma

1

Here is math для кубической и квадратичной кривой Безье implicitization.

Смежные вопросы