多线段几何图形—— 简单几何图形(从线段中搜索封闭图形)

先直接给出结论

在连通图(通俗的解释 图中每一个顶点最少可以到达两根线。 同时我们把使用了此顶点的线段称之为此顶点的连通线)中。

以顶点为圆心,则整个圆会被N个连通线划分成N个圆心角。



多线段几何图形—— 简单几何图形(从线段中搜索封闭图形)_第1张图片

如上图,顶点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张图片


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,直至顶点中没有可用圆弧角



多线段几何图形—— 简单几何图形(从线段中搜索封闭图形)_第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轴的旋转度数进行排序。

你可能感兴趣的:(多线段几何图形—— 简单几何图形(从线段中搜索封闭图形))