日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法导论之计算几何学

發(fā)布時間:2025/4/16 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法导论之计算几何学 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

計算幾何學是計算機科學的一個分支,專門研究集合問題的解決的算法。計算幾何學的問題一般輸入關于一組集合對象的描述,如一組點、一組線段;輸出是對問題的回答,如直線是否相交。三維空間和高維空間很難視覺化,這里計算幾何學主要基于二維平面,輸入對象用一組點<p1,p2,p3,…>來表示,其中每個pi=(xi,yi),xi,yi∈R。

1)線段的性質

兩個不同的點p1=(x1,y1)和p2=(x2,y2)的凸組合是滿足下列條件的任意點p3=(x3,y3):對某個a(0≤a≤1),有x3=ax1+(1-a)x2,y3=ay1+(1-a)y2,即p3=ap1+(1-a)p2。p3是位于穿過p1和p2的直線上、并處于p1和p2之間(包括p1和p2兩點)的任意點,在給定兩個不同的點p1和p2的情況下,線段p1p2是p1和p2的凸組合(convex combination)的集合。p1和p2是線段p1p2的端點,并需要考慮p1和p2之間的順序。

在回答計算集合線段性質上,一般選擇加法、減法、乘法和比較運算,避免使用除法和三角函數(shù),因為這二者計算代價高昂且容易產生舍入誤差降低精度。

叉積:

叉積是關于線段算法的中心,定義為p1Xp2,是由點(0,0)、p1、p2、和p1+p2=(x1+x2,y1+y2)所形成的平行四邊形的面積,也等價于一個矩陣的行列式:


如果p1Xp2為正數(shù),則相對于原點(0,0)來說,p1在p2的順時針方向上;如果為負數(shù),則p1在p2的逆時針方向上;如果為0,即在邊界,則兩個向量是共線的,指向同一個方向或相反的方向。

要確定公共端點p0,有向線段p0p1是否在有向線段p0p2的順時針方向上,可計算叉積:

(p1-p0)X(p2-p0)=(x1-x0)(y2-y0)-(x2-x0)(y1-y0)

如果該積為正,則向線段p0p1在有向線段p0p2的順時針方向上;如果為負,則向線段p0p1在有向線段p0p2的逆時針方向上。

連續(xù)線段的轉向判斷:

問題是在點p1處,兩條連續(xù)的線段p0p1和p1p2是向左轉還是向右轉,就是確定p0p1p1的角的轉向。應用叉積,檢查有向線段p0p2是在有向線段p0p1的順時針方向還是逆時針方向即可判斷。計算叉積(p2-p0)X(p1-p0),為負,則p0p2在p0p1的逆時針方向,在p1點會左轉;如果為正,則p0p2在p0p1的順時針方向,在p1點會右轉。

兩個線段的相交判斷:

要確定兩個線段是否相交,通過每個線段是否跨越了包含另一條線段的直線。給定一個線段p1p2,如果點p1位于某一直線的一邊,而點p2位于該直線的另一邊,則稱線段p1p2跨越了該直線。如果p1和p2就落在該直線上的話,就是出現(xiàn)邊界情況。

兩個線段相交,當且僅當下面兩個條件中的一個成立,或同時成立:

第一:每個線段都跨越包含了另一個線段的直線;

第二:一個線段的某一端點位于另一線段上(邊界情況)。

算法偽碼上主要是兩個過程:第一個過程是計算每個端點相對于另一條線的方位,就是計算三個點的轉向判斷,得出相對方位d;第二個過程對d非零和零進行判斷。

2)確定任意一對線段是否相交

要確定任意一對線段是否相交,采用掃除技術,算法運行時間是O(nlgn),其中n是已知的線段數(shù)目。掃除技術只確定是否存在相交的線段,并不輸出所有的相交點。掃除算法的過程,是假設存在一條垂直掃除線,自左向右依次穿過已知的幾何物體,如果從x軸方向來看,就是一組垂直的線沿著時間橫掃。掃除技術有兩點假設:第一假定沒有一條輸入線是垂直的;第二假設沒有三條輸入線相交于同一點。掃除過程中,根據(jù)掃除線和線段相交的交點的y坐標值進行排序。對一個一條線段來說,掃除線從線段的左端點開始到右端點離開,過程中y的值隨著x的變化而變化,從而有不同的排序。這個很好理解,兩條線段的y值在前后掃除線的不同時間點具有不同的排序(大小出現(xiàn)顛倒),則說明有相交。

掃除算法維護兩組數(shù)據(jù):第一掃除線狀態(tài),記錄了與掃除線相交的線段之間的關系;第二事件點調度,記錄從左到右的x坐標的序列。

掃除線狀態(tài)是一個全序T,用一顆紅黑樹實現(xiàn),可在T上執(zhí)行四個操作:

Insert(T,s),將線段s插入到T中。

Delete(T,s),將線段s從T 中刪除。

Above(T,s),返回T中緊靠線段s上面的線段。

Below(T,s),返回T中緊靠線段s下面的線段。

