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

时间:2014-04-19 10:08:58

标签: 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;
    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 个答案:

答案 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;