Нахождение координаты крайней точки после увеличения отрезка JS Konva

Я новичок в 2d. Вопрос такой. Есть многоугольник, состоящий из точек A, B ... n. Есть координаты этих точек. Многоугольник разбит на отрезки AB, BC ... Есть длины этих отрезков. Реализую функцию изменения длины этих отрезков многоугольника. Допустим нужно увеличить отрезок AB на n, сместить точку B и определить новые координаты B. Направления отрезков не изменяются. Для решения задачи использовал прямую и обратную геодезическую задачи. http://sitegeodesy.com/prgeozadacha.html На основании обратной геодезической задачи вычислял дирекционный угол.

    const onChangeLength = (el: any, i: number, inc: boolean, deltaD: number) => {
        if (points.length) {
            const left = points[i];
            const right = points[i + 1] ? points[i + 1] : points[0];
            const vector = [];

            vector[0] = right[0] - left[0];
            vector[1] = right[1] - left[1];
            const r = Math.atan(vector[1] / vector[0]);

            let alfa = 0;
            if (vector[0] >= 0 && vector[1] > 0) alfa = r;
            if (vector[0] < 0 && vector[1] >= 0) alfa = 180 - r;
            if (vector[0] >= 0 && vector[1] < 0) alfa = r;
            if (vector[0] < 0 && vector[1] < 0) alfa = 180 + r;


            const newLength = inc ? lines[i] + deltaD : lines[i] - deltaD;

            const newX = points[i][0] + newLength * Math.cos(alfa);
            const newY = points[i][1] + newLength * Math.sin(alfa);

            const newPointArr = [...points];
            if (points[i + 1]) {
                newPointArr[i + 1] = [newX, newY];
                setPoints(newPointArr);
            } else {
                newPointArr[0] = [newX, newY];
                setPoints(newPointArr);
            }
        }
    };

Функция вычисляет координаты верно только в случаях:

if (vector[0] >= 0 && vector[1] > 0) alfa = r;

if (vector[0] >= 0 && vector[1] < 0) alfa = r;

в остальных дальнейший расчет расстояний верный, но положение точки ведет себя не верно. Подскажите пожалуйста применим ли вообще этот подход для решения задачи. Если нет, то как проще сделать? Если да, то в чем ошибка и как быть если vector[0] или deltaX = 0, Так как деление на ноль даст бесконечность?


Ответы (1 шт):

Автор решения: MBo

Отрезок AB задает вектор

ab.x = b.x - a.x
ab.y = b.y - a.y

Его длина

ablen = Math.hypot(ab.x, ab.y)

Увеличение длины вектора на d даёт новое положение точки B'

b'.x = a.x + ab.x / ablen * (ablen + d)
b'.y = a.y + ab.y / ablen * (ablen + d)
→ Ссылка