두 복셀이 서로 연결되어 있는지 확인하는 알고리즘


11

다음과 같은 문제에 대한 좋은 알고리즘을 찾고 있습니다. 3 개의 격자 격자 (비어 있거나 채워져있을 수 있음)를 감안할 때 두 개의 인접하지 않은 복셀을 선택하면 서로 연결되어 있는지 알고 싶습니다. 다른 복셀.

예를 들어 (2D로 상황을 설명하기 위해) #은 채워진 사각형입니다.

  1 2 3
a # # #
b # #
c # # #

a3과 c3을 선택하면 연결되어 있는지 가능한 한 빨리 확인하고 싶습니다. 채워진 픽셀을 통과하는 a3와 c3 사이에 경로가있는 경우 (실제 상황은 물론 3D 복셀 그리드에 있습니다.)

플러드 필 알고리즘과 경로 찾기 알고리즘을 살펴 봤지만 어떤 것을 선택해야할지 모르겠습니다. 두 가지 모두 불필요한 작업을합니다. 홍수 채우기는 모든 복셀을 채우려 고하지만 반드시 그럴 필요는 없습니다. 경로 찾기 알고리즘은 일반적으로 가장 짧은 경로를 찾는 것과 관련이 있으며, 필요하지 않습니다. 경로 있는지 만 알면됩니다 .

어떤 알고리즘을 사용해야합니까?

편집 : 의견에 따라 다음을 추가해야한다고 생각합니다. 복셀의 내용을 미리 알 수 없으며 복셀을 제거 (빈)하여 복셀 그룹이 중단되는지 여부를 감지하는 알고리즘이 필요합니다 둘 이상의 작은 그룹으로.


귀하의 예에서 a3에서 c3까지의 유효한 경로는 다음과 같습니다 c3->c2->b2->a2->a3.

맞습니다
Bram Vaessen

답변:


12

A * 는 잘 작동합니다. 경로 찾기는 원하는 것입니다. 가장 짧은 경로를 찾는 것은 경로를 찾는 것보다 빠릅니다. 이 상황에서 시작점과 끝 점이 있으면 A *가 가장 적합 할 것입니다. 즉, 검색 속도를 높이기 위해 휴리스틱을 추가했습니다.

A *를 사용하면 일반적으로 가장 먼저 찾은 경로가 가장 짧으므로 이미 경로를 찾은 후에는 추가 작업을 수행하지 않습니다.

여기에 이미지 설명을 입력하십시오

일부 최적화에 대해서는 여기 에서 내 대답을 확인 하십시오 .


벽에 부딪 칠 때까지 실제로 싹이 난 다음에 일종의 섬뜩한
GameDev-er

1
@ GameDev-er 네, 휴리스틱 때문입니다. 장애물이 없다면 매우 빠른 검색, 거의 직선 일 것입니다.
MichaelHouse

노드를 더 잘 정렬하면 최종 노드에 가장 가까운 경로가 먼저 확장됩니다. 노드를 정렬하기위한 빠른 데이터 구조가있는 경우 가장 직접적인 경로의 대상까지의 거리를 기준으로 정렬하십시오.
MichaelHouse

9

사전 처리를 수행하고 스토리지 비용을 소비 할 준비가 되었다면 빌드시 복셀을 연결된 그룹으로 분할하면 '경로가 있습니까?' 두 그룹이 같은 그룹에 있다면 두 복셀 사이에 경로가 있습니다. 분명히 문제는 어딘가에 그룹 정보를 저장해야하며 데이터 레이아웃에 달려 있다는 것입니다. 간단한 목록을 저장하는 경우 공간적으로 연결된 각 그룹마다 하나씩 여러 목록으로 나눌 수 있습니다. 어떤 종류의 BVH로 구성하고 있다면, "이 노드와 그 아래의 모든 복셀은 그룹 X에 속합니다"라고 말할 수 있다면 상당히 좋은 효율성을 얻을 수있을 것입니다.

