육각형 분야에서 이웃 세포의 선택
-
13-09-2019 - |
문제
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
ske y 축을 수락 할 수 있다면 a
, d
, g
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 위치와 완전히 독립적입니다.
제휴하지 않습니다 StackOverflow