網格分割後,邊界點的獲取方法

2022-08-05 05:48:13 字數 1593 閱讀 5202

k-means的缺點

昨天記錄了使用k-means對網格模型進行分割的步驟和一些簡單的結果,從昨天的實驗結果來看,使用頂點座標和頂點法向作為k-means聚類的特徵得到的分割效果總體上還是不錯的。分割結束後,每個頂點會被賦予乙個分割的標號。

但是,只使用頂點距離作為聚類得到的結果並沒有語義,因此可能會得到一些不太好的聚類結果。

如上圖所示,「馬」模型的右後腿和兩條左腿被分割到了同乙個類,這使得分割的結果不具有連通性,因此在後續的學習中,需要對該演算法的分割結果進行調整,或者需找更加合適的分割方法。

邊界獲取的思想挺簡單,首先遍歷網格頂點,篩選出某一特定區域的頂點,對於這一區域中某一頂點,判斷其一鄰域中的頂點的標號與其自身標號是否相同,如果存在不同標號與自身標號不同的頂點,那麼這樣的頂點就是邊界頂點。找出邊界頂點後,為其設定邊界標記。同時,記錄區域中非邊界頂點的個數,以便於計算區域區域性的拉普拉斯矩陣。

void find_boundary(polygonmesh::mesh * _mesh, int area)

int v_idx = 0;

cnt_non_bdy = 0;//非邊界頂點個數

for (auto v_it = _mesh->vertices_begin();v_it != _mesh->vertices_end();++v_it,v_idx++)

}

}//區域area中的非邊界頂點

if (all_lables[v_idx] == area && is_boundray[v_idx] !=area )}}

需要注意的是,在計算區域的拉普拉斯矩陣時,如果使用l = d - a這種形式的拉普拉斯矩陣,在計算頂點度矩陣和頂點鄰接矩陣a時,都要將其鄰域中的邊界迪昂點排除在外

int v_idx = 0;

int n_vidx = 0;//對同一區域中的頂點重新編號

vectorx byd_neibor;//記錄每個頂點的邊界鄰域

byd_neibor.setzero(cnt_non_bdy);

for(auto v_it = _mesh->vertices_begin();v_it != _mesh->vertices_end();++v_it,++v_idx)

}

//獲得頂點i的度,然後減去邊界點個數

int val = _mesh->valence(v_it.handle());

d_matrix(n_vidx ,n_vidx ) = val - byd_neibor[n_vidx];

//獲得頂點的1鄰域鄰接矩陣

openmesh::vertexhandle vertex1 = v_it.handle();

int v1_idx = vertex1.idx();

for ( auto vv_it = _mesh->vv_begin(v_it); vv_it != _mesh->vv_end(v_it); ++vv_it)

}n_vidx ++;//對同一區域中的頂點進行新的編號}}

python簡單爬蟲獲取行政邊界點座標

最近剛開始學用python進行簡單爬蟲,關於python簡單爬蟲網易雲課堂上有教程,倆小時學會這裡用到的工具是教程中提到的jupyter notebook 可以看到地圖中多了乙個行政區圖層,我們需要做的是觀察下方的響應,找到圖層對應的鏈結,通過簡單搜尋可以發現在xhr下的某個檔案,它的respons...

使用Adorner顯示WPF控制項的邊界點

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!當我們拖動wpf控制項時,我們為了更清楚地需要顯示控制項,一般我們會在wpf控制項所圍成的矩形區域的四個邊界點上作乙個特殊的記號 比如圓點 如下圖 在winform中,我們一般都是先找到控制項所包圍的矩形區域,然後畫出四個邊界點。那麼,在wpf,如...

求點雲的邊界的方法小結

在實際生活中,很多時候我們採集的資料是有限點資料,插值可以生成面狀的圖層。一般要進行的步驟是利用點雲的邊界來裁切插值結果資料。這裡總結一下求點雲的最小邊界的方法。方法一 手動向量法 如果資料量不大,手動向量化,準確又簡單。缺點 資料量大的情況下,就有點惱火了。方法二 最小幾何邊界 缺點 在於只有生成...