日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

无向图:计算亏格(环的孔洞)

發布時間:2023/12/31 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无向图:计算亏格(环的孔洞) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前一篇文章:無向圖:計算虧格(環的孔洞)?????????

首先,判斷圖中是否存在環。方法,找到聯通子圖,循環刪除度為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;
最后,可以得到正確結果。





總結

以上是生活随笔為你收集整理的无向图:计算亏格(环的孔洞)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。