半球的六角形耕作

时间:2017-02-06 13:50:33

标签: math hexagonal-tiles

我需要在球面上有六边形网格。如此处所示。

enter image description here

现在我正在做一个六边形扁平网格。 enter image description here 并将其投射到半球的表面上。像这儿, 但正如你所看到的,有趣的神器是边缘上的六边形不成比例地大。应该有一个更好的方法来做到这一点,以便所有六边形的大小几乎相等。

enter image description here

我曾尝试像@spektre建议的解决方案,但我的代码正在制作以下情节。

enter image description here 我使用的是a=sqrt(x*x+y*y)/r * (pi/2),因为我希望将a扩展为[0,r]z [0,r],因此角度a的范围为{{} 1}}。

但只有[0,pi/2]它才能运作良好。 enter image description here

新开发的任务,新问题 enter image description here

我有一个问题,现在,六边形在形状上是不相等的。我希望它们在圆顶和圆柱体上具有统一的形状(面积方面)。我对如何管理这个很困惑?

1 个答案:

答案 0 :(得分:2)

以下是我的想法:

  1. 在XY平面上创建平面六角网格

    你的网格的中心必须你选择(0,0,0)球体的中心,网格的大小至少应该是球体的2 *半径。

  2. 将平面坐标转换为球形

    因此,从<{1}}到 XY 平面中的点坐标的距离是在球体表面上行进的arclength,因此如果处理点为(0,0,0)且球半径为{{1}那么球体上的纬度位置是:

    (x,y,z)

    所以我们可以直接计算z坐标:

    r

    并将a=sqrt(x*x+y*y)/r; 缩放到球体表面:

    z=r*cos(a);
    

    如果x,y坐标为负,那么你已经越过了半球,应该处理不同(跳过十六进制或转换为圆柱或其他)

  3. 这里的小 OpenGL / C ++ 示例:

    a=r*sin(a)/sqrt(x*x+y*y);
    x*=a; y*=a;
    

    用法:

    z

    预览:

    preview

    有关更多信息和想法,请参阅相关内容: