You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:40:42