我有2个点的坐标(x,y)。我想建立第三个点,使这3个点成为等边三角形。
如何计算第三点?
谢谢
答案 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)