Unity原型应用中Haversine公式计算距离遇定位数据不准确问题
Unity中Haversine距离计算的代码规范与注意点
嘿,我看你在Unity开发原型时,用Haversine公式计算地理距离,试了好几个网上的C#实现,结果表现完全一致。先帮你把给出的代码补全并规范格式化,再聊聊这里面的关键细节:
public static float Haversine(float lat1, float lon1, float lat2, float lon2) { float earthRadiusKm = 6372.8f; // 地球平均半径,单位:千米 float deltaLat = toRadians(lat2 - lat1); float deltaLon = toRadians(lon2 - lon1); lat1 = toRadians(lat1); lat2 = toRadians(lat2); // Haversine公式核心计算 float a = Mathf.Sin(deltaLat / 2) * Mathf.Sin(deltaLat / 2) + Mathf.Cos(lat1) * Mathf.Cos(lat2) * Mathf.Sin(deltaLon / 2) * Mathf.Sin(deltaLon / 2); float c = 2 * Mathf.Asin(Mathf.Sqrt(a)); return earthRadiusKm * c; } // 辅助方法:角度转弧度(Unity中推荐用Mathf.Deg2Rad) private static float toRadians(float degrees) { return degrees * Mathf.Deg2Rad; }
几个你需要注意的点:
- 单位控制:当前代码返回的是千米距离,如果需要米的话,把
earthRadiusKm改成6372800f就行,保持单位统一很重要。 - Unity适配:一定要用
UnityEngine.Mathf下的方法,别用System.Math——前者是专门为float类型优化的,更贴合Unity的运行环境,避免不必要的类型转换开销。 - 精度问题:如果你的原型需要计算跨大洲的远距离,或者对精度要求很高,可以把所有
float换成double,float的精度在极端场景下可能会有误差。 - 为啥多个版本结果一致?:其实这是正常的!Haversine公式的核心逻辑是固定的,只要各个实现没有逻辑错误(比如角度转弧度的步骤没漏、公式项没写错),计算结果自然会高度重合。如果是结果不符合你的预期,那大概率是输入的经纬度格式有问题(比如把度分秒当成了十进制度数),或者单位转换错了。
要是你是因为结果不对才来问的,可以补充下你的测试用例和预期结果,我再帮你排查问题~
内容的提问来源于stack exchange,提问作者Tiaan
相关产品推荐
相关产品推荐

