Функция Javascript для нахождения третьей точки треугольника, когда известны все стороны, углы и первые две точки - PullRequest
0 голосов
/ 13 ноября 2018

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

Этот вопрос не должен касаться математики.stackexchange, потому что речь идет о коде Javascript, необходимом для завершения функции, которую я начал ниже.

Представьте себе следующий треугольник.

Labeled triangle

Каждая точкаA, B и C имеют координаты x и y, и мы знаем, что это за координаты Ax, Ay, Cx и Cy.Мы также знаем длину a, b и c и угол A, B и C.

Я хочу написать функцию Javascript для вычисления координат x и y точки B, но я действительно изо всех силчтобы преобразовать математику, которую я прочитал, в Javascript.

Вот начало функции, которую я пытаюсь написать:

/**
 * Find the coordinates for the third point of a triangle.
 *
 * @param Ax - x coordinate value of first known point
 * @param Ay - y coordinate value of first known point
 * @param Cx - x coordinate value of second known point
 * @param Cy - y coordinate value of second known point
 * @param a - the length of side a
 * @param b - the length of side b
 * @param c - the length of side c
 * @param A - the angle of corner A in degrees
 * @param B - the angle of corner B in degrees
 * @param C - the angle of corner C in degrees
 * @returns {{Bx: *, By: *}}
 */
function calculate_third_point(Ax, Ay, Cx, Cy, a, b, c, A, B, C) {

    var Bx;
    var By;

    // What code goes here?

    return {Bx: Bx, By: By};
}

Существует закрытый вопрос по stackoverflowздесь , однако принятый ответ, по-видимому, возвращает только одно значение, P3.Но для третьего пункта нам нужны значения x и ay, поэтому я не понимаю этого.

На maths.stackexchange есть вопрос *1024*, но в принятом ответе используются P и Qэто просто появляется из ниоткуда, и математические символы усложняют понимание.Нет четко определенных входов и выходов.

Здесь есть решение javascript , но оно не учитывает координаты x и y первых двух точек.

Может ли кто-нибудь помочь мне, выполнив мою функцию.Решение должно просто использовать предоставленные входные данные.Если какие-либо входные данные не требуются, они могут быть отброшены.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Спасибо MBo за то, что предоставили этот ответ. Я просто поместил его код в функцию и решил проблему с градусами / радианами, и это последняя функция:

/**
 * Find the coordinates for the third point of a triangle.
 *
 * @param Ax - x coordinate value of first known point
 * @param Ay - y coordinate value of first known point
 * @param Cx - x coordinate value of second known point
 * @param Cy - y coordinate value of second known point
 * @param b - the length of side b
 * @param c - the length of side c
 * @param A - the angle of corner A
 * @param alt - set to true to return the alternative solution.
 * @returns {{Bx: *, By: *}}
 */
function calculate_third_point(Ax, Ay, Cx, Cy, b, c, A, alt) {

    var Bx;
    var By;
    alt = typeof alt === 'undefined' ? false : alt;

    //unit vector
    uACx = (Cx - Ax) / b;
    uACy = (Cy - Ay) / b;

    if(alt) {

        //rotated vector
        uABx = uACx * Math.cos(toRadians(A)) - uACy * Math.sin(toRadians(A));
        uABy = uACx * Math.sin(toRadians(A)) + uACy * Math.cos(toRadians(A));

        //B position uses length of edge
        Bx = Ax + c * uABx;
        By = Ay + c * uABy;
    }
    else {
        //vector rotated into another direction
        uABx = uACx * Math.cos(toRadians(A)) + uACy * Math.sin(toRadians(A));
        uABy = - uACx * Math.sin(toRadians(A)) + uACy * Math.cos(toRadians(A));

        //second possible position
        Bx = Ax + c * uABx;
        By = Ay + c * uABy;
    }

    return {Bx: Bx, By: By};
}

/**
 * Convert degrees to radians.
 *
 * @param angle
 * @returns {number}
 */
function toRadians (angle) {
    return angle * (Math.PI / 180);
}

Надеюсь, кто-то еще найдет полезное!

0 голосов
/ 13 ноября 2018

Один из многочисленных вариантов с использованием поворота вектора (не забывайте о радианах и градусах)

 Arad = A * Math.pi/180; //degrees to radians

 //unit vector
 uACx = (Cx - Ax) / b;    
 uACy = (Cy - Ay) / b;

 //rotated vector
 uABx = uACx * Math.cos(Arad) - uACy * Math.sin(Arad);
 uABy = uACx * Math.sin(Arad) + uACy * Math.cos(Arad);

 //B position uses length of edge
 Bx = Ax + c * uABx;
 By = Ay + c * uABy;

 //vector rotated into another direction
 uABx = uACx * Math.cos(Arad) + uACy * Math.sin(Arad);
 uABy = - uACx * Math.sin(Arad) + uACy * Math.cos(Arad);

 //second possible position
 Bx = Ax + c * uABx;
 By = Ay + c * uABy;
...