【问题标题】:How to find coordinates of a 2d equilateral triangle in C?如何在C中找到二维等边三角形的坐标?
【发布时间】:2010-05-18 23:34:07
【问题描述】:

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

如何计算第三点?

谢谢

【问题讨论】:

  • 仅供参考:有两个这样的点。
  • 我相信有两个点可以与任意两个给定点组成一个等边三角形。
  • 如果两个点的x坐标相同,则没有“上点”。
  • 注意有两个这样的点('up' 和 'down')
  • 第一个在没有触发函数的情况下做到这一点的人得到了我的支持 :)

标签: c math geometry 2d trigonometry


【解决方案1】:

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

【讨论】:

  • 我也是这么说的!而且我没有放任何明确的代码是有原因的:图形 API 可以比我们自己希望做的更好(精度、三角计算等)进行旋转(和平移)。由于我们不知道 OP 正在使用的 API,我们所能做的就是提及要做什么。哦,好吧...
【解决方案2】:

您可以先将第二个点旋转 60° 以找到第三个点的位置。

类似这样的:

//找到从点1到2的偏移量 dX = x2 - x1; dY = y2 - y1; //旋转并添加到点1以找到点3 x3 = (cos(60°) * dX - sin(60°) * dY) + x1; y3 = (sin(60°) * dX + cos(60°) * dY) + y1;

【讨论】:

  • 难道不是[cos(60) sin(60); -sin(60) cos(60)]?我认为你的迹象是错误的。
  • 我认为这些迹象是正确的。另见:stackoverflow.com/questions/786472/rotate-a-point-by-an-angle
  • @arrieta 刚刚尝试过,如果您按照建议使用标志,它会以另一种方式(顺时针/逆时针)旋转该点,因此取决于您的坐标系的设置方式,一个或另一个可能更有意义。
【解决方案3】:

让我们称你的两个点为 A 和 B。平分 AB,称此点为 C。求 AB 的斜率 (YA-YB / X A-XB),称它为m。找到它的垂线 (-1/m) 并将其命名为 m2。然后在斜率 m2 处计算长度为 sin(60) * length(AB) 的线段 CD(将有两个这样的点,AB 的每一侧各有一个)。那么 ABD 就是你的等边三角形。

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

【讨论】:

    【解决方案4】:

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


    使用平移和旋转回答:

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

    因为是图形,所以可以用变换来理解。

    首先平移轴,所以 P 是原点。 接下来将 Q 围绕 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。

    【讨论】:

    • 很好,我认为这应该可行。我在想一些更简单的事情:因为我们知道 R 并且我们知道三角形的高度(每一半是一个 30-60-90 的三角形),我们可以简单地在 R 处放置一个法线向量并将其扩展高度。跨度>
    • @BlueRaja:是的,这也有效,因为找到法线不需要涉及三角函数。我想完全避免使用任何角度的概念,因此很复杂......
    • 如果你有(x1, y1)(x2, y2),正常的就是(-(y2-y1), (x2-x1))/length。确定长度很简单,但在这种情况下甚至无关紧要,因为它抵消了最终方程。
    • @BlueRaja:是的,我对此没有异议。我要说的是,我开始思考“没有角度......没有角度......”并设法使事情复杂化:-)
    【解决方案5】:
    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)
    

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 2013-09-10
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      相关资源
      最近更新 更多