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

标签 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;



}

最佳答案

首先,您对列和行索引的计算不正确(它为每行中的最后一个单元格提供了错误的结果)。如果网格有 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/

相关文章:

ios - Objective-C 将 tableView indexPath 传递给另一个方法

ios - 使用 Swift 3 和 Alamofire 4 获取客户端证书以进行相互身份验证

ios - UITableView 无法识别 NumberOfRowsInSection

ios - iPhone - 为我的应用程序存储数据的最佳方式

math - 计算点到线段和线段到线段的平均距离

javascript - 调整大小脚本会放大,而不是缩小。使用行列式会让事情变得紧张

math - 在给定方向上通过距离移动笛卡尔坐标中的点

iphone - iOS View subview 无法识别自定义类成员

objective-c - @YES/@NO 和 YES/NO 有什么区别?

ios - 在不增加最后一位 Objective C iOS 的情况下舍入浮点值