Как найти координаты 2d равностороннего треугольника в C? - PullRequest
6 голосов
/ 19 мая 2010

У меня есть координаты (x, y) из 2 точек. Я хочу построить третью точку так, чтобы эти три точки составляли равносторонний треугольник.

Как рассчитать третью точку?

Спасибо

Ответы [ 5 ]

9 голосов
/ 19 мая 2010

После прочтения постов (особенно vkit's) я создал этот простой кусок кода, который сделает трюк для одного направления (помните, что есть две точки). Модификация для другого случая должна быть тривиальной.

#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;
}
8 голосов
/ 19 мая 2010

Вы можете повернуть вторую точку на 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;
4 голосов
/ 19 мая 2010

Для вызова BlueRaja перейдите к концу сообщения:


Ответ с использованием перевода и ротации:

Говорит, что точки - это P (x1, y1) и Q (x2, y2).

Так как это графика, вы можете использовать transforms, чтобы получить точку.

Сначала переведите оси так, чтобы 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.

4 голосов
/ 19 мая 2010

Давайте назовем ваши две точки 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).Тогда АБД - это ваш равносторонний треугольник.

Это, очевидно, "конструктивный" метод.Вы также должны быть в состоянии сделать это путем решения системы линейных уравнений.Я не пытался выяснить правильную систему уравнений для этого случая, но этот подход имеет тенденцию быть несколько более устойчивым численно и имеет меньше особых случаев (например, в конструктивной версии необходимо учитывать наклон 0специально).

0 голосов
/ 27 августа 2013
pc <- c((x1+x2)/2,(y1+y2)/2) #center point
ov <- c(y2-y1,x1-x2) #orthogonal vector
p3 <- pc+sqrt(3/4)*ov #The 3dr point in equilateral triangle (center point + height of triangle*orthogonal vector)
...