Как рассчитать координаты третьей точки в треугольнике (2D), зная координаты 2 точек, все длины и все углы [закрыто]

У меня есть треугольник, и я знаю координаты двух вершин: A = (x1, y1), B = (x2, y2) Все углы: ABC = 90 & # x2218;, CAB = 30 & # x2218; и BCA = 60 & # x2218; и все длины ребер. Как я могу найти координаты третьей вершины C = (x3, y3)?

Я знаю, что есть два решения (я хочу оба).

 Pang10 мая 2017 г., 05:54
Я голосую, чтобы закрыть этот вопрос как не по теме, потому что онMathematics вместо программирования или разработки программного обеспечения.
 Phillip Schmidt15 июн. 2012 г., 16:39
@ user1454749 здесь закон синусов бесполезен. она / он уже знает все углы и длины сторон
 QuantumMechanic15 июн. 2012 г., 16:34
Просто нарисуйте схему. Очевидно, что существует два решения. C может быть выше или ниже линии между A и B.
 javajavajava15 июн. 2012 г., 16:34
Закон синусов должен работать.en.wikipedia.org/wiki/Law_of_sines
 jrturton15 июн. 2012 г., 16:33
Вы знаете, что есть два решения, но вы не знаете, что они?

Ответы на вопрос(4)

You know p1 and p2. You know the internal angles. Make a ray from p1 trough p2, and rotate it CW or CCW 30° around p1. Make a line trough p1 and p2, and rotate it 90° around p2. Calculate the intersections.

Вы получаете очки:

x3 = x2 + s*(y1 - y2)
y3 = y2 + s*(x2 - x1)

а также

x3 = x2 + s*(y2 - y1)
y3 = y2 + s*(x1 - x2)

гдеs = 1/sqrt(3) ≈ 0.577350269

Это прямоугольный треугольник. Угол ABC равен 90 градусам, поэтому вычислите вектор, соединяющий А и В, назовите этот АА и нормализуйте его:

 AA = (x2-x1,y2-y1) / |(x2-x1,y2-y1)|

Единичный вектор, перпендикулярныйAA дан кем-то

 BB = (-(y2-y1),x2-x1) / |(x2-x1,y2-y1)|

Поскольку AC перпендикулярен AB, все, что вы можете получить свой первый баллP1 как

 P1 = (x2,y2) + K * BB

где K - скалярное значение, равное длине стороны AC (которую, как вы говорите, вы уже знаете в вопросе). Ваше второе решениеP2 затем просто дается, входя в отрицательныйBB направление

 P2 = (x2,y2) - K * BB

В прямоугольном треугольнике 30-60-90 наименьшая нога (наименьшая сторона, примыкающая к углу 90 градусов) имеет длину 1/2 гипотенузы (сторона, противоположная углу 90 градусов), поэтому, поскольку у вас есть длины сторон, вы Можно определить, какой ногой является отрезок линии AB.

Из этого вы выводите, куда идут углы.

Затем, чтобы вычислить координату, вам просто нужно выбрать точку на окружности радиуса с правильной длиной радиуса под правильным углом.

Два решения приходят из измерения угла по часовой стрелке или против часовой стрелки, и в результате получают симметричные треугольники с ребром AB, являющимся линией симметрии.

Поскольку вы уже задали углы, вычислите длину AB по квадратной формуле

L (AB) = Sqrt [(x1-x2) ^ 2 + (y1-y2) ^ 2].

Теперь пусть x = L (AC) = 2 * L (BC), так как это прямоугольный треугольник,

L (AC) ^ 2 = L (BC) ^ 2 + L (AB) ^ 2,

x ^ 2 = (0,5x) ^ 2 + L (AB) ^ 2, поэтому L (AB) = x * Sqrt [3] / 2, и так как вы уже вычислили L (AB), теперь у вас есть х.

Угол исходного AB равен a = arctan ([y2-y1] / [x2-x1]). Теперь вы можете измерить 30 градусов вверх или вниз (используйте + 30 или -30 по желанию) и отметьте точку C на окружности (в центре A) радиуса x (которую мы вычислили выше) под углом +/- 30.

Тогда C имеет координаты

x3 = x1 + x * cos (a + 30)

у3 = у1 + х * грех (а + 30)

или вы можете использовать (a-30), чтобы получить симметричный треугольник.

 15 июн. 2012 г., 16:55
только что сделал некоторые исправления, исправляющие опечатки и форматирование.
 15 июн. 2012 г., 16:51
Я неправильно понял вопрос, извините. Сделали необходимые правки.
 Daniel Dudas15 июн. 2012 г., 16:44
Я знаю, где находится точка, если мне нужно нарисовать, но я хочу знать формулу для x3 = ... и y3 = ..., чтобы определить точные координаты точек. Мне нужно это в программе (код) не только для 1 проблемы

Вот код для возврата точек полного многоугольника, если в качестве входных данных указаны две точки и количество сторон. Это написано для Android (Java) и логика может быть повторно использована для других языков

private static final float angleBetweenPoints(PointF a, PointF b) {
    float deltaY = b.y - a.y;
    float deltaX = b.x - a.x;
    return (float) (Math.atan2(deltaY, deltaX));

}
private static PointF pullPointReferenceToLineWithAngle(PointF a, PointF b,
        float angle) {

    float angleBetween = angleBetweenPoints(b, a);
    float distance = (float) Math.hypot(b.x - a.x, b.y - a.y);
    float x = (float) (b.x + (distance * Math.cos((angleBetween + angle))));
    float y = (float) (b.y + (distance * Math.sin((angleBetween + angle))));
    return new PointF(x, y);
}

private static List<PointF> pullPolygonPointsFromBasePoints(PointF a,
        PointF b, int noOfSides) {
    List<PointF> points = new ArrayList<>();
    points.add(a);
    points.add(b);
    if (noOfSides < 3) {
        return points;
    }
    float angleBetweenTwoSides = (float) ((((noOfSides - 2) * 180) / noOfSides)
            * Math.PI / 180);
    for (int i = 3; i <= noOfSides; i++) {
        PointF nextPoint = pullPointReferenceToLineWithAngle(
                points.get(i - 3), points.get(i - 2), angleBetweenTwoSides);
        points.add(nextPoint);
    }
    return points;
}

Usage is onDraw method:

PointF a = new PointF(100, 600);
    PointF b = new PointF(300, 500);
    int noOfSides = 3;

    List<PointF> polygonPoints = pullPolygonPointsFromBasePoints(a, b,
            noOfSides);

    drawPolyPoints(canvas, noOfSides, polygonPoints);

Ваш ответ на вопрос