天天看點

JavaScript中點到一個直線的最短距離

JavaScript中點到一個直線的最短距離(面積算法)(2D)

這兩天遇見個問題,平面上計算點到直線的距離,原來數學白學了。不過還是搞出來了。記錄一下源碼

/**
 * 點到線的最短距離實際上就是點到線的垂直距離。
 * (x,y)為點的坐标
 * (x1,y1)為線段上點的坐标
 * (x2,y2)為線段另外一點的坐标
 * 将點連接配接上兩個線段的
 */
Util.distanceOfPointAndLine = function(x, y, x1, y1, x2, y2)
{
    //三角形三個邊長
    var A = Math.abs(Math.sqrt(Math.pow((x - x1), 2) + Math.pow((y - y1), 2)));
    var B = Math.abs(Math.sqrt(Math.pow((x - x2), 2) + Math.pow((y - y2), 2)));
    var C = Math.abs(Math.sqrt(Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2)));
    //利用海倫公式計算三角形面積
    //周長的一半
    var P = (A + B + C) / 2;
    var allArea = Math.abs(Math.sqrt(P * (P - A) * (P - B) * (P - C)));
    //普通公式計算三角形面積反推點到線的垂直距離
    var dis = (2 * allArea) / C;
    return dis;
}
           
/**
 * 點到線的最短距離實際上就是點到線的垂直距離。
 * (x,y)為點的坐标
 * (x1,y1)為線段上點的坐标
 * (x2,y2)為線段另外一點的坐标
 */
Util.distanceOfPoint2Line = function(x, y, x1, y1, x2, y2) {
    var A = x - x1;
    var B = y - y1;
    var C = x2 - x1;
    var D = y2 - y1;

    var dot = A * C + B * D;
    var len_sq = C * C + D * D;
    var param = -1;
    if (len_sq != 0) //線段長度不能為0
        param = dot / len_sq;

    var xx, yy;

    if (param < 0) {
        xx = x1;
        yy = y1;
    }
    else if (param > 1) {
        xx = x2;
        yy = y2;
    }
    else {
        xx = x1 + param * C;
        yy = y1 + param * D;
    }

    var dx = x - xx;
    var dy = y - yy;
    return Math.sqrt(dx * dx + dy * dy);
}
           

有問題請大家直接指出。

繼續閱讀