У меня есть большой граф ребер и вершин в 2D-пространстве. Большой график возвращается функцией, вычисленной в библиотеке C ++. Я читаю этот график и использую его для вычисления всех пересечений его ребер (сегментов линий). Я использую алгоритм развертки. У меня есть проблемы с обнаружением пересечения двух ребер. У меня есть 4 разных метода, в соответствии с которыми я проверяю, пересекаются ли два ребра, и если да, я вычисляю и сохраняю их пересечение:
Тот, который проверяет, являются ли два края диагоналями многоугольника. то есть координаты ребер одной линии, вставленные в уравнение другой линии, имеют разные знаки.
Тот, который вычисляет пересечение каждый раз и проверяет, находится ли найденное пересечение между конечными точками обоих сегментов.
Код из этой ссылки реализован. хотя в C ++.
Тот, который реализует первый метод, предложенный Джейсоном Коэном ín этот вопрос.
«Проблема сводится к следующему вопросу: пересекаются ли две прямые от A до B и от C до D? Тогда вы можете задать его четыре раза (между линией и каждой из четырех сторон прямоугольника).
Вот векторная математика для этого. Я предполагаю, что линия от A до B - это рассматриваемая линия, а линия от C до D - одна из линий прямоугольника. Я считаю, что Ax - это «координата x точки A», а Cy - «координата y точки C.» А «*» означает скалярное произведение, например:
A*B = Ax*Bx + Ay*By.
E = B-A = ( Bx-Ax, By-Ay )
F = D-C = ( Dx-Cx, Dy-Cy )
P = ( -Ey, Ex )
h = ( (A-C) * P ) / ( F * P )
Это число h является ключевым. Если h находится между 0 и 1, линии пересекаются, в противном случае - нет. Если F P равно нулю, вы, конечно, не можете произвести расчет, но в этом случае линии параллельны и, следовательно, пересекаются только в очевидных случаях. Точная точка пересечения - C + F h. Если h точно 0 или 1, линии соприкасаются в конечной точке. Можете считать это «перекрестком» или нет, как считаете нужным ».
Для данных, которые я создал (небольшие данные с двойными значениями), я получил хорошие результаты со всеми 4 реализованными методами. Когда я использую любой из этих методов, реализованных на C ++, для данных из большого графа, я получаю каждый раз разные результаты и не очень хорошие:
метод возвращает гораздо больше пересечений, которые мне нужны (все точки находятся на графике), но я получаю слишком много точек.
Я всегда получаю 0 пересечений, несмотря ни на что.
Я получаю намного больше пересечений, чем в 1.
Для некоторых примеров я получаю точки, которых нет на графике (то есть даже не пересечение). Но для некоторых примеров я получаю точки пересечения плюс некоторые другие точки.
Понятия не имею, в чем может быть проблема. Любые предложения или любые другие идеи о том, как вычислить пересечение и проверить его, более того, скорее, чем приветствуются. спасибо, мадалина