[英]How to find coordinates of a 2d equilateral triangle in C?
我有2個點的坐標(x,y)。 我想建立第三個點,使這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;
}
您可以先將第二個點旋轉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;
讓我們調用你的兩個點A和B. Bisect AB,調用這一點C.找到AB的斜率(Y A -Y B / X A -X B ),稱之為m。 找到與之垂直(-1 / m)並將其稱為m 2 。 然后在斜率m 2處計算長度為sin(60)*長度(AB)的段CD(將存在兩個這樣的點,AB的每一側一個)。 然后ABD是你的等邊三角形。
顯然,這是一種“建設性”的方法。 你也應該能夠通過求解一組線性方程來做到這一點。 我沒有嘗試為這種情況找出正確的方程組,但這種方法在數值上往往更穩定,並且具有更少的特殊情況(例如,對於建設性版本,必須處理0的斜率)特別)。
對於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。
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.