多段線切割多邊形

概述

多段線切割多邊形,直觀上來說首先就是求多段線與多邊形之間的交點,然后利用這些交點與多邊形頂點構成多邊形,這樣一個多邊形就被切割成多個多邊形。如下圖所示:


多段線與多邊形
切割后的多邊形

主要過程

以下圖所示的分割為例,做簡短說明:


示例

難點

  1. 如何連接交點與頂點?如上圖所示,切割的多邊形為AB21,D34,E56,12C3456F;當我們求出交點之后,如何組織交點與頂點的連接很重要,一個解決方法是將多邊形的邊界與多段線組成有向邊,依據(jù)他們的方向來進行組織連接;
  2. 剔除不合理的多邊形?很明顯,C23這個多變形不符合要求,因為它位于多邊形的外側,這個要去除掉;

過程

對于上述難點,本文主要是利用geos中構建多邊形的方法來解決,尤其是難點1,具體的原理可參考直線切割凹多邊形
1.獲取帶分割的幾何圖形,注意該幾何圖形是線形的,主要包括待切割的閉合環(huán)(如多邊形的邊界)以及分割線;

geos::geom::Geometry *tempG = _geos_geometry->getBoundary();
geos::geom::Geometry *tempG1 = tempG->Union(_asGeos(splitline));

2.構建多邊形,在geos主要是Polygonizer類,獲取所有分割的多邊形,當然也包括類似C23這樣不合理的多邊形,下一步是剔除這些多邊形;

geos::operation::polygonize::Polygonizer pz;
pz.add(tempG1);
std::vector< geos::geom::Polygon*> *result_geom = pz.getPolygons();

3.剔除不合理多邊形,理論上來說,切割出來的多變?nèi)绻辉级噙呅伟涂梢员A?,調(diào)用geos中的Cover或Contains等拓撲計算便可以,但是在實際操作過程中有兩個問題:
(1)拓撲計算不正確,每次返回值都是false,猜測可能是精度問題,因為如果坐標都是整型,可以返回正確結果;
(2)效率不高,相對于contain和within,建議在geos中優(yōu)先使用cover或coverby。具體可參考九交模型
所以選取一個折中方案,如下所示:

//過濾掉不在多邊形內(nèi)部的切割面;
//不能直接用包含和覆蓋直接判斷,存在精度問題;
//利用切割面與原始多邊形相交后的多邊形面積與切割面的面積之比判斷;
//比值在0.99~1.01之間;

4.最后得到的就是一個vector集合,數(shù)據(jù)類型是geos::geom::Polygon*

相關鏈接

GEOS庫一些自己的見解和注意點
GEOS庫學習之三:空間關系、DE-9IM和謂詞

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • 前言 多邊形偏移 (polygon offset) 算法可能我們印象不深,不過用過 autoCAD 的同學應該有印...
    zyl06閱讀 12,182評論 19 14
  • 引言 自從今年春天選修了計算機圖形學課程,這朵烏云就在頭頂盤旋不散。始終弄不明白計算機圖形學到底在研究什么,所謂的...
    金戈大王閱讀 61,636評論 35 61
  • 1. 矢量減法 設二維矢量 P = (x1,y1) ,Q = (x2,y2) 則矢量減法定義為: P - Q = ...
    潭潭_180閱讀 2,377評論 0 1
  • 最近做的一個小算法,使用平行線填充一個多邊形區(qū)域。用過 AutoCAD 的同學應該知道,可以選定一個區(qū)域,指定平行...
    zyl06閱讀 4,955評論 0 2
  • 雖然已經(jīng)一年多沒有維護gbox這個圖形庫項目了,最近確實時間不夠用。。。 今年的重點是把xmake徹底正好,至少在...
    waruqi閱讀 1,514評論 0 50

友情鏈接更多精彩內(nèi)容