如上圖所示,點c為直線ab外一點,cd⊥ab,那麼cd的模長就是點c到直線ab的距離。所以求點到直線得距離,就是求cd得長度。
作輔助線如上圖所示,要求得線段cd得長度,需要知道點d得座標,剩下求兩點距離就變得簡單了。
為求得點d得座標。
**令a(xa,ya),b(xb,yb),c(xc,yc),d(xd,yd)**其中,a,b,c的座標已知(如果不已知也沒法求呀)。
dx = xb - xa;設q = |ad|/|ab|,使得dy = yb - ya;
xd = xa + q·dx;令|ac| = m,|ad| = n,|cd|=o,根據兩點距離公式得出:yd = ya + q·dy;
方程a: m2 = (xc - xa)2 + (yc - ya)2;根據勾股定理得知,方程b: n2 = (xd - xa)2 + (yd - ya)2;
方程c: o2 = (xd - xc)2 + (yd - yc)2;
m2=n2+o2;
將方程a,b,c代入上式,得:
(xc - xa)2 + (yc - ya)2 = (xd - xa)2+(yd - ya)o2 + (xd - xc)2+(yd - yc)2這個求方程的過程可以自己導一下。展開化簡得出:
方程d: -xa·xc - yc·ya = xd2 + xa2- xd·xa+ yd2 - yd·ya - xd·xc - yd·yc;
將xd = xa + q·dx;yd = ya + q·dy代入方程d,
求得: q = (dx(xc - xa) + dy(yc - ya))/(dx2 + dy2);
又 xd = xa + q·dx;yd = ya + q·dy;
所以:xd = (dx(xc - xa) + dy(yc - ya))/(dx2+ dy2) * dx + xa;
yd = (dx(xc - xa) + dy(yc - ya))/(dx2 + dy2) * dy + ya;
求得d得座標,就可以根據兩點間距離公式得到點到直線得距離。
ts**實現如下:
/**
* 求c到直線ab得距離
* @param c 直線外一點
* @param a 直線上一點
* @param b 直線上一點
*/static
pointtolinedistance(c
,a,b
)else
;// 得到d得座標
} dx =
d.x -
c.x;
dy =
d.y -
c.y;
return math.
sqrt
(dx*dx + dy*dy)
;}
這邊拓展一下點到線段得距離,當c到ab得垂足d,不在a,b之間得時候,求出點c到線段ab兩端點最近得距離。
分析上圖
當d在ab的左側時,c點距離a點更近,如綠色的cd所示;此時返回|ac|的長度;
當d在ab的右側時,c點距離b點更近,如藍色的cd所示;此時返回|bc|的長度;
那如何判斷d在ab的左側還是右側呢?
因為b,c,d共線,如圖中所示
當xd < xa && yd < ya時,d在ab的左側;(有人可能會問,你上面的圖直線的斜率k是大於0的,如果小於0的話,這個就不成立了!)借用上面的方程,設dx,dy均不等於0。當xd > xb && yd > yb時,d在ab的右側;
dx = xb - xa;分析得到:dy = yb - ya;
xd = xa + q·dx;
yd = ya + q·dy;
當xd < xa && yd < ya時,q < 0;(這邊如果直線斜率k < 0,那麼dy一定是小於0的,負負得正,又剛好滿足條件)所以,求點到線段的長度**實現如下當xd < xa && yd < ya時,q > 1;(xb = xa + dx);
/**
* 求c到線段ab得距離
* @param c 線段外一點
* @param a 線段上一點
* @param b 線段上一點
*/static
pointtolinesegmentdistance(c
,a,b
)else
;// 得到d得座標
}
dx =
d.x -
c.x;
dy =
d.y -
c.y;
return math.
sqrt
(dx*dx + dy*dy)
;
求點到直線的距離
關於點到直線的距離,在vtkline中有乙個方法 distancetoline 用法 double closestpt1 3 double t1 3 double dist0 vtkline distancetoline seed,first seed,second seed,t1,closestp...
點到直線和點到線段的最短距離
一.點到直線距離 已知乙個點p x0,y0 求點到直線ax by c 0的距離公式為 d ax0 by0 c的絕對值 a 2 b 2 的算術平方根 如求點p 1,2 到直線2x y 10 0的距離 x0 1,y0 2,a 2,b 1,c 10 代入公式 d 2 1 1 2 10 的絕對值 根號 2 ...
java怎麼求點到線段的距離
抽取了個函式,測試過可以執行,小白拿去使用。public doublepointline disp doublexx,doubleyy,doublex1,doubley1,doublex2,doubley2 如果點 xx,yy到點x1,y1 這條邊短 if a b else m xx x1 a if...