geometry - 在矩形上镶嵌六边形

标签 geometry hexagonal-tiles tessellation

我有一个无限的六边形网格,由立方 (x y z) 坐标系定义,如下所示:

3 lines at 120 degree intervals of each other, labeled x, y, and z, and a hexagonal honeycomb pattern using these axes.

我还有一个视口(viewport)——一个矩形 Canvas ,我将在其中绘制六边形。

我的问题是这样的。由于六边形网格在各个方向上都是无限的,因此我无法一次绘制所有六边形网格。因此,我需要绘制视口(viewport)中的所有六边形,并且仅绘制那些六边形。

这张图片总结了我想要做的事情:

Hexagons intersecting inside the rectangular viewport are colored purple and thus rendered, all other hexagons are not rendered and are colored white in the diagram

在此图像中,紫色六边形是我想要渲染的六边形,而白色六边形是我不想渲染的六边形。黑色矩形是视口(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/

相关文章:

r - 如何摆脱ggplot geom_hex中的边界线

r - ggplot2 stat_binhex() : keep bin radius while changing plot size

java - Java自动生成六边形网格

opengl - 如何在 Opengl 中获得所有三角形对角线以相同方式倾斜的四边形分割?

python - 如何找到线段上距离任意点最近的点?

c - 一组点的最大周长边界矩形

colors - 识别opencv中检测到的圆圈的颜色

php - 计算周长值

将 2d 多边形最佳分割(即镶嵌/分区)到更小的多边形的算法?