在等边三角形网格中查找源自中心顶点的顶点
本文关键字:顶点 查找 等边三角形 网格 | 更新日期: 2023-09-27 18:28:55
我想问是否有代码,或者你是否可以帮我写一些(C#,但我想数学在任何地方都是一样的)。
我想指定一个中心点,从中创建等边三角形网格,并获得这些三角形的顶点。中心点不应该是面中心,而应该是顶点本身。另一个输入是三角形的大小(即边长)和生成三角形顶点的半径。
它背后的原因是,我想创建一个网格,它以尽可能少的代码很好地集中在屏幕/窗口中心。我只找到了网格生成代码,但没有找到"径向向外传播"的示例。
最后,我希望随后更远的顶点以对数方式移位,但我想一旦网格代码存在,这只是一个简单的添加。
有人能帮我吗?谢谢
您需要指定两件事,第一个三角形指向的半径和方向。
- 半径将是从初始点到第一个三角形顶点的距离。所有三角形的半径都相同
- 方向是以弧度为单位的某种规格。我假设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
,用foo
替换radius
(见下面的数学),在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;
}
非常感谢您的回答。我会处理你的代码——传播部分肯定会派上用场。
与此同时,我玩了六边形而不是三角形,这些代码可以很好地用于相同的目的
//从中心六角填充数组,向外填充所需数量的六角环
for (int i = 0; i < numberOfHexagonRings; i++)
{
for (double j = -i; j <= i; j++)
for (double k = -i; k <= i; k++)
for (double l = -i; l <= i; l++)
if ((Math.Abs(j) + Math.Abs(k) + Math.Abs(l) == i * 2) && (j + k + l == 0))
{
positionX = (int)(screenCenterX + ((double)sideLength * (l / 2 + j)));
positionY = (int)(screenCenterY + (3/2 * ((double)sideLength / Math.Sqrt(3)) * l));