расстояние между линией и точкой холста - PullRequest
0 голосов
/ 20 октября 2018

У меня есть верхняя и нижняя линии.Каждая строка состоит из начальной и конечной точек новая строка ( x_start, y_start, x_end, y_end )

Тогда у меня есть прямоугольник с позициями x и y,И любое значение х, я хочу, чтобы получить вертикальное расстояние между верхней и нижней линией.

enter image description here

Моя стратегия заключалась в том, чтобы найти координаты пересечения каждой линии (сверху и снизу) с воображаемой вертикальной линией (x, 0, x, 10)

Я использовал этот код, но он не поддерживает бесконечный наклон.

function lineIntersect(a, b) {
    a.m = (a[0].y - a[1].y) / (a[0].x - a[1].x);  // slope of line 1
    b.m = (b[0].y - b[1].y) / (b[0].x - b[1].x);  // slope of line 2
    return a.m - b.m < Number.EPSILON ? undefined
        : {
            x: (a.m * a[0].x - b.m * b[0].x + b[0].y - a[0].y) / (a.m - b.m),
            y: (a.m * b.m * (b[0].x - a[0].x) + b.m * a[0].y - a.m * b[0].y) / (b.m - a.m)
        };
}

Как этого достичь?

1 Ответ

0 голосов
/ 20 октября 2018

Пересечение линии a=(x0,y0, x1,y1) с вертикальной линией через x=xp - это то же самое, что вычисление координаты y в линии для x == xp.
Когда линия a является вертикальной (x0 = x1), решения не существует (нарисуйте ее и посмотрите, почему).

function getYinLine(a, xp) {
    return Math.abs(a[0].x - a[1].x) < Number.EPSILON ? undefined
        :  a[0].y + (a[1].y - a[0].y) / (a[1].x - a[0].x) * (xp - a[0].x);
}

Поскольку линия a действительно является сегментом, вам также следуетпроверить границы x0 <= xp <= x1

Вертикальное расстояние между двумя линиями - это разница в координате y:

y1 = getYinLine(a, xp);
y2 = getYinLine(b, xp);
if(typeof y1 !== "undefined" && typeof y2 !== "undefined")
    dist = Math.abs(y1-y2);
else
  //do error handling
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...