2012-06-18 18 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.