У меня есть класс LineSegment
с функцией под названием bool LineSegment::intersect(LineSegment &otherLineSegment, Point &intersectionPoint, bool continuous=false)
, Я добавил continuous
параметр, так как мне было лень наследовать от моего LineSegment
класс для создания Line
класс (или наоборот). То, что делает этот аргумент, в основном позволяет проверить пересечение двух отрезков, как отрезка, так и того, что они являются линиями (то есть они бесконечно простираются в обоих направлениях). intersectionPoint
содержит точку пересечения между двумя объектами, если intersect(...)
возвращается true
,
Для выполнения этой проверки я использую предоставленные алгоритмы Вот (для пересечения линии) и Вот (для пересечения отрезка).
Проблема, с которой я столкнулся, заключается в том, что у меня есть два отрезка отрезка, что означает бесконечное число пересечений между ними. Например, давайте возьмем отрезок l1(Point(0, 1), Point(1, 1))
а также l2(Point(-1, 1), Point(2, 1))
, Если мы визуализируем оба мы получаем
[Point(-1, 1)------[(0, 1)------(1, 1)]------Point(2, 1)]
Непрерывная проверка (то есть, если линия пересекается) возвращает true
(с точкой пересечения, являющейся Point(2, 1)
который даже не является частью l2
и прямо противоречит свойству точки пересечения, что она может быть вычислена с использованием уравнения для одной из линий / отрезков) в этом случае, в то время как пересечение отрезка линии возвращает false
,
Как мне справиться с этой ситуацией? Я, конечно, могу проверить оба, и если я получу такое несоответствие, я могу сказать: «Ну, у вас совпадающие строки». Однако это не поможет мне в дальнейшем, так как:
С другой стороны, я также не могу просто позволить этому быть и создавать неопределенное или неправильное поведение в моем коде. Возможным решением было бы проверить угол между двумя векторами (каждая часть соответствующей линии / отрезка) и, если угол равен 0 или очень, очень близко к нему (для обработки ошибок округления), линии совпадают. Это все еще не помогает мне определить, что делать с этой информацией?
Задача ещё не решена.
Других решений пока нет …