C#實(shí)現(xiàn)計(jì)算兩個(gè)坐標(biāo)點(diǎn)直接距離的方法小結(jié)
在C#中計(jì)算兩個(gè)坐標(biāo)點(diǎn)之間的距離時(shí),方法的選擇取決于坐標(biāo)系的類(lèi)型以及您需要處理的具體情況。以下是幾種常見(jiàn)場(chǎng)景下的計(jì)算方法:
1. 平面直角坐標(biāo)系中的兩點(diǎn)距離
在二維平面直角坐標(biāo)系中,給定兩個(gè)點(diǎn)A(x1, y1)和B(x2, y2),它們之間的歐氏距離可以通過(guò)勾股定理計(jì)算:
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. 地球表面兩點(diǎn)間的距離(經(jīng)緯度坐標(biāo))
對(duì)于地球上的地理位置,即經(jīng)緯度坐標(biāo),通常采用球面幾何或者近似的橢球體模型來(lái)計(jì)算兩點(diǎn)間的距離。最常用的算法是Haversine公式,它可以準(zhǔn)確地計(jì)算地球上任意兩點(diǎn)間的最短距離(大圓距離)。以下是一個(gè)使用Haversine公式計(jì)算距離的C#實(shí)現(xiàn):
public static double CalculateDistanceInKilometers(double lat1, double lon1, double lat2, double lon2)
{
const double earthRadiusKm = 6371.0;
// 將角度轉(zhuǎn)為弧度
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. 三維空間中兩點(diǎn)的距離
在三維空間中,點(diǎn)A(x1, y1, z1)和點(diǎn)B(x2, y2, z2)之間的距離計(jì)算類(lèi)似二維情況,只需將三維坐標(biāo)分量的差值平方后求和,然后開(kāi)方:
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);
}
根據(jù)實(shí)際需求,選擇對(duì)應(yīng)的方法來(lái)計(jì)算坐標(biāo)點(diǎn)之間的距離即可。如果需要處理的是地球表面的經(jīng)緯度坐標(biāo),請(qǐng)使用第二種方法(Haversine公式)。如果是平面直角坐標(biāo)或三維空間坐標(biāo),則分別使用第一種或第三種方法。
4.知識(shí)補(bǔ)充
除了上文的方法,小編還整理了一些其他C#計(jì)算距離的方法,希望對(duì)大家有所幫助
C#計(jì)算兩個(gè)經(jīng)緯度的距離
//地球半徑,單位米
private const double EARTH_RADIUS = 6378137;
/// <summary>
/// 計(jì)算兩點(diǎn)位置的距離,返回兩點(diǎn)的距離,單位 米
/// 該公式為GOOGLE提供,誤差小于0.2米
/// </summary>
/// <param name="lat1">第一點(diǎn)緯度</param>
/// <param name="lng1">第一點(diǎn)經(jīng)度</param>
/// <param name="lat2">第二點(diǎn)緯度</param>
/// <param name="lng2">第二點(diǎn)經(jīng)度</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>
/// 經(jīng)緯度轉(zhuǎn)化成弧度
/// </summary>
/// <param name="d"></param>
/// <returns></returns>
private static double Rad(double d)
{
return (double)d * Math.PI / 180d;
}c#計(jì)算兩點(diǎn)坐標(biāo)距離
namespace 實(shí)驗(yàn)三
{
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));
}
}到此這篇關(guān)于C#實(shí)現(xiàn)計(jì)算兩個(gè)坐標(biāo)點(diǎn)直接距離的方法小結(jié)的文章就介紹到這了,更多相關(guān)C#計(jì)算兩個(gè)坐標(biāo)距離內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法
這篇文章主要介紹了初步認(rèn)識(shí)C#中的Lambda表達(dá)式和匿名方法,本文著重講解Lambda表達(dá)式和匿名方法的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-01-01
c# 兩個(gè)數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇c# 兩個(gè)數(shù)組比較,將重復(fù)部分去掉,返回不重復(fù)部分的實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
在C#中使用適配器Adapter模式和擴(kuò)展方法解決面向?qū)ο笤O(shè)計(jì)問(wèn)題記錄
在開(kāi)發(fā)基于MonoGame的游戲框架時(shí),面臨SpriteFont和DynamicSpriteFont兼容問(wèn)題,SpriteFont在內(nèi)容管道中編譯確定字號(hào),導(dǎo)致不同字號(hào)需加載多個(gè)字體資源,本文給大家介紹在C#中使用適配器Adapter模式和擴(kuò)展方法解決面向?qū)ο笤O(shè)計(jì)問(wèn)題,感興趣的朋友一起看看吧2024-10-10
C# Bitmap圖像處理(含增強(qiáng)對(duì)比度的三種方法)
本文主要介紹了C# Bitmap圖像處理(含增強(qiáng)對(duì)比度的三種方法),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
DevExpress中GridControl列轉(zhuǎn)義的實(shí)現(xiàn)方法
這篇文章主要介紹了DevExpress中GridControl列轉(zhuǎn)義的實(shí)現(xiàn)方法,在項(xiàng)目開(kāi)發(fā)中有一定的實(shí)用價(jià)值,需要的朋友可以參考下2014-08-08
使用C#來(lái)編寫(xiě)一個(gè)異步的Socket服務(wù)器
這篇文章主要介紹了使用C#來(lái)編寫(xiě)一個(gè)異步的Socket服務(wù)器,通過(guò)無(wú)阻塞機(jī)制來(lái)獲取更高的處理效率,需要的朋友可以參考下2015-07-07
Unity3D實(shí)現(xiàn)模型隨機(jī)切割
這篇文章主要為大家詳細(xì)介紹了Unity3D實(shí)現(xiàn)模型隨機(jī)切割,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03

