1. 程式人生 > >多線段幾何圖形—— 簡單幾何圖形(從線段中搜索封閉圖形)

多線段幾何圖形—— 簡單幾何圖形(從線段中搜索封閉圖形)

先直接給出結論

在連通圖(通俗的解釋 圖中每一個頂點最少可以到達兩根線。 同時我們把使用了此頂點的線段稱之為此頂點的連通線)中。

以頂點為圓心,則整個圓會被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軸的旋轉度數進行排序。