2015-01-14 4 views
0

그래서 게임을 만들고 있는데 문제가 있습니다. 3D 그래프에있는 오브젝트를 효율적으로 가져올 수있는 방법이 필요합니다.3D 그래프에서 객체를 가져 오는 가장 효율적인 방법

그러나 문제는 둘 이상의 값을 모두 포함 할 수 있다는 것입니다. 예를 들어 'foo'값은 x 범위 400-500, y 범위 10-20 및 z 범위 30-60을 포함 할 수 있습니다.

이러한 값을 많이 사용하기 때문에 배열에 저장하고 검색하는 것이 좋을 것입니다. 이러한 값을 저장하고 가져 오는 더 효율적인 방법이 있는지 궁금합니다.

게임용 생물체를 선택하기위한 것입니다. 그러나 이것이 GameDev와 비교하여 여기에 넣기로 결정했습니다. 왜냐하면 이것이 데이터 구조에 관한 질문이 더 많았 기 때문입니다. 그러나 내가 틀렸다면 기꺼이 이것을 닫고 거기에 하나를 열어 놓았습니다.

다른 방법이 있습니까?

public static Tile getTile(int height, int moisture, int temperature) { 
    for(Tile tile : tileList){ 

     boolean isTile = true; 

     if(!(tile.heightMax > height && tile.heightMin < height)){ 
      isTile = false; 
     } 

     if(!(tile.temperatureMax > temperature && tile.temperatureMin < temperature)){ 
      isTile = false; 
     } 

     if(!(tile.moistureMax > moisture && tile.moistureMin < moisture)){ 
      isTile = false; 
     } 

     if(isTile){ 
      return tile; 
     } 
    } 
} 

이것은 내 검색 방법입니다. 보시다시피, 나는 목록을 사용하여 모든 타일을 저장하고 기준에 맞는 타일을 찾습니다. 가능한 한 빨리 많은 타일로이 작업을 수행 할 수있는 다른 방법이 있습니까?

+0

해시 테이블은 객체의 빠른 검색을 제공하는 데 매우 뛰어납니다. 그러나 데이터 구조에 약간의 상실감이 있습니다. 실행 가능한 솔루션. 너 뭐 해봤 니? –

+0

구현이 명확하지 않습니다. "배열에 저장하는 것"이라고 말하면 어떻게 저장합니까? 값을 저장하는 방법을 보여주는 코드 조각은 사용자가 질문에 더 잘 답하는 데 도움이됩니다. –

+0

나는 배열을 사용하여 저장 및 검색을 시도했다. 이것은지도에 대한 생물체를 선택하기위한 것이며, 각각의 생물체는 높이, 온도 및 수분 수준을 가지고 있습니다. 나는 지형 생성이 가능한 한 빨리되기를 바래서, 주어진 높이, 온도 및 습기에 대해 신속하게 바이오 메스를 얻는 방법이 필요합니다. 더 많은 정보가 필요하면 그냥 물어보십시오. 나는 너희들이 필요로 할지도 모르는 것에 관해서는 잘하지 못한다. 미안하다. – chbachman

답변

0

과거에이 문제를 해결 한 방법은 3D 공간 영역을 나타내는 영역을 정의한 다음 객체의 공간이 겹치는 모든 영역의 각 객체에지도를 저장하는 것입니다. 그런 다음 한 위치에서 객체를 찾으려면 먼저지도를 사용하여 해당 위치의 객체를 반복하기 전에 해당 위치의 영역과 겹치는 모든 객체를 찾습니다.

코드보기를 제공하겠습니다. 오버 헤드 확실히있다

if (regionMap.containsKey(location.getRegion()) { 
    regionMap.get(location.getRegion()).stream() 
     .filter(item -> item.contains(location)) 
     .... 
} 

: 당신이 위치에서 항목을 검색 할 때 다음

item.getOverlappingRegions().forEach(region -> { 
    if (!regionMap.containsKey(region)) 
     regionMap.put(region, new ArrayList<>()); 
    regionMap.get(region).add(item) 
}); 

:

Map<Region, List<Item>> regionMap = new TreeMap<>(); 

항목이 추가됩니다 지역의지도를 작성하려면 그러나이 영역이 충분히 작 으면 검색하는 것이 매우 빠릅니다.

이것은 3D 공간을 위해 설계되었지만 원하는만큼 많은 크기로 확장 할 수 있습니다. 모두 및 Location 클래스 구현에 있습니다.

0

나는 당신의 문제가 무엇인지 이해하지 못했지만, 3D 공간에서의 충돌 탐지 알고리즘과 매우 유사하게 보입니다. 이 경우라면 Octrees가 당신이 찾고있는 것일 수도 있습니다 : http://www.codeproject.com/Articles/108761/Octrees

관련 문제