點到線段距離的兩種計算方法


this.Dsct = function (x1, y1, x2, y2) {
    var r, dx, dy;

    dx = x1 - x2;
    dy = y1 - y2;
    r = Math.sqrt(dx * dx + dy * dy);
    return r;
}

/*
直線到原點距離
d=abs(c)/sqrt(a*a+b*b)
直線公式
a*x+b*y+c=0; 
*/
this.LineToZeroDstc = function (x1, y1, x2, y2) {
    var a, b, c, r;

    //    模擬方式
    a = y2 - y1;
    b = x1 - x2;
    c = x2 * y1 - x1 * y2;
    r = Math.abs(c) / Math.sqrt(a * a + b * b);
    return r;
}

/*
                     C1         D            C2

A ------------------------------B
*/
this.Pt2LineDstc = function (px, py, x1, y1, x2, y2) {
    var rbd, rac, rbc, r, rd2, rab;

    rbd = LineToZeroDstc(x1 - px, y1 - py, x2 - px, y2 - py); //    平移后到原點距離
    rac = Dsct(px, py, x1, y1);
    rbc = Dsct(px, py, x2, y2);
    rab = Dsct(x1, y1, x2, y2);

    rd2 = rbd * rbd + rab * rab;
    if (rac * rac > rd2 || rbc * rbc > rd2)
        r = Math.min(rac, rbc);
    else
        r = rbd;
    return r;
}

//    用面積公式
//    2面積除長度就是高
this.Pt2LineDstc2 = function (px, py, x1, y1, x2, y2) {
    var s2, x3, y3, rab;

    x3 = px;
    y3 = py;
    s2 = Math.abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2));
    rab = Dsct(x1, y1, x2, y2);
    r = s / rab;
    return r;
}

this.test_Pt2LineDstc = function () {
    var pt, i, n, k, r1, r2;

    n = 1000;
    pt = [];
    for (i = 0; i < n; i++) {
        for (k = 0; k < 10; k++)
            pt[k] = Math.floor(Math.random() * 100);
        r1 = Pt2LineDstc(pt[0], pt[1], pt[2], pt[3], pt[4], pt[5]);
        r2 = Pt2LineDstc2(pt[0], pt[1], pt[2], pt[3], pt[4], pt[5]);
        if (Math.abs(r1 - r2) > 0.01) {
            console.log(r1, r2, "-", pt[0], pt[1], pt[2], pt[3], pt[4], pt[5]);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM