求點到直線 線段的距離 TS實現

2021-10-12 23:05:24 字數 2901 閱讀 2076

如上圖所示,點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;

dy = yb - ya;

q = |ad|/|ab|,使得

xd = xa + q·dx;

yd = ya + q·dy;

令|ac| = m,|ad| = n,|cd|=o,根據兩點距離公式得出:

方程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的左側;

當xd > xb && yd > yb時,d在ab的右側;

(有人可能會問,你上面的圖直線的斜率k是大於0的,如果小於0的話,這個就不成立了!)借用上面的方程,設dx,dy均不等於0。

dx = xb - xa;

dy = yb - ya;

xd = xa + q·dx;

yd = ya + q·dy;

分析得到:

當xd < xa && yd < ya時,q < 0;

當xd < xa && yd < ya時,q > 1;(xb = xa + dx);

(這邊如果直線斜率k < 0,那麼dy一定是小於0的,負負得正,又剛好滿足條件)所以,求點到線段的長度**實現如下

/**

* 求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...