A=['S3','S2','S1'] B=['S4','S6','S1'] C=['S2','S5','S4'] D=['S3','S6','S5'] N=[A,B,C,D] #节点表,每个点记录顺时针方向排序的弧段 N0=['A','B','C','D'] #节点的字符表 S1=['A','B'] S2=['C','A'] S3=['D','A'] S4=['B','C'] S5=['C','D'] S6=['B','D'] S=[S1,S2,S3,S4,S5,S6] #弧段表,每个弧段含有起始点和终点 S0=['S1','S2','S3','S4','S5','S6'] #弧段的字符表 P=[] def du(Si,P): #定义弧段的‘度’,弧段属于一个多边形度就加一 d=0 for Pi in P: if Si in Pi: d=d+1 return d for i,Si in enumerate(S0): for j,Nj in enumerate(N0): if du(Si,P)==1: #如果某弧段度等于1,将其从弧段表中删去 S0.remove(Si) S.remove(S[i]) elif du(Si,P)==2: #如果某弧段度等于2,将其从节点的弧段排序中删去 N[j].remove(Si) else: Pc=[Si] #建立当前多边形 Sc=Si #当前边 Ns=S[i][0] #起点 Nc=S[i][1] #当前点 while Ns != Nc: k=N0.index(Nc) p=N[k].index(Sc) #寻找当前点字符对应的节点,并在结点表中找到当前边位置 p1=p+1 #当前边在表中下一条边的位置 if p1 > len(N[k]): i_p1=0 Sc=N[k][p1] #把下一条边设为当前边 Pc.append(Sc) #把新的当前边加入多边形中 n=S0.index(Sc) Nc=S[n][2] #新当前点 P.append(Pc) #起点终点重合时将当前多边形放入多边形组中
这是一个建立多边形拓扑关系的代码,其中我有以下几个问题:
1.忽略了左多边形和右多边形,左多边形的新当前点为Sn,右多边形新当前点为Sn,这个可以先做个if看原本的当前点在新的当前弧中的位置,再确定是左还是右
2.但是多边形组'P'的结构不知道怎么设置比较好,如果在每个多边形里再分L,R两个分组会不会太复杂(起始边可以默认放在左多边形里)
3.节点表和弧段表每个都有对应的字符表,下边运算的时候还要找相应位置进行处理,挺麻烦,有没有什么函数直接把list的子集名变为字符?或者有什么更好的表达形式?
我自己稍微寫了一下這個問題(用我自己的算法,應該結果相同).
P.S. 自覺寫得沒有很漂亮(只是為了解這個問題),我們可以再討論應該怎麼寫會比較 elegant 和 pythonic
首先是定義一個含有各種data class和核心算法的 module:
topology.py
,裡面一共有Node
,NodeMgr
,Edge
,EdgeMgr
,Polygon
,PolyMgr
,PolyFinder
共7個類.核心演算法 class:
PolyFinder
,此類包含兩個 methodfind_left_poly
和find_right_poly
用來對每個弧段尋找左右多邊形.接著是實際定義問題跟求解的 main script:
最後是結果:
不是很明白你要做什么,不过这个应该可以帮到你
涉及到复杂的数据类型,最好将其封装成类,内聚数据的操作