Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/93.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 计算网格中与目标的距离的最佳方法_Ios_Objective C_Geometry_Distance - Fatal编程技术网

Ios 计算网格中与目标的距离的最佳方法

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;

我有一个这样的网格

我需要计算从细胞到目标的距离。例如,单元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);
给,, 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;