Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 六边形网格坐标到像素坐标_Math_Coordinate Systems_Hexagonal Tiles - Fatal编程技术网

Math 六边形网格坐标到像素坐标

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)点转换为该点所属的十六进制,则可获得额外

我正在使用六边形网格。我选择使用这个坐标系是因为它非常优雅 讨论生成坐标本身,非常有用。我现在的问题是如何将这些坐标转换为实际像素坐标。我正在寻找一种简单的方法来找到坐标为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
    b
    方面的推导类似)的垂直于r轴的直线上具有中心。
    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
    得到第二个公式。(这不是我实际推导这个的方式,但我的推导是图形化的,有很多尝试和错误,这个代数方法更简洁。)

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

  • 第四个和第五个公式来自将第二个公式替换为
    b
    ,并根据
    x
    y
    求解
    r
    g

  • 最后的公式来自于观察,并通过代数与早期公式进行了验证


太棒了!虽然我不知道为什么,但这些方法似乎有效。顺便说一句,r、g和b中的任何两个都足以找到唯一的六边形/点。@CaptnCraig-编辑以添加有关如何获得这些公式的注释。在公式中键入两个“x=”,其中一个应该是“y=”@Jason S:不,y有一个公式(仅取决于b),但是对于x有两个公式,一个使用b和r,另一个使用b和g。这一页有一些公式对你有用:没关系,我的数学错了。轴必须旋转∠π/6,以使其工作。