Пересечение между линиями работает только на одной стороне - PullRequest
0 голосов
/ 23 мая 2019

Я создаю движок лучевого вещания на javascript, используя p5js, и существует проблема с пересечением между линиями (лучевая передача к стене).

Я нашел много алгоритмов межстрочного сравнения, включая библиотеку столкновений p5, но проблема возникает в каждом из них.

   this.intersects = function (raycastStart, raycastEnd) {
        var x1 = this.startPoint.x;  //Start point is the first point of a line.
        var y1 = this.startPoint.y;
        var x2 = this.endPoint.x;  //End point is the second point of a line.
        var y2 = this.endPoint.y;
        var x3 = raycastStart.x;
        var y3 = raycastStart.y;
        var x4 = raycastEnd.x;
        var y4 = raycastEnd.y;

        var a_dx = x2 - x1;
        var a_dy = y2 - y1;
        var b_dx = x4 - x3;
        var b_dy = y4 - y3;
        var s = (-a_dy * (x1 - x3) + a_dx * (y1 - y3)) / (-b_dx * a_dy + a_dx * b_dy);
        var t = (+b_dx * (y1 - y3) - b_dy * (x1 - x3)) / (-b_dx * a_dy + a_dx * b_dy);

        //Vector2 is simply class with two fields: x and y.
        return (s >= 0 && s <= 1 && t >= 0 && t <= 1) ? new Vector2(x1 + t * a_dx, y1 + t * a_dy) : null;
    }

Столкновение между линиями работает с одной стороны правильно, а с другой - некорректно, в соответствии с моей позицией y.

map
Это моя карта.

one side
с одной стороны он отлично работает

other side 1 other side 2
но с другой стороны, он проверяет столкновение для отрезков, которые ниже моей позиции Y

1 Ответ

0 голосов
/ 27 мая 2019

(я бы прокомментировал, но у меня недостаточно репутации для этого ...)

Похоже, что ваш алгоритм столкновения строк работает. Но то, что, по-видимому, отсутствует, это проверка, чтобы определить, какое пересечение между лучом и линией ближе. То есть в вашем рабочем примере raycast никогда не проходит через два отрезка, так что нет никаких сомнений относительно того, какой отрезок линии ограничивает ваш raycast. Но в вашем нерабочем примере raycaster попадает в 2 из 4 ваших сегментов, поэтому вам нужно определить, какая из 2 точек пересечения ближе к началу raycast, чтобы определить, какой сегмент линии ближе.

...