math - 生成三角/六角坐标 (xyz)

标签 math coordinates vector coordinate-systems hexagonal-tiles

我正在尝试提出一个迭代函数,为六边形网格生成 xyz 坐标。有了起始的六边形位置(为简单起见,假设为 0,0,0),我想计算每个连续的六边形“环”的坐标,如下所示:

到目前为止,我所能想到的就是这个(javascript 中的示例):

var radius = 3
var xyz = [0,0,0];

// for each ring
for (var i = 0; i < radius; i++) {
    var tpRing = i*6;
    var tpVect = tpRing/3;
    // for each vector of ring
    for (var j = 0; j < 3; j++) {
        // for each tile in vector
        for(var k = 0; k < tpVect; k++) {
            xyz[0] = ???;
            xyz[1] = ???;
            xyz[2] = ???;
            console.log(xyz);
        }
    }
}

我知道每个环比前一个环多包含 6 个点,并且每个 120° 向量从中心开始每一步都包含一个附加点。我还知道所有图 block 的 x + y + z = 0 。但是如何生成遵循以下顺序的坐标列表呢?

    0, 0, 0

    0,-1, 1
    1,-1, 0
    1, 0,-1
    0, 1,-1
   -1, 1, 0
   -1, 0, 1

    0,-2, 2
    1,-2, 1
    2,-2, 0
    2,-1,-1
    2, 0,-2
    1, 1,-2
    0, 2,-2
   -1, 2,-1
   -2, 2, 0
   -2, 1, 1
   -2, 0, 2
   -1,-1, 2

最佳答案

不仅是x + y + z = 0,而且x、y和z的绝对值都等于环半径的两倍。这应该足以识别每个连续环上的每个六边形:

var radius = 4;
for(var i = 0; i < radius; i++)
{
    for(var j = -i; j <= i; j++)
    for(var k = -i; k <= i; k++)
    for(var l = -i; l <= i; l++)
        if(Math.abs(j) + Math.abs(k) + Math.abs(l) == i*2 && j + k + l == 0)
            console.log(j + "," + k + "," + l);
    console.log("");
}

关于math - 生成三角/六角坐标 (xyz),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2049196/

相关文章:

string - 计算方程但忽略数学运算和括号的顺序

math - 3D三角函数: finding a point in space along the surface of a sphere

java - 从给定角度获取屏幕边缘的坐标

android - 来自 android 传感器的 -Z 轴的偏航俯仰滚动

c++ - 指向包含指向 vector 指针的结构的 vector

C++ 数组到 vector 问题

c++ - 在类里面使用 Map 与 Vector - 速度

java - 求 n+1,n+2.... 的数字之和,当给出 n 的数字之和时

java - 任何大小的数组java的标准差

javascript:带有屋顶和地板的随机颜色生成器