您需要指定两件事,半径和第一个三角形指向的方向。
- 半径将是从初始点到第一个三角形顶点的距离。所有三角形都将具有相同的半径。
- 方向是以弧度为单位的一些规范。我将假设 0 表示指向右侧(PI 将指向左侧)。
找到第一个三角形的顶点可以这样完成(伪代码,不是特定于语言的):
float theta = 0; // The direction, 0 means pointing to the right
float thetaInc = TWO_PI/3; // 3 because you want a triangle
for (int i = 0; i < 3; i++) {
vertX[i] = initialPointX+cos(theta)*radius;
vertY[i] = initialPointY+sin(theta)*radius;
theta += thetaInc;
}
有很多方法可以找到相邻三角形的中心点。一种方法是使用相同的代码,但初始化theta = TWO_PI/6
,替换radius
为foo
(参见下面的数学),在 for 循环中分配相邻三角形的新中心点,然后使用具有适当旋转方向(theta += PI
)的相同代码来查找顶点那些三角形。
从一个三角形中心到另一个三角形中心的距离只知道radius
:
- 斜边 =
sqrt(sq(radius)+sq(radius));
- 半斜边 =
hypotenuse/2.0;
- 勾股定理求三角形中心到边中心的距离:
foo = sqrt(sq(radius)-sq(halfHypotenuse));
- 最终距离 =
foo*2.0;
查找相邻三角形中心点的代码:
float[] nx = new float[3];
float[] ny = new float[3];
float theta = TWO_PI/6;
float hyp = sqrt(sq(radius)+sq(radius));
float halfHyp = hyp/2.0;
float foo = sqrt((sq(radius)-sq(halfHyp)))*2.0;
for (int i = 0; i < 3; i++) {
nx[i] = initialPointX+cos(theta)*foo;
ny[i] = initialPointY+sin(theta)*foo;
theta += thetaInc;
}