多線段幾何圖形—— 簡單幾何圖形(從線段中搜索封閉圖形)
先直接給出結論
在連通圖(通俗的解釋 圖中每一個頂點最少可以到達兩根線。 同時我們把使用了此頂點的線段稱之為此頂點的連通線)中。
以頂點為圓心,則整個圓會被N個連通線劃分成N個圓心角。
如上圖,頂點A的圓,被劃分成1,2,3 圓弧角,則我們設AB邊代表角2,AD代表角3,AC,代表角1,這樣剛好一條邊對應一個圓弧角。
∠BAD和下一個角為∠DAC,可用AB邊和下一邊AD表示
結論:
1.在連通圖中,所有封閉圖形的角的數量和等於連通圖擁有的圓弧角的數量,則意味著,連通圖中所有圓弧角都是形成封閉圖形的必要元素(圓弧角不會被重複使用)。
如上圖,連通圖的圓弧角數量=10=A(3)+B(2)+C(2)+D(3)。尋找到封閉圖形3個ABD,ADC,ABDC,封閉圖形圓弧角=ABD(3)+ADC(3)+ABDC(4)=10。
2.封閉圖形中的每個圓弧角的旋轉方向是一致的(可使用正旋轉排序)。
如上圖,DB>>AB,BA>>DA,AD>>BD他們三者的旋轉方向一致(>>表示旋轉的意思,DB指向量,箭頭在D位置)
以通俗的話來說:
DB邊以B點為旋轉中心,逆時針旋轉第一個遇到的邊就是AB,
BA邊以A點為旋轉中心,逆時針旋轉第一個遇到的邊就是AD,
AD邊以D點為旋轉中心,逆時針旋轉第一個遇到的邊就是DB,
最後回到了開始的邊,那麼圖形尋找結束,每一條邊進行這個操作,則可以找到所有的圖形(在尋找的途中標記圓弧角是否已經被使用過。可以減少無用重複計算,同時可用來終止尋找)
3.每一條邊,都會成為兩個頂點的圓弧角所使用的邊。
得到結論後我們就可以著手設計演算法,
(因為一條邊剛好對應一個圓弧角,所以圓弧角和邊可以使用邊代替)
1.求出所有頂點的圓弧角。
2.對所有頂點的圓弧角進行固定繞序方向的排序(使用正旋轉排序,參照軸進行排序,例如x軸)。
3.以還有可用圓弧角的頂點開始。
4.找到這個圓弧角對應的另一個頂點,同時找到這個頂點對應圓弧角的下一個圓弧角。
例:
有A[B,C],B[A,C],C[A,B](A[B,C]的意思是,有頂點A,同時可以到達B,C兩點,可到達的點,是固定繞序排序好的)
則 第一次獲取到圓弧角 AB,那麼對應的B點圓弧為BA,下一個圓弧為BC,如此遞迴尋找可找到,A,B,C
5.重複步驟4,直至找到一個已經用過的圓弧角,則停止。
6.重複步驟3,直至頂點中沒有可用圓弧角
如上圖
1.先求出所有的圓弧角,並且排序好(逆時針,正旋轉)。
A[B,D,C] , B[A,D] , C[D,A] , D[B,C,A]
Ab[T,T,T] , Bb[T,T] ,Cb[T,T] ,Db[T,T,T] (T為此弧度沒有被使用過,F為使用過),用於標記所有的圓弧角的使用情況
開始尋找第一個封閉圖形G[];
2.找到頂點A,發現他有可用圓弧角(第一個),則新增A到封閉圖形中G[A],標記A頂點中第一可用圓弧角為使用狀態Ab[F,T,T]
3.封閉圖形G新增B,同時知道B是下個要使用的頂點(A的第一個元素就是B)。
我們知道上一個使用的頂點為A,而,A元素在B中的位置為1,1+1=2(相加大於總共的數量時取餘總數量即可).則我們下個要使用頂點為D,如此迴圈,直到找到開始點A結束。
則完成每個封閉圖形的過程和結果為
(A[B,D,C] , B[A,D] , C[D,A] , D[B,C,A] )
Ab[T,T,T] , Bb[T,T] ,Cb[T,T] ,Db[T,T,T]
(A[B,D,C] , B[A,D] , C[D,A] , D[B,C,A] )
G[A,B,D,C] Ab[F,T,T], Bb[T,F] ,Cb [T,F], Db[T,F,T]
(A[B,D,C] , B[A,D] , C[D,A] , D[B,C,A] )
G[A,D,B] Ab[F,F,T] , Bb[F,F],Cb[T,F], Db[F,F,T]
(A[B,D,C] , B[A,D] , C[D,A] , D[B,C,A] )
G[A,C,D] Ab[F,F,F],Bb[F,F] , Cb[F,F], Db[F,F,F]
ps:
如何給旋轉角度排序,可使用正旋轉參照x軸的旋轉度數進行排序。