这是我要创建的几何类型的图像。
我想为这样的测地球创建一个算法。我的事情是我需要六边形和五边形的面是平的,而不是像我发现的大多数算法那样本质上是球形的。如果算法能找到下一步,那也很好,这样我就可以在没有更好的词的情况下向上移动“镶嵌”。基本上有更小的六边形和五边形接近它。
找到了一些方法来制作一些较低的镶嵌,但即使这样也会使一个像所附图片一样的方法足以完成我的任务。不过,对于我的项目来说,这些面孔需要很硬。
这是我要创建的几何类型的图像。
我想为这样的测地球创建一个算法。我的事情是我需要六边形和五边形的面是平的,而不是像我发现的大多数算法那样本质上是球形的。如果算法能找到下一步,那也很好,这样我就可以在没有更好的词的情况下向上移动“镶嵌”。基本上有更小的六边形和五边形接近它。
找到了一些方法来制作一些较低的镶嵌,但即使这样也会使一个像所附图片一样的方法足以完成我的任务。不过,对于我的项目来说,这些面孔需要很硬。
这是一个生成正二十面体的脚本。
然后你可以用这个算法细分每个三角形(C# with Vector3
struct):
Vector3[] icoTriangleCorners = new Vector3[3];
public void Subdivide(HashSet<Vector3[]> faces, int subdivision, double radius) {
Vector3 x = (icoTriangleCorners[1] - icoTriangleCorners[0]) / (subdivision + 1);
Vector3 y = (icoTriangleCorners[2] - icoTriangleCorners[1]) / (subdivision + 1);
for(int i = 0; i <= subdivision; ++i) {
for(int j = 0; j <= i; ++j) {
Vector3 a = (icoTriangleCorners[0] + i * x + j * y).normalized * radius;
Vector3 b = (icoTriangleCorners[0] + (i + 1) * x + j * y).normalized * radius;
Vector3 c = (icoTriangleCorners[0] + (i + 1) * x + (j + 1) * y).normalized * radius;
faces.Add(new Vector3[] {a, b, c});
if (i == j) continue;
Vector3 d = (icoTriangleCorners[0] + i * x + (j + 1) * y).normalized * radius;
faces.Add(new Vector3[] {c, d, a});
}
}
}
它以相同的顺时针顺序生成具有顶点的新三角形面。测地线球的顶点是三角形的质心。五边形和六边形的中心是三角形的角。
您可以通过为角创建一个新类并检查Vector3
角的是否已经创建来改进算法。然后,您可以收集连接角对象中角的三角形。这种方法使最终面的生成更容易。