我正在使用六边形网格。我选择使用这个坐标系,因为它非常优雅。
This question谈论自己生成坐标,非常有用。我现在的问题是将这些坐标转换为实际像素坐标。我正在寻找一种简单的方法来找到坐标为x,y,z的六边形的中心。假设像素坐标中的(0,0)在六角形坐标中为(0,0,0),并且每个六边形具有长度为s的边缘。在我看来,像x,y和z每个都应该沿轴线移动我的坐标一定距离,但是它们以奇怪的方式相互关联,我无法将头围绕在它周围。
如果你可以转向另一个方向并将像素坐标中的任何(x,y)点转换为该点所属的十六进制,那么
点数。
答案 0 :(得分:40)
为清楚起见,让“六边形”坐标为(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
1}}。每个六边形可以分成六个等边三角形,边长s
;一行中六边形的中心是下一行中心上方/下方的一半半长度(或者,或许更容易看到,一行中的中心是中心上方/下方两行的3个边长),对于1
中b
的每次更改,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
坐标代替b
而x
将相反。这给出了第三个公式。
第四和第五个公式来自于g
替换第二个公式,并根据r
和{{1}求解b
或r
}。
最终公式来自观察,由代数用早期公式验证。