문제

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 위치와 완전히 독립적입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top