C#实现计算两个坐标点直接距离的方法小结

 更新时间:2024年04月24日 10:01:13   作者:wangnaisheng  
这篇文章主要为大家详细介绍了C#中几种常见场景下两个坐标点直接距离的计算方法,文中的示例代码讲解详细,有需要的可以参考一下

在C#中计算两个坐标点之间的距离时,方法的选择取决于坐标系的类型以及您需要处理的具体情况。以下是几种常见场景下的计算方法:

1. 平面直角坐标系中的两点距离

在二维平面直角坐标系中,给定两个点A(x1, y1)和B(x2, y2),它们之间的欧氏距离可以通过勾股定理计算:

public static double CalculateDistance(Point p1, Point p2)
{
    double dx = p2.X - p1.X;
    double dy = p2.Y - p1.Y;
    return Math.Sqrt(dx * dx + dy * dy);
}

public static double DistanceBetweenPoints(double x1, double y1, double x2, double y2)
{
    double dx = x2 - x1;
    double dy = y2 - y1;
    return Math.Sqrt(dx * dx + dy * dy);
}

2. 地球表面两点间的距离(经纬度坐标)

对于地球上的地理位置,即经纬度坐标,通常采用球面几何或者近似的椭球体模型来计算两点间的距离。最常用的算法是Haversine公式,它可以准确地计算地球上任意两点间的最短距离(大圆距离)。以下是一个使用Haversine公式计算距离的C#实现:

public static double CalculateDistanceInKilometers(double lat1, double lon1, double lat2, double lon2)
{
    const double earthRadiusKm = 6371.0;
 
    // 将角度转为弧度
    double dLat = ToRadians(lat2 - lat1);
    double dLon = ToRadians(lon2 - lon1);
 
    lat1 = ToRadians(lat1);
    lat2 = ToRadians(lat2);
 
    double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
              Math.Sin(dLon / 2) * Math.Sin(dLon / 2) *
              Math.Cos(lat1) * Math.Cos(lat2);
    double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
 
    return earthRadiusKm * c;
}
 
private static double ToRadians(double degrees)
{
    return degrees * Math.PI / 180;
}

3. 三维空间中两点的距离

在三维空间中,点A(x1, y1, z1)和点B(x2, y2, z2)之间的距离计算类似二维情况,只需将三维坐标分量的差值平方后求和,然后开方:

public static double DistanceIn3DSpace(double x1, double y1, double z1, double x2, double y2, double z2)
{
    double dx = x2 - x1;
    double dy = y2 - y1;
    double dz = z2 - z1;
    return Math.Sqrt(dx * dx + dy * dy + dz * dz);
}

根据实际需求,选择对应的方法来计算坐标点之间的距离即可。如果需要处理的是地球表面的经纬度坐标,请使用第二种方法(Haversine公式)。如果是平面直角坐标或三维空间坐标,则分别使用第一种或第三种方法。

4.知识补充

除了上文的方法,小编还整理了一些其他C#计算距离的方法,希望对大家有所帮助

C#计算两个经纬度的距离

//地球半径,单位米
       private const double EARTH_RADIUS = 6378137;
       /// <summary>
       /// 计算两点位置的距离,返回两点的距离,单位 米
       /// 该公式为GOOGLE提供,误差小于0.2米
       /// </summary>
       /// <param name="lat1">第一点纬度</param>
       /// <param name="lng1">第一点经度</param>
       /// <param name="lat2">第二点纬度</param>
       /// <param name="lng2">第二点经度</param>
       /// <returns></returns>
       public static double GetDistance(double lat1, double lng1, double lat2, double lng2)
       {
           double radLat1 = Rad(lat1);
           double radLng1 = Rad(lng1);
           double radLat2 = Rad(lat2);
           double radLng2 = Rad(lng2);
           double a = radLat1 - radLat2;
           double b = radLng1 - radLng2;
           double result = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) * Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2))) * EARTH_RADIUS;
           return result;
       }
 
       /// <summary>
       /// 经纬度转化成弧度
       /// </summary>
       /// <param name="d"></param>
       /// <returns></returns>
       private static double Rad(double d)
       {
           return (double)d * Math.PI / 180d;
       }

c#计算两点坐标距离

namespace 实验三
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            double x1 = Convert.ToDouble(textBox4.Text );
            double y1 = Convert.ToDouble(textBox3.Text);
            double x2 = Convert.ToDouble(textBox1.Text);
            double y2 = Convert.ToDouble(textBox2.Text);
            Class1 s1 = new Class1(x1, y1, x2, y2);
            textBox5.Text = string.Format("{0}", s1.point());
        }
       ......
     }
}
class Class1
{
    private double x1, y1, x2, y2;
    public double X1
    {get{return this.x1;}}
    public double Y1
    {get{return this.y1;}}
    public double X2
    {get{return this.x2;}}
    public double Y2
    {get{return this.y2;}}
    public Class1(double x1,double y1,double x2,double y2)
    {
        this.x1 = x1;
        this.y1 = y1;
        this.x2 = x2;
        this.y2 = y2;
    }
     public double point()
    {
        return Math.Sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
    }
}

到此这篇关于C#实现计算两个坐标点直接距离的方法小结的文章就介绍到这了,更多相关C#计算两个坐标距离内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 深入c# Func委托的详解

    深入c# Func委托的详解

    本篇文章是对c#中的Func委托进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • C# 实现在控制台上换行输出与不换行输出

    C# 实现在控制台上换行输出与不换行输出

    这篇文章主要介绍了C# 实现在控制台上换行输出与不换行输出,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 通过C#实现给Word文档添加文字和图片水印

    通过C#实现给Word文档添加文字和图片水印

    在日常办公中,给Word文档添加水印是个常见需求,下面小编就和大家讲讲如何使用 C# 结合免费库 Free Spire.Doc for .NET 给 Word 文档添加水印,包括文本水印和图片水印吧
    2025-10-10
  • C#正则检测字符串是否字母数字混编的方法

    C#正则检测字符串是否字母数字混编的方法

    这篇文章主要介绍了C#正则检测字符串是否字母数字混编的方法,涉及C#正则判定字符串的使用技巧,需要的朋友可以参考下
    2015-06-06
  • 通俗易懂的C#之反射教程

    通俗易懂的C#之反射教程

    这篇文章主要介绍了通俗易懂的C#之反射教程,本文深入分析了反射内部的原理,剖析了内部属性、方法的运作,并用通俗易懂的语言阐述,需要的朋友可以参考下
    2015-01-01
  • C# 计算标准偏差相当于Excel中的STDEV函数实例

    C# 计算标准偏差相当于Excel中的STDEV函数实例

    下面小编就为大家带来一篇C# 计算标准偏差相当于Excel中的STDEV函数实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • C#中Invoke的具体使用

    C#中Invoke的具体使用

    本文主要介绍了C#中Invoke的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • C#采用OpenXml给Word文档添加表格

    C#采用OpenXml给Word文档添加表格

    这篇文章主要介绍了C#采用OpenXml给Word文档添加表格的方法,是OpenXml操作Word的一个非常实用的技巧,需要的朋友可以参考下
    2014-09-09
  • C# WinForm快捷键设置技巧

    C# WinForm快捷键设置技巧

    这篇文章主要给大家介绍C# winform快捷键设置技巧,涉及到C winform快捷键相关知识,对C winform知识感兴趣的朋友可以参考下本篇文章
    2015-10-10
  • C# 格式化字符串的实现代码

    C# 格式化字符串的实现代码

    这篇文章主要介绍了C# 格式化字符串的实现代码,需要的朋友可以参考下
    2016-11-11

最新评论