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);
}
有問題請大家直接指出。