簡體   English   中英

用於創建封閉區域的多邊形的算法

[英]Algorithm to create polygons of enclosed areas

我在隨機位置有多個圓圈(作為連接頂點的列表)。

當圓相交時,會創建封閉區域(就像在維恩圖中一樣http://en.wikipedia.org/wiki/Venn_diagram

如何生成所有這些區域的單獨多邊形? 目標是能夠使用單獨的多邊形為每個區域着色,如下例所示:

在此輸入圖像描述

在此輸入圖像描述

迭代布爾交叉運算是否可能是一般解?

編輯

以下簡單的[NodeBox](http://nodebox.net/code/index.php/Home)[NodeBox](http://nodebox.net/code/index.php/Home)腳本,它繪制相交的橢圓。

oval(x0,y0,w,h)創建一個橢圓。

根據文檔 ,像p[19].difference(p[17])這樣的路徑上的布爾運算將給出“平坦”結果(“由許多直線段組成”)。

可以添加或更改路徑的坐標。

size(500, 500)

p = []
s = 54
nofill()
stroke(0)
for k in xrange(10):
    w  = 10+k*s/2
    w2 = 10+k*s 
    h = 10+k*s
    h2= 10+k*s
    p.append( oval(WIDTH/2 - w/2, HEIGHT/2 - h/2, w,  h, draw=False))
    p.append( oval(WIDTH/2 - w2/2, HEIGHT/2 - h2/2, w2, h2, draw=False))


cp = p[19].difference(p[17]).intersect(p[18], flatness = 0.3)

for pi in p:
    drawpath(pi)

fill(color(1,0,0))
drawpath(cp)    

你說語言不可知,所以我會這樣回答。 您可以按照建議在多邊形上使用布爾運算獲得所需的結果。 如果F是一組非相交多邊形而P是一個與F中的一個或多個重疊的新多邊形,那么,您需要這樣做:

Let p = P
for each polygon f in F
  Replace f by f-p and intersect(f, p).
  Set p = p-f
end
add p to F

我們的想法是使用新的多邊形p將F中現有的“平面”多邊形分割為與p共享的部分而不與p共享,然后從p本身移除與原始多邊形的重疊並繼續。 當你完成它之后,p的左邊是與F中的任何東西都沒有重疊的部分,所以我們將它作為一個新的多邊形添加到F.

因此,要處理隨機的圓形多邊形集合,首先要使用包含其中一個圓形多邊形的F(這當然是一個扁平集合!)並添加更多,一次一個,直到完成。

實際上,這比定制算法效率低得多。 處理這類問題的標准方法是掃描線技術。 想象一下在圓圈上從左到右橫掃的垂直線。 當它“觸摸”一個圓圈時,它開始構建一個多邊形。 當它接觸交叉點時,一個多邊形關閉,兩個繼續,並且打開一個新的多邊形(在一般情況下)。 當它到達圓的最高點時,關聯的多邊形將關閉。 從掃描線移除“閉合”多邊形並將其添加到輸出列表中。 掃描線算法在概念上並不困難,但實現很繁瑣,特殊情況比比皆是(特別是對於與掃描器平行的線以及當一個多邊形的頂點位於另一個多邊形的邊緣時,盡管用於解決這些問題的一般技術是簡單模擬 )。

“廣義排列”是用於描述這樣的問題的計算幾何術語。 廣義布置是線,線段和/或多邊形的集合(正常布置僅是線組)。 例如, 用於廣義安排的CGAL庫可以高效地完成您的問題。 CGAL是C ++中的一個大型通用庫,因此有一些學習成本。 商業用途的許可是棘手的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM