計算兩條共線的線段的交點

2021-08-30 18:49:05 字數 2989 閱讀 2758

計算幾何常用演算法

[url]

[/url]

摘要:計算機的出現使得很多原本十分繁瑣的工作得以大幅度簡化,但是也有一些在人們直**來很容易的問題卻需要拿出一套並不簡單的通用解決方案,比如幾何問題。作為電腦科學的乙個分支,計算幾何主要研究解決幾何問題的演算法。在現代工程和數學領域,計算幾何在圖形學、機械人技術、超大規模積體電路設計和統計等諸多領域有著十分重要的應用。在本文中,我們將對計算幾何常用的基本演算法做乙個全面的介紹,希望對您了解並應用計算幾何的知識解決問題起到幫助。

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

對於兩條共線的線段,它們之間的位置關係有下圖所示的幾種情況。圖(a)中兩條線段沒有交點;圖 (b) 和 (d) 中兩條線段有無窮焦點;圖 (c) 中兩條線段有乙個交點。設line1是兩條線段中較長的一條,line2是較短的一條,如果line1包含了line2的兩個端點,則是圖(d)的情況,兩線段有無窮交點;如果line1只包含line2的乙個端點,那麼如果line1的某個端點等於被line1包含的line2的那個端點,則是圖(c) 的情況,這時兩線段只有乙個交點,否則就是圖(b)的情況,兩線段也是有無窮的交點;如果line1不包含line2的任何端點,則是圖(a)的情況,這時兩線段沒有交點。

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

設一條線段為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的形式,這樣一來上述過程的部分步驟可以合併,縮短了**長度,但是由於先要求出引數,這種演算法將花費更多的時間。

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

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

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

設圓心為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中求出的交點還要分別判斷是否屬於該線段的範圍內。

凸包的概念:

點集q的凸包(convex hull)是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。下圖中由紅色線段表示的多邊形就是點集q=的凸包。

凸包的求法:

現在已經證明了凸包演算法的時間複雜度下界是o(n*logn),但是當凸包的頂點數h也被考慮進去的話,krikpatrick和seidel的剪枝搜尋演算法可以達到o(n*logh),在漸進意義下達到最優。最常用的凸包演算法是graham掃瞄法和jarvis步進法。本文只簡單介紹一下graham掃瞄法,其正確性的證明和jarvis步進法的過程大家可以參考《演算法導論》。

對於乙個有三個或以上點的點集q,graham掃瞄法的過程如下:

令p0為q中y-x座標排序下最小的點設為對其餘點按以p0為中心的極角逆時針排序所得的點集(如果有多個點有相同的極角,除了距p0最遠的點外全部移除 壓p0進棧s 壓p1進棧s 壓p2進棧s for i ← 3 to m do while 由s的棧頂元素的下乙個元素、s的棧頂元素以及pi構成的折線段不拐向左側 對s彈棧 壓pi進棧s return s;

此過程執行後,棧s由底至頂的元素就是q的凸包頂點按逆時針排列的點序列。需要注意的是,我們對點按極角逆時針排序時,並不需要真正求出極角,只需要求出任意兩點的次序就可以了。而這個步驟可以用前述的向量叉積性質實現。

四、結語

儘管人類對幾何學的研究從古代起便沒有中斷過,但是具體到借助計算機來解決幾何問題的研究,還只是停留在乙個初級階段,無論從應用領域還是發展前景來看,計算幾何學都值得我們認真學習、加以運用,希望這篇文章能帶你走進這個豐富多彩的世界。

C 根據兩條線段 計算該兩條直線的交點

也可以理解為 三角形乙個頂點 連線 內部某乙個點,延長後和另一條邊的交點。計算兩條直線的交點 l1的點1座標 l1的點2座標 l2的點1座標 l2的點2座標 public static xyz getintersection xyz linefirststar,xyz linefirstend,xy...

求兩條直線(線段)的交點

如圖,如何求得直線 ab 與直線 cd的交點p?以上內容摘自 演算法藝術與資訊學競賽 思路就是利用叉積求得點p分線段dc的比,然後利用高中學習的定比分點座標公式求得分點p的座標。看不懂的可以去複習下 定比分點 的知識。include include include include using nam...

計算幾何之求兩條線段的交點

這個圖是從知乎上儲存下來的 其實主要是利用了三角形的相似 如下 兩點式直線公式 x x1 x2 x1 y y1 y2 y1 x y2 y1 y x1 x2 x1 y1 y2 y1 x2 x1 0 a y2 y1,b x1 x2,c x1 y1 y2 y1 x2 x1 x,y d2 d1 d2 x3,...