2009-12-07 124 views
2

想象具有三维的六角形空间。在六角形区域中选择邻居单元格

每个图块都有坐标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); 

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

回答

4

这看起来像您可以使用

之间

x BETWEEN $x-1 AND $x+1 AND y BETWEEN $y-1 AND $y+1 AND z = $z 
这可能不完全为$ tbDir部分工作。我会更详细地看看这个案例。

OK,而试试这个

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 
+0

在我评论之前,我几乎没有注意到$ tbDir的情况。这对我来说很好。它还允许将索引放置在x,y和z上以进一步优化。 – 2009-12-07 13:49:44

+0

这里是结果9瓦,但需要6 +目标。额外2 – Coyod 2009-12-07 13:59:22

+0

我认为最后一个例子是最优的。谢谢! – Coyod 2009-12-07 14:22:06

3

有一个简单的映射,如果你的算法可以用非直角坐标系工作。在你的情况,六角砖是平行于轴线的一部分似乎是垂直:

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

+0

问题是我不能倾斜Y轴。字段已经形成并且单元格添加到数据库。不管怎样,谢谢! – Coyod 2009-12-07 14:15:06