Функция пересечения 2D Line Line не работает - PullRequest
1 голос
/ 24 апреля 2020

У меня есть функция пересечения 2D-линия-линия (бесконечные линии). Каждая линия определяется двумя точками и интерпретируется как бесконечные линии, а не отрезки.

Но, похоже, она не находит правильную точку пересечения. Не знаю, где я иду не так, я интерпретировал математику из Википедии.

Моя функция:

//https://en.m.wikipedia.org/wiki/Line%E2%80%93line_intersection#Given_two_points_on_each_line
public static bool LineLineIntersectionInfinite(Vector2 line1Point1, Vector2 line1Point2, Vector2 line2Point1, Vector2 line2Point2, out Vector2 intersectionPoint)
{
    // define the out parameter
    intersectionPoint = Vector2.zero;

    //1 = line1Point1
    //2 = line1Point2
    //3 = line2Point1
    //4 = line2Point2

    var x1 = line1Point1.x;
    var x2 = line1Point2.x;
    var x3 = line2Point1.x;
    var x4 = line2Point2.x;

    var y1 = line1Point1.y;
    var y2 = line1Point2.y;
    var y3 = line2Point1.y;
    var y4 = line2Point2.y;

    var x1Minusx2 = x1 - x2;
    var x3Minusx4 = x3 - x4;
    var y1Minusy2 = y1 - y2;
    var y3Minusy4 = y3 - y4;

    var denominator = x1Minusx2 * y3Minusy4 - y1Minusy2 * x3Minusx4;

    if (Mathf.Approximately(denominator, 0)) return false;

    var a = (x1 * y2 - y1 * x2);
    var b = (x3 * y4 - y3 * x4);
    var ax3MinusX4 = a * x3Minusx4;

    //x
    var numerator = ax3MinusX4 - x1Minusx2 * b;
    var x = numerator / denominator;

    //y
    numerator = ax3MinusX4 - y1Minusy2 * b;
    var y = numerator / denominator;

    intersectionPoint = new Vector2(x, y);

    return true;
}

Как вы можете видеть из этого изображения - точка пересечения не рассчитывается правильно :

enter image description here

Данные испытаний:

line1point1 = (2.6, -1.4)
line1point2 = (3.6,-1.3)

line2point1 = (3.5,2.0)
line2point2 = (3.9,1.1)

Gives intersection result: (5.1,1.0)

Где я здесь ошибаюсь?

1 Ответ

0 голосов
/ 24 апреля 2020

Во-первых, числитель для y неверен - это должно быть что-то вроде numerator = ay3Minusy4 - y1Minusy2 * b;.

Во-вторых, правильный ответ приблизительно равен (4.908511, -1.16915) для баллов, которые вы нам дали (см. [1]). Ваш код на самом деле правильный для x - я дословно поместил его в Excel и получил 4.908511, как и ожидалось, поэтому я не знаю, что там происходит. Это длинный выстрел, но что за тип var выше? Это какой-то объект со странными арифметическими перегрузками вместо float или double?

Значения моих промежуточных переменных, которые помогут вам отладить:

x1Minusx2 == -1.00

x3Minusx4 == -0,40

y1Minusy2 == -0,10

y3Minusy4 == 0,90

denominator == - 0,94

a == 1,66

b == -3,95

ax3MinusX4 == -0,664

numerX == -4.614

x == 4.908510638

ay3minusy4 == 1.494

numerY == 1.099

y == - 1.169148936

[1] https://www.wolframalpha.com/input/?i=intersection+of+line+passing+through+%282.6%2C+-1.4%29+and+%283.6%2C-1.3%29+with+the+line+passing+through+%283.5%2C2.0%29+and+%283.9%2C1.1%29

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...