无向图:计算亏格(环的孔洞)
生活随笔
收集整理的這篇文章主要介紹了
无向图:计算亏格(环的孔洞)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前一篇文章:無向圖:計算虧格(環的孔洞)?????????
首先,判斷圖中是否存在環。方法,找到聯通子圖,循環刪除度為1的節點,同時刪除邊。直到不存在度為1的邊,則聯通子圖只剩下環或者復雜環。
???????? 在不需要遍歷出環的算法里面,可以通過歐拉公式直接計算虧格??锥吹膫€數。
???????? 公式: nGenus = l-p+1;? l為邊的個數,p為點的個數。
?????? ? 過程:對于所有聯通的集合,循環刪除度數為1的頂點,同時刪除邊;計算虧格。
然而,上述過程出現了問題。主要是平面圖中若嚴格按照直線邊進行拓撲,出現了復雜圖,即立體圖。
如圖:
???????
改進方法:
??????? 使用多邊形并差計算,以此尋找孔洞,以此來應對復雜圖的特殊情況。
代碼段:
import seisw.util.geom.Clip; import seisw.util.geom.Poly; import seisw.util.geom.PolyDefault;// 適應情況,一個房間多個家具,只有一次孔洞,不會有島嶼!private static int findPolyGenus( List<NewPoint> walls, List<List<NewPoint>> furniturePolygons, double wallwidth,double width) {// 1.根據分區得到房間剩下的多個多邊形,要求生成的多個多邊形不能有空洞int genus = 0;// 默認房間為逆時針多邊形,分區需保證為順時針Poly diffPoly = new PolyDefault();for (NewPoint p : walls) {diffPoly.add(p.m_x, p.m_y);}// 確保逆時針for (int k = 0; k < furniturePolygons.size(); ++k) {List<NewPoint> f = furniturePolygons.get(k);ArrayList<NewPoint> fEx = extendPoly(furniturePolygons.get(k), 15+ width + wallwidth);//width );// furniturePolygons.set(k, fEx);Poly subPoly = new PolyDefault();for (NewPoint p : fEx) {subPoly.add(p.m_x, p.m_y);}diffPoly = (PolyDefault) Clip.difference(diffPoly, subPoly);}// 獲取所有孔洞genus = diffPoly.getNumInnerPoly();for ( int i = 0; i < diffPoly.getNumInnerPoly(); ++i) {boolean isHole = diffPoly.getInnerPoly(i).isHole();if( isHole ){genus = genus - 1;}}return genus;
最后,可以得到正確結果。
總結
以上是生活随笔為你收集整理的无向图:计算亏格(环的孔洞)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Caffe2:段错误(核心 已转储)
- 下一篇: 墙布和乳胶漆哪个好(贴墙布好还是刷白墙好