Мое первое наблюдение по поводу этой проблемы состоит в том, что прямоугольник (выровненный по осям) - это простой вырожденный случай. Если два угла этого прямоугольника: (x1, y1) и (x2, y2), то вы просто проверяете, учитывая точку (x3, y3), что min (x1, x2)
Это также может быть полезной оптимизацией. Если мы найдем выровненный по оси ограничивающий прямоугольник нашего параллелограмма, тогда мы можем начать с быстрой проверки любой заданной точки против этого.
Если наши параллели имеют ненулевой наклон, то мы вычисляем пересечения осей наших ограничительных линий и пересечения линий, которые проходили бы через указанную точку на этих склонах. Если оба пересечения нашей точки (определяемые обоими наклонами) лежат между нашими пересечениями наших ограничительных линий, то мы находимся. Если что-либо из этого выходит за эти диапазоны, то мы не находимся.
У меня нет времени на написание примера, но вычисление этих уклонов и пересечений - это алгебра первого года.
[Addenda]
Теперь я вижу, что первый пост (относительно луча из тестируемой точки и простирающегося вдоль любого произвольного наклона) является ссылкой на общее решение этой проблемы для любого замкнутого плоского многоугольника ... или, фактически, для любая замкнутая плоская кривая. Он также может быть расширен до трех измерений для закрытых поверхностей.
Однако есть одна оговорка, которая применима как к параллелограммам, так и к ромбоидам. В случае вогнутого многоугольника (или некоторых других кривых), если луч достигает любой вершины (угла), возможно, что тест вернет четное число пересечений «линии». Другими словами, любая часть «кривой», которая одновременно включена в несколько «сторон» многоугольника, может возвращать ложное срабатывание.
Это может быть два решения: явно проверить наличие пересечений на границах отрезка (угол / вершина) или обработать каждый отрезок как ограниченный на одном конце с помощью (точка + эпсилон) (так что наши вычисления не найдут никакой точки) общего между любыми двумя сторонами).
Моя идея найти ограничивающий прямоугольник все еще является полезным быстрым тестом и распространяется в основном на все многоугольники. Мы находим min () и max () x, чтобы найти левую и правую граничные стороны, и min () и и max () y, чтобы найти нижнюю и верхнюю границы. Это также может быть расширено до трех измерений ... и мой друг говорит, что стандартные графические библиотеки широко используют это для обнаружения столкновений в большинстве виртуальных реальностей, MMORPG и т. Д. Когда находят столкновения в ограничивающих прямоугольниках, они выполняют более детальные вычисления. на многоугольниках, которые там содержатся.