算法的偽碼描述就不具體展開,算法輸入n個線段組成的集合S,如果S中有任意一對線段相交,則輸出TRUE布爾值。算法整個過程通俗的理解就是:一條垂直的線沿著x軸自左向右掃過去,S集合中的線段在掃除線的每個事件點(x軸上的點)對線段y值進行排序。導論中圖示表示很清晰,也做了證明。

3)尋找凸包

點集Q的凸包(convex hull)是一個最小的凸多邊形P,滿足Q中的每個點或者在P的邊界上,或者在P的內部,用CH(Q)表示凸包。計算包含n個點的點集的凸包,有兩種都是按照逆時針方向順序輸出凸包的各個頂點,一個是Graham掃描法,運行時間O(nlgn);還有一個是Jarvis步進法,運行時間是O(nh)。直觀上說,找出凸包的頂點就可以,兩種算法都運用了旋轉掃除技術,根據(jù)每個頂點對一個參照頂點的極角大小,依次處理。思路上就是選取參照點,計算凸包中和參照點的關系。

凸包問題和計算幾何中的最遠點對問題也相近,已知平面上的n個點的集合,找出他們中距離最遠的兩個點。還有其他算法,如增量算法、分治法、剪枝-搜索法。

Graham掃描法:

Graham掃描法通過設置一個候選點的堆棧S來解決凸包問題。輸入集合Q中的每個點都被壓入棧一次,非凸包CH(Q)中頂點的點被彈出堆棧,算法終止時,堆棧S中僅包含CH(Q)中的頂點,其順序為各點在邊界上出現(xiàn)的逆時針方向排列的順序。

具體偽碼和案例及其正確定證明不描述,主要說下算法過程:首先選擇參照點p0,一般選擇頂點(最下邊或最右邊這種);其次將所有點按照和p0極角大小遞增順序壓入堆棧;接著依次彈出右轉的非凸包頂點,最后剩下就是凸包的頂點。

Jarvis步進法:

Jarvis步進法采用打包(package wrapping)技術來計算一個點集Q的凸包,算法運行時間為O(nh),其中h是CH(Q)的頂點數(shù)。

該方法的思路可以這樣理解:找出Q集合中的最低點p0(y值最小),這是凸包的一個頂點,以該點為基礎放射出一條無限長的線段,從右邊開始沿上掃描,直到碰到一個點(遇到的點都是頂點),直到360度旋轉回p0點。

這個過程中最重要的是,掃描過程中界定遇到的點是頂點,理論上,找出具有最小極角的點,如果極角相同再找出距離最遠的點(x軸的距離)。

4)尋找最近點對

在n≥2個點的集合Q中尋2找最近點對的問題。最近通常理解為歐幾里得距離,點p1=(x1,y1)和p2=(x2,y2)之間的距離為:

如果集合中兩個點重合,那距離就是0。尋找最近點對問題應用在空中或海洋交通控制系統(tǒng)中,用于發(fā)現(xiàn)兩個距離最近的交通工具,以便檢測出可能發(fā)生的相撞事故。

一般簡單的做法,就是計算出所有點的兩兩距離,然后得出最近點對,這個算法是點數(shù)n的平方時間性能。如果應用分治算法,采用遞歸T(n)=2T(n/2)+O(n),算法運行時間為O(nlgn)。下面描述分治算法的思路。

分治算法的每一次遞歸調用輸入為子集P?Q和數(shù)組X和Y,每個數(shù)組均包含輸入子集P的所有點。數(shù)組X中點,按x坐標單調遞增排序;同樣的,數(shù)組Y中的點,按y坐標單調遞增排序。遞歸退出在檢查|P|≤3,如果小于等于3個點,那直接就兩兩比較;如果大于3,則接著分治。具體步驟:

第一分解:找出一條垂直線L,將點集P劃分為左右兩個集合PL和PR,需要滿足二者的點數(shù)是P的二分之一。自然,數(shù)組X就也劃分兩個數(shù)組XL和XR,數(shù)組Y也 劃分為兩個數(shù)組YL和YR

第二解決:P劃分成PL和PR后,進行兩次遞歸調用,一次找出PL的最近點對,返回最近點對距離l,一次找出PR的最近點對,返回最近點對距離r;取min(l,r)返回。

第三合并:最近點對,要么是某次遞歸調用返回的取min(l,r)距離,要么就是?? PL中的一個點和PR中的一個點組成點對,算法中需要確定跨數(shù)組的點對距離和min(l,r)距離關系;如果小于,則點對中的兩個點一定在距離垂直線L的min(l,r)單位內;這樣就建立一個以垂直線L為中心,寬度為2 min(l,r)的垂直帶形區(qū)域內;找出這樣點對,需要對數(shù)組Y內不在該區(qū)域的點去掉,剩下依舊按照y坐標順序排序;對數(shù)組Y中在區(qū)域內的所有點,找出距離其在min(l,r)單位距離內的點,并記錄下其點對距離;如果存在比min(l,r)更小的,則返回該點及其距離。

算法的正確性就不多敘述,其實計算幾何需要抽象去理解,好在二維的還是比較好理解。

總結

以上是生活随笔為你收集整理的算法导论之计算几何学的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。