在等边三角形网格中查找源自中心顶点的顶点

本文关键字:顶点 查找 等边三角形 网格 | 更新日期: 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));