Обнаружение местоположения одной точки по сравнению с двумя другими точками - PullRequest
2 голосов
/ 28 марта 2010

РЕДАКТИРОВАТЬ Я ищу один или два лайнера, которые делают то, что предлагает ответ с большим количеством голосов.

Мне нужно решить небольшую проблему в очень реальном программном обеспечении, и я ищу простой способ ее решения.

У меня есть две фиксированные точки на экране (они фиксированные, но я заранее не знаю их положение), которые не находятся в одном месте. Эти две неподвижные точки образуют воображаемую линию. Теперь у меня есть третья точка, которая находится «на одной стороне» этой линии (она не может быть на линии). Пользователь может захватить точку (пользователь фактически захватывает объект, который я отслеживаю, по его центру, который представляет собой интересующую меня точку) и перетащить его. Но он не может «пересечь» воображаемую линию. Как проще всего определить, пересекает ли пользователь воображаемую линию?

Баллов может быть:

a[] = new int { 30, 50};
b[] = new int { 0, 100 };
c[] = new int { 20, 22 };

Примеры (не соответствующие пунктам выше):

      /
     a
c   /
   /    
  /   (c cannot be dragged here) 
 b
/

Или:

         c
---b--------------c--- -- -- -- - -
(c cannot be dragged here)

Так что же легко определить, если c находится на правильной «стороне» линии (я рисую здесь сегменты, но это действительно можно рассматривать как линию)?

Один из способов обнаружить это - взять точку назначения d и посмотреть, пересекается ли отрезок (c, d) с линией (a, b), но разве нет более простого пути? Разве я не могу просто сделать здесь магию 2D-точечного продукта, и мне понадобится один или два лайнера для решения моей проблемы?

1 Ответ

8 голосов
/ 28 марта 2010

Вы можете использовать знак Z-компонента перекрестного произведения AB x AC (неявно принимая Z-компоненты A & B за 0) в качестве индикатора того, какая сторона точки AB сегмента C в настоящее время включена. Когда этот знак изменяется, сопротивление пересекает или пересекает сегмент AB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...