2012-06-18 21 views
0

我有一些圖像想在外邊緣繪製多邊形。圖像本身在透明背景上,並且我在圖像中創建了一個包含點並且不透明(或白色)的像素數組。使用C的圖像/形狀的外部邊界點#

現在,我的問題是:如何在外邊緣點上繪製準確的多邊形?我已經使用了一個Graham Scan algorithm,我讀到了在邊緣創建凸包,但這似乎不適用於具有凹陷的物體。例如:

http://i48.tinypic.com/4s0lna.png

左邊的圖像被塗抹在使用這種方法與右邊的一個。正如你所看到的,它有點「過度」了。

我認爲必須有一些其他算法或方法,可以用來解決這個問題,但我不知道在哪裏看或可能被稱爲。任何人都可以將我指向正確的方向嗎?我使用的是C#/ .net,希望可能有一些已經存在的可以沿着這些方向發展的東西。

+0

是的,在瘋狂地打字時太快地輸入「 - 多麼傻瓜! – plone

+1

製作遊戲並嘗試檢測對象之間的碰撞時,這是一個非常常見的問題。它通常使用射線追蹤來解決。 – JDB

+1

我不明白。你是否希望你的「多邊形」是任何不透明(按alpha)的精確表示?你會用什麼來做這件事?僅僅是爲了繪畫還是其他的東西?可能有其他(可能更簡單)的方法來做你需要的。 – Ani

回答

2

我覺得2D「阿爾法形狀」算法會爲正確的選擇您。

http://www.cgal.org/Manual/latest/doc_html/cgal_manual/Alpha_shapes_2/Chapter_main.html

阿爾法形狀可以被認爲是一個概括爲「凸殼」算法,其允許生成更一般的形狀。

通過使用alpha形狀,您將可以通過更改alpha參數值來控制由合成形狀捕獲的細節水平。

你可以在這裏嘗試的Java小程序:http://cgm.cs.mcgill.ca/~godfried/teaching/projects97/belair/alpha.html

有更好的瞭解有關執行此算法做。

1

您可以使用填充填充方法逐個像素地開始繪製像素。

Start in the corner, checking that it does have zero alpha. 
Check the neighbours for zero alpha and iterate until we have no unchecked neighhours. 

此爲您提供將由兩個單純連接區,內部和外部形象的面具。

您尋求然後集包括:

all the points in the exterior which are on the boundary of the interior. 

然後,您可以把它轉換成一個多邊形由:

Take an initial polygon that consists of all the points in the edge set 
Remove redundant vertices that lie along straight edges.