2014-04-19 43 views
0

我有一個這樣的網格計算網格中目標的距離的最佳方法

而且我需要計算從一個單元格到目標的距離。例如,小區64是目標,小區99是當前位置。

99的可能路徑必須是例如單元格83,83,66和65 路徑76,62,63是不正確的。

我計算與此功能的距離,但我認爲這是沒有得到很好的加權

-(float)distanceFromTarget:(int)targetCoordinate ofCurrentObject:(int)objectCoordinate{ 


    int columnTarget = (targetCoordinate % 15)-1; 
    int lineTarget = (targetCoordinate /15); 

    int columnObject = (objectCoordinate % 15)-1; 
    int lineObject = (objectCoordinate /15); 

    float lato1; 
    float lato2; 

    if(columnObject>columnTarget) { 
     lato1 = columnObject - columnTarget; 
    } 
    else lato1= columnTarget - columnObject; 

    if(lineObject>lineTarget) { 
     lato2 = lineObject - lineTarget; 
    } 
    else lato2= lineTarget - lineObject; 


    float distance = sqrt(pow(lato1,2)+pow(lato2,2)); 

    return distance; 



} 

回答

1

首先,你的列和行指數的計算是不正確的(它給出了最後一個錯誤的結果每行中的單元格)。如果網格有15列和第一單元具有#1,那麼它應該是:

int columnTarget = (targetCoordinate - 1) % 15; 
int lineTarget = (targetCoordinate - 1)/15; 

int columnObject = (objectCoordinate - 1) % 15; 
int lineObject = (objectCoordinate - 1)/15; 

然後你就可以計算水平和垂直差異爲

int deltaX = abs(columnObject - columnTarget); 
int deltaY = abs(lineObject - lineTarget); 

但最後一步要看是什麼樣你想要計算的距離。

float distance = sqrt(pow(deltaX,2)+pow(deltaY,2)); 
// Or better: 
float distance = hypotf(deltaX, deltaY); 

給出了單元的中心之間的直線的"Euclidean distance", 即長度。

如果要計算其中,水平,垂直和對角線 的動作是允許那麼「最短路徑」的距離會

int distance = MAX(deltaX, deltaY); 

如果只有水平和垂直移動被允許再最短長度 路徑爲

int distance = deltaX + deltaY; 
+0

非常感謝您的回答!我喜歡!我只有一些疑問, 1)我無法理解float distance = hypotf(deltaX,deltaY); int距離= MAX(deltaX,deltaY); 2)如何規範化距離?例如最大值必須介於0和10之間。 3)使用我的代碼,例如目標在單元格62中,對象在單元格69中。我的函數將爲單元格61輸出更好的距離!但是這一舉措是不允許的......我該如何解決這個問題? –

+0

@UsiUsi:允許什麼動作? –

+0

水平,垂直和對角線移動。但是物體不能越過邊界。例如它不能直接從單元格69到61!在該位置,距離必須很高,以阻止對象選擇單元格61中的路徑。單元格68中的距離必須更小,以便對象選擇它! –