GIS演算法基礎(一) 計算幾何基礎(上)
最近在學習GIS演算法,在學習過程中,想把一些經典的演算法或者思想記錄下來,分享給大家
計算幾何基礎本來是計算機圖形學的內容,但是GIS在影象處理中是離不開計算機處理的,所以GIS演算法基礎第一個應該是計算幾何基礎。
如何把空間實體的點線面以及他們之間的關係(例如,相交,包含,鄰接,疊置等等)用計算機語言表達出來,應該是這裡解決的第一個問題。前人已經有過這樣這樣的解決模型---DE-9IM模型(Dimensionally Extended nine-Intersection Model)
DE9IM模型是一種拓撲模型,他用於描述多邊形之間的關係。現有兩個多邊形,如果他們相交,那他們的邊界,內部,外部的交集情況是怎麼樣的?如果相離呢?情況又是怎樣的?DE9IM實際上就是一個3X3的矩陣,他儲存著兩個多邊形,邊界,內部,外部,的交集情況。
假如交集的結果用維數dim ={-1,0,1,2} 表示,-1代表無交集,0代表交集為一個點,1代表線,2代表面。
上面這個圖能很好的說明這個問題。 a,b代表兩個面,他們邊界,內部,外部,相交的結果就是 紅色的部分
例如a的內部和b的內部 交集應該是一個面,所以是2;a的邊界和b的邊界,交集應該是兩個點,所以是0;
總結一下:dim = -1 無交集;
dim = 0 交集中不包含線和麵,但至少包含一個點
dim = 1 交集中不包含面,但至少包含一個面
dim = 2 交集至少包含一個面
現在多邊形之間的問題的模型解決了,那麼如何用計算機語言表達呢?
上面也說了,這個交集的結果可以用一個3x3的矩陣表達。例如上邊的a,b交集結果 表達為:
2 1 2
1 0 1
2 1 2
於是,空間關係的描述可以歸納為:兩個幾何體,以表示兩個幾何體的DE-9IM結果的矩陣輸入,然後把這個矩陣轉為字串,例如上面這個就變為"212101212"了
如果我們說兩個多邊形相交,那就是他們的結果要有 0,1,2 也就是交集中游點或線或面
在計算機中就是 (0,1,2) ->true
(-1) ->false
(-1,0,1,2)->*
那麼上面那個字串就可以表示成"TTTTTTTTT"
經過前人的整理,空間關係的判斷可以通過特定的一些模式進行判斷
謂詞 | 返回值 | 描述 |
相等(Equals) | T*F**FFF* |
邊界上的點和內部的點全部重合。屬於相交的一種 |
相離(Disjoint) | FF*FF**** |
不相交,與相交相反 |
相接(Touches) | FT*******\ |
只有邊界上有共同點,內部沒有。屬於相交的一種 |
覆蓋(Covers) | T*****FF*\ |
b上的每個點都在a上(邊界和內部),且所有點都不在a外部。屬於相交的一種 |
疊置(Overlaps) |
|
a和b相交,且具有一部分共同點,但不是全部內部點。屬於相交的一種 |
所以,只要我們得到了兩個多邊形的DE9IM矩陣結果,我們就可以判斷他們之間的關係了。
那怎樣獲得兩個多邊形的交集結果呢?這關係到點,線,面-點,線,面 之間的判斷,這也是GIS演算法計算幾何中的一大部分的內容,這些我之後在寫把