Совпадающие линии

У меня есть класс 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 или очень, очень близко к нему (для обработки ошибок округления), линии совпадают. Это все еще не помогает мне определить, что делать с этой информацией?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]