У меня есть координаты (x, y) 2 точек. Я хочу создать третью точку так, чтобы эти 3 точки сделали равносторонний треугольник.
Как я могу вычислить третью точку?
Спасибо
Прочитав сообщения (особенно vkit), я создал этот простой фрагмент кода, который будет работать в одном направлении (помните, что есть два момента). Модификация для другого случая должна быть тривиальной.
#include<stdio.h>
#include<math.h>
typedef struct{
double x;
double y;
} Point;
Point vertex(Point p1, Point p2){
double s60 = sin(60 * M_PI / 180.0);
double c60 = cos(60 * M_PI / 180.0);
Point v = {
c60 * (p1.x - p2.x) - s60 * (p1.y - p2.y) + p2.x,
s60 * (p1.x - p2.x) + c60 * (p1.y - p2.y) + p2.y
};
return v;
}
Назовем ваши две точки A и B. Разделите пополам AB, назовите эту точку C. Найдите наклон AB (Y A -Y B ] / X A -X B ), назовите это m. Найдите перпендикуляр к нему (-1 / m) и назовите его m 2 . Затем вычислите отрезок CD, длина которого равна sin (60) * длина (AB), с наклоном m 2 (таких точек будет две, по одной с каждой стороны от AB). ABD - тогда ваш равносторонний треугольник.
Это, очевидно, «конструктивный» метод. Вы также должны уметь это делать, решая набор линейных уравнений. Я не пытался найти правильную систему уравнений для этого случая, но этот подход имеет тенденцию быть несколько более стабильным в численном отношении и имеет меньше особых случаев (например, в конструктивной версии необходимо учитывать наклон 0. специально).
Для задания BlueRaja перейдите в конец сообщения:
Ответ с использованием перевода и поворота:
Говорит, что точки - это P (x1, y1) и Q (x2, y2).
Поскольку это графика, вы можете использовать трансформации, чтобы понять суть.
Сначала переместите оси так, чтобы P было началом координат. Затем поверните Q вокруг P на 60 градусов (или -60, чтобы получить другую возможную точку).
Это дает вам координаты третьей точки, скажем R, когда P - начало координат.
Переведите обратно, и готово.
Вы можете использовать стандартный графический API, который позаботится о точности и т. Д. За вас. Никаких головных болей.
Конечно, вы можете посчитать и на самом деле придумать формулу и использовать ее, и это может быть быстрее, но тогда вопрос может быть закрыт как не по теме; -)
Чтобы принять вызов BlueRaja: Вот это метод, в котором не используется тригонометрия.
Даны точки P (x1, y1) и Q (x2, y2) Скажем, точка, которую нам нужно найти (R), это (x3, y3).
Пусть T - середина PQ.
Нам известна площадь треугольника PQR (поскольку он равносторонний и нам известна сторона)
, и нам известна площадь треугольника PRT (1/2 предыдущей площади).
Теперь площадь треугольника может быть записана как определитель, имеющий координаты как записи:
2*Area = |D|
where
| 1 x1 y1|
D = | 1 x2 y2|
| 1 x3 y3|
У нас есть два таких уравнения (которые являются линейными), решите относительно x3 и y3.
Можно повернуть вторую точку на 60° вокруг первой, чтобы найти местоположение третьей точки.
Что-то вроде этого:
//find offset from point 1 to 2 dX = x2 - x1; dY = y2 - y1; //rotate and add to point 1 to find point 3 x3 = (cos(60°) * dX - sin(60°) * dY) + x1; y3 = (sin(60°) * dX + cos(60°) * dY) + y1;