Ios 计算网格中与目标的距离的最佳方法
我有一个这样的网格 我需要计算从细胞到目标的距离。例如,单元64是目标,单元99是当前位置 99的可能路径必须是例如单元格83、83、66和65 路径76、62、63不正确 我用这个函数计算距离,但我认为它没有很好的加权Ios 计算网格中与目标的距离的最佳方法,ios,objective-c,geometry,distance,Ios,Objective C,Geometry,Distance,我有一个这样的网格 我需要计算从细胞到目标的距离。例如,单元64是目标,单元99是当前位置 99的可能路径必须是例如单元格83、83、66和65 路径76、62、63不正确 我用这个函数计算距离,但我认为它没有很好的加权 -(float)distanceFromTarget:(int)targetCoordinate ofCurrentObject:(int)objectCoordinate{ int columnTarget = (targetCoordinate % 15)-1;
-(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);
给,,
i、 e.单元格中心之间的直线长度
如果你想计算“最短路径”,其中水平,垂直和对角线 如果允许移动,则距离将为
int distance = MAX(deltaX, deltaY);
如果只允许水平和垂直移动,则最短的
路径是
非常感谢你的回答!我喜欢!我只有一些疑问,1)我无法理解浮动距离=hypotf(deltaX,deltaY)之间的区别;整数距离=最大值(deltaX,deltaY);2) 如何使距离正常化?例如,最大值必须介于0和10之间。3) 使用我的代码,例如,如果目标在单元格62中,对象在单元格69中。我的功能将使61号单元格的输出距离更长!但这是不允许的。。。我该怎么解决这个问题?@usi:允许什么动作?水平、垂直和对角。但是物体不能越过边界。例如,它不能直接从69号单元格转到61号单元格!在该位置,距离必须较高,以阻止对象在单元格61中选择该路径。单元格68中的距离必须更小,以便对象选择它@usi:Then
distance=MAX(deltaX,deltaY)
应该正是您所需要的。这是所需的移动次数。例如,从69到61移动8次,从64到99移动5次。@usi:你说的“圆”到底是什么意思?如果您想检查对象和目标之间的距离是否最大为“raggio”,那么您应该按照我在回答中所说的计算距离,然后检查If(distance>0&&distance)
int distance = deltaX + deltaY;