六角网格坐标到像素坐标

时间:2010-03-17 01:43:38

标签: math coordinate-systems hexagonal-tiles

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

grid

This question谈论自己生成坐标,非常有用。我现在的问题是将这些坐标转换为实际像素坐标。我正在寻找一种简单的方法来找到坐标为x,y,z的六边形的中心。假设像素坐标中的(0,0)在六角形坐标中为(0,0,0),并且每个六边形具有长度为s的边缘。在我看来,像x,y和z每个都应该沿轴线移动我的坐标一定距离,但是它们以奇怪的方式相互关联,我无法将头围绕在它周围。

如果你可以转向另一个方向并将像素坐标中的任何(x,y)点转换为该点所属的十六进制,那么

点数。

1 个答案:

答案 0 :(得分:40)

为清楚起见,让“六边形”坐标为(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 1}}。每个六边形可以分成六个等边三角形,边长s;一行中六边形的中心是下一行中心上方/下方的一半半长度(或者,或许更容易看到,一行中的中心是中心上方/下方两行的3个边长),对于1b的每次更改,y更改3/2 * s,给出第一个公式。根据{{​​1}}求解b得出第二个公式。

  • 具有给定y坐标的六边形在r轴上距离原点r的点上垂直于r轴的直线上具有中心(类似于3/2 * s的上述y的推导。 b轴具有斜率r,因此与其垂直的线具有斜率-sqrt(3)/3; sqrt(3)轴上和该线上的点具有坐标r;因此(3sqrt(3)/4 * s * r, -3/4 * s * r)x中包含带有y - 坐标r的六边形中心的线的等式为r。使用第一个公式替换y + 3/4 * s * r = sqrt(3) * (x - 3sqrt(3)/4 * s * r)并求解y得到第二个公式。 (这不是我实际上得出这个的方法,但我的推导是图形化的,有很多试验和错误,这种代数方法更简洁。)

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

  • 第四和第五个公式来自于g替换第二个公式,并根据r和{{1}求解br }。

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