반응형
모턴 코드(Morton Code)는
3차원 또는 고차원 좌표 데이터를 1차원으로 변환하여 효율적으로 관리하기 위한 방법입니다. 이를 Z-order curve라고도 부르며, 공간 분할에서 자주 사용됩니다. Morton Code는 각 좌표의 비트를 교차(interleave)하여 1차원으로 배열합니다.
각 차원의 좌표 값에서 비트를 하나씩 순서대로 꺼내어 합칩니다. 예를 들어, 3D 좌표 (x, y, z)라면, 각 차원의 비트를 교차하여 하나의 값으로 결합합니다.
#include <stdint.h>
#include <limits.h>
using namespace std;
// method to seperate bits from a given integer 3 positions apart
inline uint64_t splitBy3(unsigned int a)
{
uint64_t x = a & 0x1fffff; // we only look at the first 21 bits
x = (x | x << 32) & 0x1f00000000ffff; // shift left 32 bits, OR with self, and 00011111000000000000000000000000000000001111111111111111
x = (x | x << 16) & 0x1f0000ff0000ff; // shift left 32 bits, OR with self, and 00011111000000000000000011111111000000000000000011111111
x = (x | x << 8) & 0x100f00f00f00f00f; // shift left 32 bits, OR with self, and 0001000000001111000000001111000000001111000000001111000000000000
x = (x | x << 4) & 0x10c30c30c30c30c3; // shift left 32 bits, OR with self, and 0001000011000011000011000011000011000011000011000011000100000000
x = (x | x << 2) & 0x1249249249249249;
return x;
}
inline uint64_t mortonEncode_magicbits(unsigned int x, unsigned int y, unsigned int z)
{
uint64_t answer = 0;
answer |= splitBy3(x) | splitBy3(y) << 1 | splitBy3(z) << 2;
return answer;
}
Morton Code는 3D 공간에서 가까운 점들이 1D에서 가능한 한 근접한 값으로 매핑되도록 설계되어 있어 공간에서 가까운 객체를 효율적으로 검색할 수 있습니다.
특히 공간 분할 알고리즘(Spatial Partitioning)에서 3D 데이터를 효율적으로 관리하는 데 사용됩니다.
소스 및 관련 내용 출처:https://www.forceflow.be/2013/10/07/morton-encodingdecoding-through-bit-interleaving-implementations/
반응형
'3D Algorithm' 카테고리의 다른 글
벡터 계산과 단위벡터 (0) | 2024.09.11 |
---|---|
3차원 두 직선 교차점(Two Line Intersection) (0) | 2024.09.10 |
CAD Revolve (1) | 2024.09.03 |
AABB(Axis Aligned Bounding Box) 계산과 활용 (0) | 2024.08.22 |
임의의 점 직육면체 외부/내부 판별(Point Inside Cube) (0) | 2024.06.13 |