我有一个像这样的网格
我需要计算一个细胞相对于目标的距离。例如,单元格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;
}
答案 0 :(得分: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;