二。求點:
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...