冰楓論壇
標題:
[C#] 求解點到點/點到線距離
[打印本頁]
作者:
whitefox
時間:
2023-6-1 17:33
標題:
[C#] 求解點到點/點到線距離
以下方法都是建立在笛卡爾座標系上使用
/// <summary>
/// 點到點距離
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <returns></returns>
public static double GetDistancePP(Point p1, Point p2)
{
return Math.Sqrt(((p1.X - p2.X) * (p1.X - p2.X)) + ((p1.Y - p2.Y) * (p1.Y - p2.Y)));
}
複製代碼
直線算是兩個點的集合
/// <summary>
/// 點到直線距離
/// </summary>
/// <param name="p0"></param>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <returns></returns>
public static double GetDistancePL(Point p0, Point p1, Point p2)
{
double dist = 0;
double x1 = p1.X;
double y1 = p1.Y;
double x2 = p2.X;
double y2 = p2.Y;
// 垂直狀況
if (Math.Abs(x1 - x2) < 1e-6)
{
dist = Math.Abs(p0.X - x1);
}
else
{
// 根據點到直線距離公式計算
// 計算斜率和截距
double k = (y2 - y1) / (x2 - x1);
double b = (x2 * y1 - x1 * y2) / (x2 - x1);
dist = Math.Abs(k * p0.X - p0.Y + b) / Math.Sqrt(k * k + 1);
// 根據海龍公式(希羅公式)計算
// double lenP1P2 = GetDistancePP(p1, p2);
// double lenP0P1 = GetDistancePP(p0, p1);
// double lenP0P2 = GetDistancePP(p0, p2);
// double len = 0.5 * (lenP0P1 + lenP0P2 + lenP1P2);
// double area = Math.Sqrt(len * (len - lenP0P1) * (len - lenP0P2) * (len - lenP1P2));
// dist = 2 * area / lenP1P2;
}
return dist;
}
複製代碼
歡迎光臨 冰楓論壇 (https://bingfong.com/)
Powered by 冰楓