给出中心绘制等边三角形

Gau*_*tam 10 language-agnostic drawing shape

如果中心为cxcy 质心圆的半径,我如何绘制等边三角形?

如何找到一个点是否在三角形内?

在此输入图像描述

PS:我正在构建这个android,但这个问题与语言无关.

Xan*_*tix 13

第一个问题

上图中的C点很简单,只是(cx,cy + r).

我可以想到两个相当简单的方法来获得点a和b:

第一种方法:假设(cx,cy)是原点并将C点旋转60度和120度以获得a和b.这可以通过以下公式实现:

  • bx = cx*cos(120度) - (cy*sin(120度))
  • by = cx*sin(120度)+(cy*cos(120度))
  • ax = cx*cos(240度) - (cy*sin(240度))
  • ay = cx*sin(240度)+(cy*cos(240度))

另请参阅维基百科上的这篇文章.

第二种方法:绘制一条穿过(cx,cy)并具有-30度斜率的线.该线与圆相交的位置为b点.圆由以下等式定义:

 ( x - c.x )^2 + ( y - c.y )^2 = r^2 
Run Code Online (Sandbox Code Playgroud)

(注意,将有两个交叉点,因此请选择正确的交叉点).

然后通过(cx,cy)以正30度角线进行相同操作以得到点a.

你的线会有斜率:1/sqrt(3)和-1/sqrt(3)

对于你的第二个问题

一旦得到形成等边三角形的点A,B和C,检测点(x,y)是否位于三角形中的最快和最简单的方法之一是基于叉积和向量.

基本上,看看(x,y)是否在"向量"A-> B的左侧.然后看看它是否在B-> C的左边.然后检查它是否在C-> A的左边.

这里引用的以下方法可以检查点是否在向量的左侧.

public bool isLeft(Point A, Point B, Point C){
    return ((B.x - A.x)*(C.y - A.y) - (B.y - A.y)*( C.x - A.x)) > 0;
}
Run Code Online (Sandbox Code Playgroud)

在方法A = line point1,b = line point2,c =指向要检查的点.


Rob*_*ert 11

对于只想要单位圆上等边三角形坐标的懒惰人(像我一样):

A: (-0.866, -0.5)
B: (0.866, -0.5)
C: (0.0, 1.0)
Run Code Online (Sandbox Code Playgroud)

对于不同的位置和/或半径,由乘法值r,然后添加cxx坐标和cyy秒。

  • 最简单的解决方案。:) (2认同)