如何在C中找到2d等边三角形的坐标?

时间:2010-05-18 23:34:08

标签: c math geometry 2d trigonometry

我有2个点的坐标(x,y)。我想建立第三个点,使这3个点成为等边三角形。

如何计算第三点?

谢谢

5 个答案:

答案 0 :(得分:9)

在阅读帖子(特别是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;
}

答案 1 :(得分:7)

您可以先将第二个点旋转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;

答案 2 :(得分:4)

让我们调用你的两个点A和B. Bisect AB,调用这一点C.找到AB的斜率(Y A -Y B / X A -X B ),称之为m。找到垂直于那个(-1 / m)并将其称为m 2 。然后计算长度为sin(60)*长度(AB)的段CD,在斜率m 2 (将有两个这样的点,AB的每一侧一个)。那么ABD就是你的等边三角形。

显然,这是一种“建设性”的方法。你也应该能够通过求解一组线性方程来做到这一点。我没有尝试为这种情况找出正确的方程组,但这种方法在数值上往往更稳定,并且具有更少的特殊情况(例如,对于建设性版本,必须处理0的斜率)特别)。

答案 3 :(得分:4)

对于BlueRaja的挑战,请转到帖子结尾:


使用翻译和轮换答案:

表示点是P(x1,y1)和Q(x2,y2)。

由于它是图形,你可以使用变换来获得重点。

首先转换轴,使P成为原点。 接下来将P绕P旋转60度(或-60以获得另一个可能的点)。

当P为原点时,这将为您提供第三个点的坐标,即R,

翻译回来,你就拥有它。

您可以使用标准图形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 :(得分:0)

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)