計算幾何演算法概覽 演算法篇之求點

2021-04-06 15:48:32 字數 3213 閱讀 4796

二。求點:

23.計算點到線段的最近點:

如果該線段平行於x軸(y軸),則過點point作該線段所在直線的垂線,垂足很容易

該線段不平行於x軸也不平行於y軸,則斜率存在且不為0。設線段的兩端點為pt1和pt2,

斜率為:k = ( pt2.y - pt1. y ) / (pt2.x - pt1.x );該直線方程為:y = k* ( x -

pt1.x) + pt1.y。其垂線的斜率為 - 1 / k,垂線方程為:y = (-1/k) * (x -

point.x) + point.y 。

聯立兩直線方程解得:x = ( k^2 * pt1.x + k * (point.y - pt1.y ) +

的端點返回。

24.計算點到折線、矩形、多邊形的最近點:

只要分別計算點到每條線段的最近點,記錄最近距離,取其中最近距離最小的點即

可。

25.計算點到圓的最近距離及交點座標:

如果該點在圓心,因為圓心到圓周任一點的距離相等,返回undefined。

連線點p和圓心o,如果po平行於x軸,則根據p在o的左邊還是右邊計算出最近點的橫

座標為centerpoint.x - radius 或 centerpoint.x + radius。如果po平行於y軸,則根

據p在o的上邊還是下邊計算出最近點的縱座標為 centerpoint.y -+radius或

centerpoint.y - radius。如果po不平行於x軸和y軸,則po的斜率存在且不為0,這時直

線po斜率為k = ( p.y - o.y )/ ( p.x - o.x )。直線po的方程為:y = k * ( x -

p.x) + p.y。設圓方程為:(x - o.x ) ^2 + ( y - o.y ) ^2 = r ^2,聯立兩方程組可以

解出直線po和圓的交點,取其中離p點較近的交點即可。

26.計算兩條共線的線段的交點:

對於兩條共線的線段,它們之間的位置關係有下圖所示的幾種情況。圖(a)中兩條線

段沒有交點;圖 (b) 和 (d) 中兩條線段有無窮焦點;圖 (c) 中兩條線段有乙個交點。

設line1是兩條線段中較長的一條,line2是較短的一條,如果line1包含了line2的兩個端

點,則是圖(d)的情況,兩線段有無窮交點;如果line1只包含line2的乙個端點,那麼如

果line1的某個端點等於被line1包含的line2的那個端點,則是圖(c)的情況,這時兩線段

只有乙個交點,否則就是圖(b)的情況,兩線段也是有無窮的交點;如果line1不包含

line2的任何端點,則是圖(a)的情況,這時兩線段沒有交點。

27.計算線段或直線與線段的交點:

設一條線段為l0 = p1p2,另一條線段或直線為l1 = q1q2 ,要計算的就是l0和l1的

交點。

1. 首先判斷l0和l1是否相交(方法已在前文討論過),如果不相交則沒有交點,否則

說明l0和l1一定有交點,下面就將l0和l1都看作直線來考慮。

2. 如果p1和p2橫座標相同,即l0平行於y軸

a) 若l1也平行於y軸,

i. 若p1的縱座標和q1的縱座標相同,說明l0和l1共線,假如l1是直線的話他們

有無窮的交點,假如l1是線段的話可用"計算兩條共線線段的交點"的演算法求他們的交點

(該方法在前文已討論過);

ii. 否則說明l0和l1平行,他們沒有交點;

b) 若l1不平行於y軸,則交點橫座標為p1的橫座標,代入到l1的直線方程中可以計算

出交點縱座標;

3. 如果p1和p2橫座標不同,但是q1和q2橫座標相同,即l1平行於y軸,則交點橫座標

為q1的橫座標,代入到l0的直線方程中可以計算出交點縱座標;

4. 如果p1和p2縱座標相同,即l0平行於x軸

a) 若l1也平行於x軸,

i. 若p1的橫座標和q1的橫座標相同,說明l0和l1共線,假如l1是直線的話他們

有無窮的交點,假如l1是線段的話可用"計算兩條共線線段的交點"的演算法求他們的交點

(該方法在前文已討論過);

ii. 否則說明l0和l1平行,他們沒有交點;

b) 若l1不平行於x軸,則交點縱座標為p1的縱座標,代入到l1的直線方程中可以計算

出交點橫座標;

5. 如果p1和p2縱座標不同,但是q1和q2縱座標相同,即l1平行於x軸,則交點縱座標

為q1的縱座標,代入到l0的直線方程中可以計算出交點橫座標;

6. 剩下的情況就是l1和l0的斜率均存在且不為0的情況

a) 計算出l0的斜率k0,l1的斜率k1 ;

b) 如果k1 = k2 

i. 如果q1在l0上,則說明l0和l1共線,假如l1是直線的話有無窮交點,假如l1

是線段的話可用"計算兩條共線線段的交點"的演算法求他們的交點(該方法在前文已討論

過);

ii. 如果q1不在l0上,則說明l0和l1平行,他們沒有交點。

c) 聯立兩直線的方程組可以解出交點來

這個演算法並不複雜,但是要分情況討論清楚,尤其是當兩條線段共線的情況需要單獨

考慮,所以在前文將求兩條共線線段的演算法單獨寫出來。另外,一開始就先利用向量叉乘

判斷線段與線段(或直線)是否相交,如果結果是相交,那麼在後面就可以將線段全部看

作直線來考慮。需要注意的是,我們可以將直線或線段方程改寫為ax+by+c=0的形式,這

樣一來上述過程的部分步驟可以合併,縮短了**長度,但是由於先要求出引數,這種算

法將花費更多的時間。

28.  求線段或直線與折線、矩形、多邊形的交點:

分別求與每條邊的交點即可。

29.  求線段或直線與圓的交點:

設圓心為o,圓半徑為r,直線(或線段)l上的兩點為p1,p2。

1. 如果l是線段且p1,p2都包含在圓o內,則沒有交點;否則進行下一步。

2. 如果l平行於y軸,

a) 計算圓心到l的距離dis;

b) 如果dis > r 則l和圓沒有交點;

c) 利用勾股定理,可以求出兩交點座標,但要注意考慮l和圓的相切情況。

3. 如果l平行於x軸,做法與l平行於y軸的情況類似;

4. 如果l既不平行x軸也不平行y軸,可以求出l的斜率k,然後列出l的點斜式方程,

和圓方程聯立即可求解出l和圓的兩個交點;

5. 如果l是線段,對於2,3,4中求出的交點還要分別判斷是否屬於該線段的範圍

內。

計算幾何的演算法概覽 目錄篇

一 引言 計算機的出現使得很多原本十分繁瑣的工作得以大幅度簡化,但是也有一些在人們直 來很容易的問題卻需要拿出一套並不簡單的通用解決方案,比如幾何問題。作為計算 機科學的乙個分支,計算幾何主要研究解決幾何問題的演算法。在現代工程和數學領域,計 算幾何在圖形學 機械人技術 超大規模積體電路設計和統計等...

演算法 計算幾何

剛寫了乙個計算幾何的模板,這樣可以減少很多的函式,實現起來也很清楚,以後自己就這樣寫好了 常用計算 define vector point struct point vector operator vector a,vector b vector operator vector a,vector b...

演算法筆記 計算幾何之點積叉積的應用

模板 const double eps 1e 10 考慮誤差的加法 double add double a,double b 考慮誤差的與0比較 int dcmp double x struct p p double x,double y x x y y bool operator p p p op...