簡體   English   中英

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

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM