whitefox 發表於 2023-6-1 17:33:13

[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;
}
頁: [1]
查看完整版本: [C#] 求解點到點/點到線距離