试想用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);

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

有帮助吗?

解决方案

这貌似可以

之间使用
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

其他提示

有一个简单的映射,如果您的算法可以用非正交坐标系统中工作。在你的情况下,六角瓦片其平行于轴的部分似乎是垂直:

 / \ / \ / \
| 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位置的

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top