5

我想问一下那里是否有代码,或者您是否可以在编写一些代码时给我一些帮助(C#,但我猜数学到处都是一样的)。

我想指定一个中心点,从中创建等边三角形网格并获取这些三角形的顶点。中心点不应是面中心,而应是顶点本身。进一步的输入将是三角形的大小(即边长)和生成三角形顶点的半径。

其背后的原因是我想用尽可能少的代码创建一个以屏幕/窗口中心为中心的网格。我只找到网格生成代码,而不是“径向向外传播”示例。

最后,我希望随后更远的顶点以对数方式移位,但我想一旦网格代码存在,这只是一个简单的添加。

有人可以帮我吗?谢谢!

4

2 回答 2

1

您需要指定两件事,半径和第一个三角形指向的方向。

  • 半径将是从初始点到第一个三角形顶点的距离。所有三角形都将具有相同的半径。
  • 方向是以弧度为单位的一些规范。我将假设 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,替换radiusfoo(参见下面的数学),在 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;
}
于 2013-08-26T02:31:53.763 回答
0

非常感谢您的回答。我会玩弄你的代码——传播部分肯定会派上用场。

与此同时,我玩过六边形而不是三角形,这段代码可以很好地用于相同的目的。:

//从中心十六进制填充数组,向外扩展所需数量的十六进制环

            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));
于 2013-08-26T06:44:28.527 回答