Определение стороны линии, учитывая 3-ю точку, указывающую желаемую сторону

Я пытаюсь придумать функцию, которая принимает две точки, используемые для формирования линии, контрольной точки и точки, и выводит True, если точка находится на сформированной линии или

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

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

Редактировать: внутри/снаружи используется просто из-за характера проблемы, кажется лучше, чем «сторона а» и «сторона б» или «левая сторона» и «правая сторона». При этом «внутренние» точки будут игнорироваться, а «внешние» останутся.

Вот пример использования обеих сторон линии:

введите здесь описание изображения

Хотя они квадраты, каждый представляет собой «точку». Красные квадраты - это два, которые составляют линию. Затем есть зеленая и синяя точки. Зеленая точка находится внутри синей точки, а синяя точка находится внутри точки. Они представляют собой внешние точки. Синие кружки обозначают точки, которые считаются внешними. Точки, обведенные синим, считаются внешними точками по отношению к синей точке, а точки, обведенные зеленым, считаются внешними точками по отношению к зеленой точке.


person Nuclearman    schedule 05.12.2012    source источник
comment
Две точки находятся на одной стороне, если они обе находятся на положительной стороне ИЛИ обе на отрицательной стороне.   -  person John Dvorak    schedule 05.12.2012
comment
Придирка, но у линии нет внутренней или внешней стороны. Можете ли вы перефразировать вопрос, чтобы он был более ясным, возможно, с использованием ASCII-арта? (слева и справа от линии также не работают, поскольку у горизонтальной линии нет левого и правого. И линия останавливается в своих двух точках или продолжается до бесконечности?)   -  person    schedule 05.12.2012
comment
Я думаю, что OP хочет сказать, находятся ли две точки («точка» и «опорная точка») на одной стороне линии или нет. Но если это так, то вопрос со ссылкой будет работать — просто проверьте, оба ли находятся слева или оба справа. В качестве альтернативы проверьте пересечение исходной линии и линии, соединяющей две точки (stackoverflow.com/questions/3838329/)   -  person Stuart    schedule 05.12.2012


Ответы (1)


Вы все еще можете использовать перекрестные продукты. Если A и B — точки, определяющие линию, R — опорная точка, а P — контрольная точка, сформируйте два векторных произведения ABxAR и ABxAP. Скалярное произведение этих двух векторов будет положительным, если точки лежат по одну сторону от прямой, и отрицательным, если они не совпадают.

person bogatron    schedule 05.12.2012