我有一个无限的六边形网格,由立方 (x y z) 坐标系定义,如下所示:
我还有一个视口(viewport)——一个矩形 Canvas ,我将在其中绘制六边形。
我的问题是这样的。由于六边形网格在各个方向上都是无限的,因此我无法一次绘制所有六边形网格。因此,我需要绘制视口(viewport)中的所有六边形,并且仅绘制那些六边形。
这张图片总结了我想要做的事情:
在此图像中,紫色六边形是我想要渲染的六边形,而白色六边形是我不想渲染的六边形。黑色矩形是视口(viewport)——所有与其相交的六边形都将被绘制。 如何找到要渲染的六边形(即它们的 xyz 坐标)?
其他一些信息:
- 我有一个函数,可以调用六边形图 block ,并在给定立方 xyz 坐标的情况下将其绘制在视口(viewport)中位置(x,y)的中心。因此,我需要的只是要绘制的每个矩形的 xyz 坐标,并且我可以绘制它们。这可能会简化问题。
我有从立方六边形坐标到 x/y 坐标以及反之转换的公式。给定上图,r/g/b 是上图立方坐标的轴,x 和 y 是笛卡尔坐标,s 是六边形边的长度...
y = 3/2 * s * b b = 2/3 * y / s x = sqrt(3) * s * ( b/2 + r) x = - sqrt(3) * s * ( b/2 + g ) r = (sqrt(3)/3 * x - y/3 ) / s g = -(sqrt(3)/3 * x + y/3 ) / s r + b + g = 0
最佳答案
设 X0、Y0 为左上角坐标,RectWidth 为矩形宽度,HexWidth = s * Sqrt(3/2) 为六边形宽度。
查找最近的六边形 r0、g0、b0、HX0、HY0 的中心。 (矩形角位于该六边形内,因为六边形是沃罗诺伊图单元)。记住水平和垂直移位DX = X0 - HX0, DY = Y0 - HY0
绘制水平行的 Ceil(RectWidth/HexWidth) 六边形,递增 r 坐标,递减 f,并保持 b 相同,ROWINC=(1,-1,0)
。
注意如果 DY > HexWidth/2
,您需要额外的顶行,初始坐标向上移动 (r0, g0-1, b0+1)
将起点移动L=(0, 1, -1)
如果DX < 0
,或通过R=(1, 0, -1)
否则。使用相同的 ROWINC 绘制另一个水平行
通过替代方式移动行起点(L 在 R 之后,R 在 L 之后)。绘制水平行直到到达底部边缘。
检查底部是否需要额外的行。
关于geometry - 在矩形上镶嵌六边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33271449/