2013-05-27 2 views
0

내 육각형지도에서 최대 이동 오버레이를 표시하고 싶습니다. 예 :육각형지도에서 최대 범위 표시

중심점은 50,50입니다. 허용되는 최대 이동 거리는 5 헥스입니다. - 5

highHeight = 높이 + 5

lowHeight = 높이 y 좌표 50

되는

for (int height = lowHeight; height <= highHeight; height++) 
{ 
    for (int width = lowWidth; width <= highWidth; width++) 
    { 
     [self hexOnMap:height :width :@"green"]; 
    } 
} 

폭되는 xCoordinate 50 신장

내가 오버레이 사용 코드

lowWidth = width - 5

hightWidth = width + 5

분명히 모서리가 5 개 이상의 헥스로 움직이기 때문에 루프가 작동하지 않습니다. 내 IQ가 잠시 멈추는 것을 느낄 때 누군가 제게 명백한 것을 보여주세요 :) 그리고 5의 움직임 값은 정적이 아닙니다.

enter image description here

편집 : @DPenner 답장을 보내

감사합니다. 나는 비슷한 것을 시도했지만이 저주받은 것은 여전히 ​​일하기를 거절합니다.

enter image description here

편집 2 : - 당신은 거의 그것을했다 @DPenner 코드는이 결과를 표시합니다. 내가 볼 수 있도록 코드로 오버레이를 업로드합니다. 어젯밤 멋진 기사를 찾았는데 결국이 문제를 해결하는 데 필요한 단서를 얻었습니다. 하지만 난 정말 당신의 도움을 주셔서 감사 하고이 해결하려고! 완전히 잘못 이후

enter image description here

+0

원산지는 : X = 50, Y = 50/최고 : 50, 49/우측 상단 : 51,49/하단 우측 : 51,50/하단 : 50,51/좌측 하단 : 49,50/좌측 상단 : 49,49. 왼쪽 상단 모서리에 x와 y가 0입니다. – sangony

답변

1

거의 24 시간 동안 수면을 취하지 않은 후, 나는이 문제를 정확히 다루는 위대한 기사를 발견했습니다.

http://keekerdc.com/2011/03/hexagon-grids-coordinate-systems-and-distance-calculations/

여기 그것을 모든 작업을 만들 수있는 코드입니다 : 기사가 여기에있다

for (int y = minY; y <= maxY; y++) 
{ 
    for (int x = minX; x <= maxX; x++) 
    { 
     int xDistance = (x - startXcoordinate); 

     int yStart = 0; 
     if(x > startXcoordinate) 
      yStart = -1; 

     int yDistance = ((xDistance * -1) + yStart)/2; 

     yDistance = yDistance + (y - startYcoordinate); 

     int z = (xDistance + yDistance)* -1 ; 


     int maxDistance = 0; 

     if(abs(xDistance) > maxDistance) 
      maxDistance = abs(xDistance); 

     if(abs(yDistance) > maxDistance) 
      maxDistance = abs(yDistance); 

     if(abs(z) > maxDistance) 
      maxDistance = abs(z); 

     if(abs(maxDistance) <= patrolRange) 
      [self hexOnMap:y :x :@"green"]; 
    } 
} 

enter image description here

1

나는 나의 오래된 대답을 삭제 한 : 가끔 x 및 y 좌표를 모두 다를 수 인접한 칸을 고려하는 것을 잊었다. 그 까다 롭습니다 잡기하지만 다음과 같은 코드가 작동해야합니다

은 X 좌표의 중심도 인 경우 :

for (int width = lowWidth; width <= highWidth; width++) 
{   
    double heightNeeded = 5 - abs((centerX - width)/2.0); 
    for (int height = centerY - (int)ceil(heightNeeded); height <= centerY + (int)floor(heightNeeded); height++) 
    { 
     [self hexOnMap:height :width :@"green"]; 
    } 
} 

X 좌표 중심이 홀수 인 경우

는, 바닥 및 천장 기능을 교환합니다. 다른 크기의 오버레이에 대해 5를 변경하십시오.

손으로 직접 확인했는데 정상적으로 작동하는 것으로 보입니다. 바깥 쪽 루프는 너비/X 루프입니다. X 좌표가 가로로 지그재그 모양을 이루기 때문에 ceil과 floor 함수는 내부 높이/Y 루프에서 "고정"됩니다.