2011-12-21 126 views
1

首先,讓我說我是初學者,這個程序是我第一次嘗試「獨奏」,所以如果我聽起來像個傻瓜,請耐心等待。使用hexes實現A-Star算法

我有一個網格的格,我想用A *找到一個路徑從一個到另一個。

六角瓷磚適合一個80×80正方形內,由這些2D座標(即,十六進制[0,0],十六進制[1,0內部存儲爲2維陣列,並在代碼中引用]等)。

它們顯示在屏幕上用「驚人」的轉變:

if (X % 2 == 0) 
{ 
    X = (X/2) * 120; 
    Y = Y * 80; 
} 
else 
{ 
    X = ((X/2) * 120); 
    Y = (Y * 80) + 40; 
} 

我有我的A *的實現設置了,但很明顯,二不吉利的東西了相鄰的十六進制6的計數爲2而不是1,而哪兩個取決於X是奇數還是偶數而不同。

我試圖就如何計算出正確的差異讀了,但我不知道從哪裏開始實施的任何變化的方法,我周圍看到。是否有一個簡單的轉換,我可以對座標系統進行簡單的轉換,我已經純粹爲了計算十六進制之間的距離,或者我可以使用的公式?

謝謝。

+0

這個問題很混亂。任何兩個相鄰格的中心之間的距離是*相同*。這是使用hexes的全部*點*。你爲什麼會把他們中的兩個算作兩個單位?你說「顯然」就像你在說什麼一樣明顯,但我向你保證它不是。 – 2011-12-21 18:22:57

+0

繪製其數組座標的圖片將有助於大量顯示您的問題。 – 2011-12-21 18:26:24

+0

我覺得這裏缺少一些東西。 X在兩個分支中獲得相同的值。 – Dialecticus 2011-12-21 18:29:26

回答

1

如果我沒有記錯,這應該這樣做:

int HexDistance(int x1, int y1, int x2, int y2) { 
    int y1d = (y1 << 1) | (x1 & 1); 
    int y2d = (y2 << 1) | (x2 & 1); 
    int dx = Math.Abs(x2 - x1); 
    int dyd = Math.Abs(y2d - y1d); 
    return (dx < dyd) ? (dyd - dx)/2 + dx : dx; 
} 

假設網格是這樣的:

X: 0 1 2 3 4 5 6              
------------------------ 
Y: 0  0  0  0 
     0  0  0 
    1  1  1  1 
     1  1  1 
    2  2  2  2 

,其中垂直和對角線是相鄰的,但水平線都沒有。

基本上,第一重新編號y座標:在偶數列,它們的兩倍;在奇數列中,加倍並加1.這給出以下網格:

X: 0 1 2 3 4 5 6              
------------------------ 
Y: 0  0  0  0 
     1  1  1 
    2  2  2  2 
     3  3  3 
    4  4  4  4 

現在,如果事情在對角線上,那很容易。如果水平較大,則只需計算水平差異;如果垂直較大,則計算垂直差異直到對角線,然後加上水平差。

編輯:我又有了一個錯誤。早上5點爲我的代碼提供服務。道歉;希望這沒關係。

+0

非常感謝Amadan。使用該函數返回我的網格上任意兩個正方形之間的正確距離,以及它們在我的矩形陣列中的座標。 – user1110391 2011-12-22 10:34:42