일반적인 행진 큐브는 큐브 당 12 개의 가장자리를 찾습니다. 그러나 큐브 당 3 개의 가장자리를 만들고 배열을 가장자리에 저장 한 다음 큐브를 다시 살펴보고 인접한 큐브의 가장자리를 계산하는 대신 참조하십시오.효율적인 큐브 행진 - 에지 계산의 3/4 시간을 줄일 수 있습니까?
인접한 큐브를 참조하는 프로세스가 인터넷에서 명확하게 논의되지 않아 행진 큐브를 사용하는 모든 사용자가 솔루션의 세부 정보를 찾는 데 도움이 될 것입니다. 이미 구현을 알고 있습니까? 그것은 단지 일부 있지만 여기
대신 12난 그냥이 솔루션을 발견
편집 -, 당신은 각 큐브에 필요한 노란색의 세 모서리를 보여주는 사진입니다 :
낮은 관심 좌표를 가진 입방체 모서리에서 오는 3 개의 가장자리를 상상해보십시오. 다른 모든 모서리는 다른 큐브에 속합니다. 우리 큐브가 좌표 (x, y, z)를 가지면, 신경질 큐브는 좌표 (x + 1, y, z), (x, y + 1, z), (x, y, z + 1), (x + 1, y, z + 1), (x, y + 1, z + 1) 가장자리를 벡터로 상상할 수 있습니다. 그런 다음 입방체 모서리에 모서리 (1,0,0), (0,1,0), (0,0,1)이 있습니다. 좌표 (x + 1, y, z)를 갖는 입방체는 큐브에 속하는 (0,1,0) 및 (0,0,1) 에지를 갖습니다. 큐브 (x + 1, y + 1, z)는 큐브에 속한 하나의 가장자리 (0,0,1) 만 갖습니다. 따라서 큐브에 대해 4 개의 요소를 저장하면 다음과 같이 액세스 할 수 있습니다.
edge1 = cube[x][y][z][0];
edge2 = cube[x][y][z][1];
edge3 = cube[x][y][z][2];
edge4 = cube[x+1][y][z][1];
edge5 = cube[x+1][y][z][2];
edge6 = cube[x][y+1][z][0];
edge7 = cube[x][y+1][z][2];
edge8 = cube[x][y][z+1][0];
edge9 = cube[x][y][z+1][1];
edge10 = cube[x+1][y+1][z][2];
edge11 = cube[x+1][y][z+1][1];
edge12 = cube[x][y+1][z+1][0];
이제는 edge7을 연결합니까? 답은 (x, y + 1, z)와 (x, y + 1, z) + (0,0,1) = (x, y + 1, z + 1)입니다.
이제 어떤 큐브 에지 7에 연결됩니까? 더 어렵습니다. 좌표 z는 모서리를 따라 변화하는 것을 보았습니다. 이것은 neibour 큐브가 같은 z 좌표를 가짐을 의미합니다. 이제는 다른 모든 사람들이 변화를 조정합니다. 우리가 +1을 가지고 있다면, 큐브는 큰 좌표를가집니다. 우리가 +0을 가지면 큐브의 좌표가 작아집니다. 그래서 가장자리는 큐브 (x, y, z)와 (x-1, y + 1, z)를 연결합니다. 같은 가장자리를 가진 다른 2 개의 큐브는 (x, y + 1, z)와 (x-1, y, z)입니다.
- = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = - =
EDIT2- 그래서 나는 이것을하고 있으며, 그렇게 간단하지 않습니다. 나는 동시에 8 점, 12 가장자리, 가장자리의 보간, 비트 값 및 꼭지점의 값을 하나의 루프로 계산하는 루프를 가지고 있습니다.
그래서 나는 가능한 한 많이 계산하고 복잡한 루프에서 사용하기 위해 배열에 배치하기 위해 이전에 새로운 루프를 만들고 있습니다.
나는 복잡한 루프에서 모든 포인트를 다시 계산해야하지만, 에지에서 교차점의 보간 된 값을 재사용 할 수 있습니다. 참조 할 비트 수를 결정할 때 사용한 점의 값 버텍스 테이블의 값. 그것은 나를 혼란스럽게한다! 일단 가장자리 교차 값을 얻으면 다시 점을 계산할 필요없이 직접 삼각형 표를 구할 수 있다고 생각했습니다!
사실 아니요. 어쨌든, 이미 읽을 수있는 사람이 있다면 이미 다른 사람과 정보를 공유하고 있습니다. http://www.new-npac.org/projects/sv2all/sv2/vtk/patented/vtkImageMarchingCubes.cxx 이 줄로 스크롤하십시오. 큐브는 최소면의 가장자리를 담당합니다.
그래서 나는이 일을하고, 그것은 그렇게 간단하지 않다. 나는 동시에 8 점, 12 가장자리, 가장자리의 보간, 비트 값 및 꼭지점의 값을 하나의 루프로 계산하는 루프를 가지고 있습니다. –
해결 방법은 각 큐브에 대해 3 개의 가장자리 만 사용하여 XYZ에서 그리드 1x 큐브를 더 크게 만드는 것이 었습니다. 배열을 생성 한 다음 각 큐브의 12 개 가장자리를 확인할 때 상호 참조합니다. GPU를 사용하면 CPU보다 100 배 빠르게 진행되므로 요즘 성능면에서는 절묘합니다. –