无向图:计算亏格(环的孔洞)
生活随笔
收集整理的這篇文章主要介紹了
无向图:计算亏格(环的孔洞)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
前一篇文章:無向圖:計(jì)算虧格(環(huán)的孔洞)?????????
首先,判斷圖中是否存在環(huán)。方法,找到聯(lián)通子圖,循環(huán)刪除度為1的節(jié)點(diǎn),同時(shí)刪除邊。直到不存在度為1的邊,則聯(lián)通子圖只剩下環(huán)或者復(fù)雜環(huán)。
???????? 在不需要遍歷出環(huán)的算法里面,可以通過歐拉公式直接計(jì)算虧格。孔洞的個(gè)數(shù)。
???????? 公式: nGenus = l-p+1;? l為邊的個(gè)數(shù),p為點(diǎn)的個(gè)數(shù)。
?????? ? 過程:對(duì)于所有聯(lián)通的集合,循環(huán)刪除度數(shù)為1的頂點(diǎn),同時(shí)刪除邊;計(jì)算虧格。
然而,上述過程出現(xiàn)了問題。主要是平面圖中若嚴(yán)格按照直線邊進(jìn)行拓?fù)?#xff0c;出現(xiàn)了復(fù)雜圖,即立體圖。
如圖:
???????
改進(jìn)方法:
??????? 使用多邊形并差計(jì)算,以此尋找孔洞,以此來應(yīng)對(duì)復(fù)雜圖的特殊情況。
代碼段:
import seisw.util.geom.Clip; import seisw.util.geom.Poly; import seisw.util.geom.PolyDefault;// 適應(yīng)情況,一個(gè)房間多個(gè)家具,只有一次孔洞,不會(huì)有島嶼!private static int findPolyGenus( List<NewPoint> walls, List<List<NewPoint>> furniturePolygons, double wallwidth,double width) {// 1.根據(jù)分區(qū)得到房間剩下的多個(gè)多邊形,要求生成的多個(gè)多邊形不能有空洞int genus = 0;// 默認(rèn)房間為逆時(shí)針多邊形,分區(qū)需保證為順時(shí)針Poly diffPoly = new PolyDefault();for (NewPoint p : walls) {diffPoly.add(p.m_x, p.m_y);}// 確保逆時(shí)針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;
最后,可以得到正確結(jié)果。
總結(jié)
以上是生活随笔為你收集整理的无向图:计算亏格(环的孔洞)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Caffe2:段错误(核心 已转储)
- 下一篇: CV:深入浅出的讲解傅里叶变换(真正的通