多個圓環組成的區域的合併

2021-05-24 05:57:56 字數 1730 閱讀 1154

最近很忙,忙的連寫日記的功夫都沒有了。

有個專案的需求是需要把多個圓環的區域合併。得到包絡線和內部空洞的線。

查了查google。類似的實現比較少見。簡單的說說我的實現方法。

基本想法就是通過判斷一段圓弧和圓環組的關係,來判斷這段圓弧是否是屬於合併後的包絡線的一部分

如圖,左邊的圓盒右邊的圓相交。則這兩個圓就被分成了兩段。

對外包絡線,如上圖。將所有圓環的外圓(粗線)相交。把每個圓都切成一段段的圓弧,如左邊的黑色圓,則切成了黑色段和黑色+紅色的兩段。對每一段,我們測試這一段弧是否在其它圓環的大圓內部,如果這段圓弧不在其它的環的大圓內部(不包括內部小圓),則這段圓弧屬於外包絡線的一部分。否則不是。

內部透空的小圓的合併稍微麻煩一些。因為透空的部分,不光是小圓的弧,還會有大圓弧的參與。

考察小圓的圓弧,同樣的,我們將小圓 和其它圓環的求交點,把小圓切成一段段的弧線(注意小圓和其它環求交的時候,就要跟這個環的大小圓都交一遍,而不光是小圓和小圓了)。如果這一段弧線不在這組圓環內(指的是環的內部,而不是大圓的內部),則表示這段弧是屬於內包絡線的一部分。

考察大圓的弧,大圓產生內包絡線的原因主要是大圓會抵消一部分小圓的透空作用。所以同樣的我們將大圓 和其它圓環的求交點,把小圓切成一段段的弧線--跟外包絡不同,這次求交的時候,該大圓要和其它圓環的大小圓都求交,而不光是大圓對大圓。 對每一段圓弧,如果弧線不在環的內部,而且該段弧應該還需要位於某個環的小圓內部(看圖就明白為什麼了)。則該大圓弧也是內包絡的一部分。

這裡求圓弧在環的內部還是在大小圓內,有乙個偷懶的方法。因為我們已經保證這段圓弧除了兩個端點以外不和其它任何弧相交,所以只要用這段弧的中點來代替弧來作判斷就好了。使得複雜性大大降低了。

以上是效果圖,三個環合併成乙個區域。

以下是主要**

class cringgroup

}void tosplinedrawer(csplinedraw& drawer)

for(int i = 0 ; i < m_vrings.size() ; i ++)

}void toinnerline(std::vector& vout)

_ring.toarcs(vcutpoints   , false  , varcs);

//內圓的弧,必須在所有的外圓的外部。

for(int iarc = 0 ; iarc < varcs.size() ; iarc ++)}//

if(binring == false)

}//內圓切完了。來切外圓套在其它內圓中的部分。

vcutpoints.clear();

varcs.clear();

for(int j = 0 ; j < m_vrings.size() ; j ++)

_ring.toarcs(vcutpoints   , true  , varcs);

//內圓的弧,必須在所有的外圓的外部。

for(int iarc = 0 ; iarc < varcs.size() ; iarc ++)

if( true == _ring2.isinsmallring( _arc) )}//

if(binring == false && binsmallring == true)}}

return ;

}void tooutline(std::vector& vout)}//

if(binring == false)}}

return ;

}public:

std::vectorm_vrings;

};

多個圓環組成的區域的合併

最近很忙,忙的連寫日記的功夫都沒有了。有個專案的需求是需要把多個圓環的區域合併。得到包絡線和內部空洞的線。查了查google。類似的實現比較少見。簡單的說說我的實現方法。基本想法就是通過判斷一段圓弧和圓環組的關係,來判斷這段圓弧是否是屬於合併後的包絡線的一部分 如圖,左邊的圓盒右邊的圓相交。則這兩個...

把多個圓環的區域合併 得到包絡線和內部空洞的線

有個專案的需求是需要把多個圓環的區域合併。得到包絡線和內部空洞的線。查了查google。類似的實現比較少見。簡單的說說我的實現方法。基本想法就是通過判斷一段圓弧和圓環組的關係,來判斷這段圓弧是否是屬於合併後的包絡線的一部分 如圖,左邊的圓盒右邊的圓相交。則這兩個圓就被分成了兩段。對外包絡線,如上圖。...

目標檢測時的區域合併

在目標檢測過程中,可能會遇到這樣的情況 乙個目標被標記為多個區域。如果乙個目標被標記為多個區域,後續的跟蹤很容易出現跟錯 跟丟,這個情形在自動檢測場和是很避諱的。以下提供乙個避免的方法 通過一些條件判斷,可以將本為同一目標的區域辨識,前文應該講過判斷方法。中心距離在閾值範圍內 兩個區域存在交集 包含...