我有一个这样的网格
我需要计算一个单元格与目标的距离。例如,单元格 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;
}
最佳答案
首先,您对列和行索引的计算不正确(它为每行中的最后一个单元格提供了错误的结果)。如果网格有 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;
关于ios - 计算与网格中目标距离的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23168669/