2013-05-27 100 views
0

我想在我的十六進制地圖中顯示最大移動重疊。例如:在六角形地圖上顯示最大範圍

中心點位於50,50 最大允許移動量爲5格。

這是我使用用於重疊的代碼:

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

寬度爲x座標50 高度爲y座標50

lowHeight =高度 - 5

highHeight =高度+ 5

lowWidth = width - 5

hightWidth = width + 5

很明顯,我的循環不工作,因爲角落的運動超過5格。因爲我覺得我的智商在一分鐘內下降,有人請告訴我明顯的:)並且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零。 – 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座標是水平曲折的,這樣細胞和底部函數「固定」在內部高度/ Y循環中。