Почему этот код пересечения линии не работает? - PullRequest
2 голосов
/ 15 марта 2012

У меня есть следующий код для определения пересечения двух 2D линий.Это не работает, и я не уверен, почему;Я копировал код из нескольких источников без особых изменений.

Линии бесконечно расширяются от заданной средней точки."Vector ()", на который ссылается приведенный ниже код, представляет собой двухмерный вектор величиной 1,0, который указывает направление, в котором проходит линия (линия также проходит в отрицательном направлении, это не луч).

РанееЯ использовал этот метод для определения пересечения: Точка пересечения двух линий (2 измерения)

После того, как это дало мне неправильные результаты, я пошел с методом в Википедии.

float x1 = line1.location().x();
float y1 = line1.location().y();
float x2 = x1 + line1.vector().x();
float y2 = y1 + line1.vector().y();

float x3 = line2.location().x();
float y3 = line2.location().y();
float x4 = x3 + line2.vector().x();
float y4 = y3 + line2.vector().y();

float d = ((x1 - x2) * (y3 - y4)) - ((y1 - y2) * (x3 - x4));
if(d == 0) // If parallel, defaults to the average location of the lines.
    return new Vector2f((x1 + x3) * 0.5f, (y1 + y3) * 0.5f);
else
{
    float a = (x1 * y2) - (y1 * x2);
    float b = (x3 * y4) - (y3 * x4);
    return new Vector2f(((a * (x3 - x4)) - ((x1 - x2) * b)) / d, 
                        ((a * (y3 - y4)) - ((y1 - y2) * b)) / d);
}

Два примера того, как это неправильно (оранжевая точка - это возвращаемая точка пересечения): q

Ex 1 Ex 2

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

Как я могу это исправить?


РЕДАКТИРОВАТЬ: На самом деле, этот код работаетштраф;в моем коде визуализации произошла ошибка.

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Как оказалось, код работал;В моем коде визуализации была ошибка.Мой плохой.

0 голосов
/ 15 марта 2012

Полагаю, вы запутались в том, что возвращают методы location () и vector ().Если я не ошибаюсь, location (). X () дает вам точку на линии, созданной вектором, в то время как vector (). X () дает вам величину значения x вектора.(например, горизонталь имеет вектор (). y () = 0)

Вы добавляете величину вектора к начальной точке.Вместо этого попробуйте умножить начальную точку на величину

float x2 = x1 * line1.vector().x();
float y2 = y1 * line1.vector().y();
...