2013-08-06 44 views
2

我在尋找一個能夠分解多邊形的庫。我想下定義的方向或線在多邊形應該是支離破碎的,因爲在這裏看到:特殊方向的多邊形分解

an irregular polygon with internal subdivision lines, some vertical some not

所以我得到的小多邊形。任何人都知道一個圖書館支持這個?

還是有什麼想法?

+0

從圖片中不明顯 - 什麼是添加線到生成的分區(行,是邊緣存在,但也有一些線穿過多邊形的邊) –

+0

線應具有邊緣的方向並從每個邊緣點開始。但我的目標是定義隨機方向並在這個方向上進行分解。 – Hunk

+0

那麼,它只是一組線?我的意思是,輸入是:將被分解的polugon和一些行(讓它們與多邊形的邊平行)。你期望的結果是什麼?一組新的多邊形? –

回答

1

我不確定您使用的是哪種語言。我有一個爲我的目的而編寫的庫,可以通過給定的行集合和返回多邊形來獲得完整的分區。這是寫在PHP,並呼籲dimension,並使用它,你可以解決你的問題像這樣:

  1. 由一組線LineSet_2D或Polygon_2D
  2. 定義分割線也通過Line_2D
  3. 的定義你的多邊形
  4. 使用LineSet_2D方法getPolygons找到所有多邊形

我寫了一個例子:

//define or polygon. Note that Polygon_2D can also be used 
$rPolygon = new LineSet_2D(
    new Line_2D(0, 3, 1, 1), 
    new Line_2D(1, 1, 3, 0), 
    new Line_2D(3, 0, 1,-1), 
    new Line_2D(1,-1, 0,-3), 
    new Line_2D(0,-3,-1,-1), 
    new Line_2D(-1,-1,-3,0), 
    new Line_2D(-3, 0,-1, 1), 
    new Line_2D(-1, 1, 0, 3) 
); 
//define partition line set 
$rPartition = new LineSet_2D(
    new Line_2D(-1, 1, 1,-1), 
    new Line_2D(-1,-1, 1, 1) 
); 
//result line set: 
$rResultSet = LineSet_2D::createFromArray(array_merge(
    $rPolygon->getLines(), 
    $rPartition->getLines() 
)); 
//for example, dump plain result: 
var_dump($rResultSet->getPolygons()); 

你也可以找到這個例子here但我認爲這不是你的問題的確切解決方案,因爲我的LineSet_2D類將返回所有成環的多邊形(即不僅'件')。

+0

嘿,謝謝你的回答,我正在使用C++。你的意思是環狀多邊形?我的解決方案應該是每個多邊形,例如A,B,C ....在我的圖 – Hunk

+0

嗯,我認爲適應PHP到C++並不難(因爲C++具有更多的語法和OOP功能)。通過提到環狀多邊形,我的意思是說,您將通過LineSet_2D製作一個分區,您將獲得所有多邊形,而不僅僅是原件。例如:想象一個有2個對角線的正方形。它分爲4塊,但它有更多的真實多邊形,因爲不僅有「小」三角形塊,而且還有「大」(一半正方形)三角形,甚至不是三角形(整個正方形沒有一個小三角形塊)。 –

+0

好的非常感謝你 – Hunk

0

您正在尋找「多邊形斬波」布爾操作。你可以谷歌它的資源可用。

對自己做這部分隊列.. 對於每個切片作業線..

  1. 找到與多邊形的邊的切片線的交叉點。
  2. 對於它相交的每條邊,將邊分成兩部分。
  3. 將對應於分割邊的多邊形拆分爲兩個多邊形。

對所有多邊形都做同樣的事情。 你將不得不照顧的特殊情況,如分裂線通過頂點等...

+0

你的意思是像差異等操作..?真的在這種方式,這是可能的,但我認爲我有很多圖書館這與2多邊形,所以它應該有幾個與多邊形和線? – Hunk

+0

我不確定圖書館是否爲你做這件事。因爲我工作一個,所以我不使用其他人。另外,它更像是一個數據結構問題,除了交叉例程之外。所以,如果你沒有找到一個,我認爲最有可能的情況就是這樣。你可以繼續寫下你自己的。它並不那麼困難,而且可能很有趣。另外,您可以在將來修復任何錯誤。 –