또는 공간 분할을 수행하고 연결된 각 그룹에 대해 더 작은 '허브'복셀 세트를 저장할 수도 있습니다. 그런 다음 소스 및 대상 복셀에서 가장 가까운 허브 복셀로 경로를 찾을 수 있습니다. 경로를 계산하는 데 훨씬 짧거나 저렴해야합니다. 복셀에서 허브 복셀까지의 경로를 찾을 수 있으면 복셀은 허브 복셀 그룹의 일부입니다. 허브 복셀을 스마트하게 선택하면 경로 순회 수를 최소화 할 수 있습니다. 예를 들어 구의 중심에 하나의 허브 복셀이있을 수 있지만, 길고 얇은 그룹은 길이를 따라 모든 X 복셀에 허브 복셀이있을 수 있습니다. 소스 및 대상 복셀이 길이의 양쪽 끝에 있으면 허브를 찾기 위해 최대 X 복셀 만 가면되고 길이의 시작과 끝 사이에 엄청난 수의 복셀이 있더라도

그것은 복셀 그룹이 얼마나 병리학 적인지에 달려 있습니다. 작은 수의 작은 단절 그룹을 기대한다면, 스토리지 비용의 증가는 단지 길 찾기의 성능 히트보다 훨씬 클 것입니다. 연결 그룹이 비교적 적지 만 토폴로지가 이상 할 것으로 예상되는 경우 순진한 경로 찾기는 비용이 많이 들고 스토리지 비용과 최소 경로 찾기는 훨씬 저렴한 옵션입니다.


1
정답이지만 효율적으로 구현하려면 목록으로 저장해서는 안됩니다. 공용체 찾기 알고리즘을 사용하여 설정 한 "대표적 복셀"을 가리키는 각 복셀에 포인터를 추가하십시오. 이것은 복셀 당 일정한 저장 비용이며 기본적으로 계산 비용에 대한 모서리 수는 선형입니다.
Neil G

흥미로운 아이디어이지만 상황을 복잡하게 만드는 두 가지가 있습니다. 첫 번째는 복셀 그리드의 내용이 미리 알려져 있지 않기 때문에 허브 복셀을 만들려면 허브가 될 복셀을 결정할 수있는 알고리즘이 필요합니다.
Bram Vaessen

1
두 번째 문제는 하나의 복셀을 제거한 직후 해당 알고리즘이 해당 복셀의 제거로 인해 작은 그룹으로 나뉘어 있는지 확인하기 위해 알고리즘이 필요하다는 것입니다.
Bram Vaessen

@BramVaessen 모든 쌍별 상호 연결 관계, 특히 그룹의 '분류'여부를 찾고 있다면 이는 단순히 도달 가능성과는 다소 다른 문제입니다 (연결 가능성은 가장 쉬운 방법 임). '질문 뒤의 문제'에 대한 더 나은 답변을 얻을 수 있기 때문에 원래 질문에 대한 구체적인 내용을 구체적으로 추가하는 것이 좋습니다.
Steven Stadnicki 2016 년

깨끗하게 유지하기 위해 여기에 다른 질문으로 초기 문제를 물었습니다. gamedev.stackexchange.com/questions/50953/…
Bram Vaessen

4

복셀에 익숙하지는 않지만 A *와 같은 최상의 검색 알고리즘을 사용하면 성능이 향상 될 수 있다고 생각합니다. 이 예에서 A *를 사용할 때의 문제점은 일반적으로 사용하는 경험적 방법은 가능한 빨리 '모든 경로'가 아닌 최단 경로를 찾는 우선 순위를 갖도록 설계되었다는 것입니다.

대체 휴리스틱을 사용하여 운이 좋을 수도 있습니다.

f (p) = g (p) + w (p) * h (p)

여기서 w> = 1. 목표에 가까워 질수록 'w'의 값이 감소하므로 원하는 복셀에 가까워 질수록 경로 비용 'g'에 우선 순위가 높아집니다.

이게 도움이 되길 바란다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.