【问题标题】:Selection of neighbors cells in a hexagonal field在六边形区域中选择相邻单元格
【发布时间】:2009-12-07 13:32:55
【问题描述】:

想象具有 3 个维度的六边形空间。

每个图块都有坐标 XYZ。 我需要在同一平面上选择给定的单元格邻居。 使用 SQL 它看起来像:

$tbDir = $y % 2 == 0 ? -1 : 1;

$result =  db_query('SELECT x,y,z FROM {cells} WHERE
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d ',
                    $x, $y, $z,
                    $x-1, $y, $z,
                    $x+1, $y, $z,
                    $x, $y-1, $z,
                    $x, $y+1, $z,
                    $x+$tbDir, $y-1, $z,
                    $x+$tbDir, $y+1, $z);

但是,我不喜欢这种方式。 也许有人知道更优化的算法? 谢谢!

【问题讨论】:

    标签: sql mysql algorithm hexagonal-tiles


    【解决方案1】:

    这看起来你可以使用介于

    x BETWEEN $x-1 AND $x+1 AND y BETWEEN $y-1 AND $y+1 AND z = $z
    

    这可能不适用于 $tbDir 部分。我会更详细地看一下这个案例。

    好吧,不如试试这个

    WHERE   x BETWEEN ($x-1 AND $x+1 AND y = $y AND z = $z)
    OR      (y BETWEEN $y-1 AND $y+1 AND x = $x AND z = $z)
    OR      (y BETWEEN $y-1 AND $y+1 AND x = $x + $tbDir AND z = $z)
    

    甚至

    WHERE   (   (x BETWEEN $x-1 AND $x+1 AND y = $y )
                OR      (y BETWEEN $y-1 AND $y+1 AND x = $x)
                OR      (y BETWEEN $y-1 AND $y+1 AND x = $x + $tbDir)
            )
    AND     z = $z
    

    【讨论】:

    • 在发表评论之前,我几乎没有注意到 $tbDir 案例。这对我来说看起来不错。它还允许在 x、y 和 z 上放置索引以进行进一步优化。
    • 这是 9 个图块的结果,但需要 6 个 + 目标。额外 2
    • 我认为最后一个例子是最理想的。谢谢!
    • 是个有趣的问题 X-)
    • 这只是开始:)
    【解决方案2】:

    如果您的算法可以使用非正交坐标系,则映射很容易。在您的情况下,与轴平行的六角瓷砖部分似乎是垂直的:

     / \ / \ / \
    | a | b | c |
     \ / \ / \ / \
      | d | e | f |
     / \ / \ / \ /
    | x | g | h | i
    

    如果您可以接受倾斜的 Y 轴,那么您可以给 adg X 坐标 0(即 Y 轴穿过这些图块的中心)。 (beh 有 X == 1,cfi 有 X == 2 等等)。 x 的坐标为 (-1,2)。现在你可以这样移动了:

    e -> f: x+1,y
    e -> d: x-1,y
    e -> b: x,  y-1
    e -> c: x+1,y-1
    e -> g: x-1,y+1
    e -> h: x,  y+1
    

    如您所见,运动现在完全独立于 y 位置。

    【讨论】:

    • 是我不能倾斜Y轴的问题。字段已形成,单元格已添加到 db。无论如何,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多