48

我正在使用六边形网格。我选择使用这个坐标系是因为它非常优雅。

网格

这个问题谈论的是自己生成坐标,非常有用。我现在的问题是将这些坐标与实际像素坐标进行转换。我正在寻找一种简单的方法来找到坐标为 x,y,z 的六边形的中心。假设像素坐标中的 (0,0) 位于十六进制坐标中的 (0,0,0) 处,并且每个六边形都有一条长度为 s 的边。在我看来,x、y 和 z 应该每个都将我的坐标沿轴移动一定距离,但它们以一种奇怪的方式相互关联,我无法完全理解它。

如果您可以转到另一个方向并将像素坐标中的任何 (x,y) 点转换为该点所属的十六进制,则可以加分。

4

1 回答 1

46

为清楚起见,让“六边形”坐标为(r,g,b)其中rgb分别为红色绿色蓝色坐标。坐标(r,g,b)(x,y)与以下相关:

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

推导:

  • 我首先注意到任何水平的六边形行(应该有一个恒定的坐标y)都有一个恒定的b坐标,所以y只取决于b. 每个六边形可以分成六个边长为等边的三角形s;一行中六边形的中心在下一行中心上方/下方的一个半边长(或者,也许更容易看到,一行中的中心在两排中心上方/下方 3 个边长),所以对于1in的每次变化,都会发生b变化y3/2 * s给出第一个公式。b根据求解y得到第二个公式。

  • 具有给定坐标的六边形的r中心都在垂直于 r 轴的直线上r,位于从原点开始的轴上的点处3/2 * s(类似于上述 的推导ybr轴有斜率-sqrt(3)/3,所以垂直于它的直线有斜率sqrt(3)r轴和线上的点有坐标(3sqrt(3)/4 * s * r, -3/4 * s * r);所以包含六边形中心的直线x的方程为. 代入第一个公式并求解yrry + 3/4 * s * r = sqrt(3) * (x - 3sqrt(3)/4 * s * r)yx给出第二个公式。(这不是我实际推导这个的方式,但我的推导是图形化的,经过大量试验和错误,这种代数方法更简洁。)

  • 具有给定r坐标的六边形集是具有该 g 坐标的六边形集的水平反射,因此无论公式是和的x坐标,该公式的坐标与代替将是相反的。这给出了第三个公式。rbxgr

  • 第四个和第五个公式来自用 and 代替第二个公式并b求解ror gxy

  • 最终公式来自观察,并由代数与早期公式验证。

于 2010-03-17T02:24:30.223 回答