Math 六边形网格坐标到像素坐标
我正在使用六边形网格。我选择使用这个坐标系是因为它非常优雅 讨论生成坐标本身,非常有用。我现在的问题是如何将这些坐标转换为实际像素坐标。我正在寻找一种简单的方法来找到坐标为x,y,z的六边形的中心。假设像素坐标中的(0,0)位于六角坐标中的(0,0,0),并且每个六角具有长度为s的边。在我看来,x,y,z都应该沿着一个轴移动我的坐标一定的距离,但是它们之间有一种奇怪的联系,我不能完全把我的头绕着它转 如果您可以转到另一个方向并将像素坐标中的任何(x,y)点转换为该点所属的十六进制,则可获得额外点数。为了清晰起见,将“六边形”坐标设为Math 六边形网格坐标到像素坐标,math,coordinate-systems,hexagonal-tiles,Math,Coordinate Systems,Hexagonal Tiles,我正在使用六边形网格。我选择使用这个坐标系是因为它非常优雅 讨论生成坐标本身,非常有用。我现在的问题是如何将这些坐标转换为实际像素坐标。我正在寻找一种简单的方法来找到坐标为x,y,z的六边形的中心。假设像素坐标中的(0,0)位于六角坐标中的(0,0,0),并且每个六角具有长度为s的边。在我看来,x,y,z都应该沿着一个轴移动我的坐标一定的距离,但是它们之间有一种奇怪的联系,我不能完全把我的头绕着它转 如果您可以转到另一个方向并将像素坐标中的任何(x,y)点转换为该点所属的十六进制,则可获得额外
(r,g,b)
,其中r
,g
和b
是红色,绿色,和蓝色坐标。坐标(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
中b
的每次更改,1
更改y
,给出了第一个公式。根据3/2*s
求解y
,得到第二个公式b
- 具有给定
坐标的六边形在r
轴上距离原点r
的点处(与上述3/2*s
在y
方面的推导类似)的垂直于r轴的直线上具有中心。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
坐标的x
和r
公式是什么,用b
代替g
的公式的r
坐标将相反。这就给出了第三个公式x
- 第四个和第五个公式来自将第二个公式替换为
,并根据b
和x
求解y
或r
g
- 最后的公式来自于观察,并通过代数与早期公式进行了验证