2009-08-27 121 views
6

我需要从一个封闭的2D多边形创建一个二进制位图,表示为点列表。你能否指点我一些有效率和足够简单的算法来做到这一点,或者更好一些C++代码?栅格化2D多边形

非常感谢! PS:我想避免添加一个依赖项到我的项目中。但是,如果您建议使用开放源代码库,则始终可以查看代码,因此它也可能很有用。

回答

10

你想要的神奇的谷歌短语是“非零蜿蜒规则”或“甚至奇怪的多边形填充”。

参见维基百科的条目:

两者都非常容易实现,而且足够快于大多数的目的。随着一些聪明,他们也可以被制成antialiased。

+0

@plinth:对于简单的多边形是不是过度杀戮? – yairchu 2009-08-27 14:27:48

+2

什么是简单的多边形? @static_rtti没有指定多少个点或多边形总是凸的,因此一个通用的解决方案是正确的答案。 NZW和EO很简单,适合面向扫描的解决方案等等。 – plinth 2009-08-27 14:31:26

+0

@plinth:谢谢,这正是我一直在寻找的!当你没有那个魔术短语时,谷歌搜索的东西可能会很棘手:-) – 2009-08-27 15:01:35

3
  • Triangulate your polygon
  • 光栅的每个三角形的(如果你使用的是GPU,然后它可以为你做到这一点,相反,它是GPU的原始操作)
    • 如果三角形没有一个平行于x轴的线段,然后将其分成两个三角形,线条平行于x轴并穿过它的中点y。现在剩下的任务是绘制一个三角形,该三角形具有一段平行于x轴的线段。这样一个三角形有一个左侧和一个右侧的线段
    • 迭代三角形的扫描线(min-y到max-y)。对于每个y,计算该扫描线中的左侧和右侧线段的点。将扫描线段填入这两点(一个简单的memset)。

复杂度为O(像素区)

+0

你将如何栅格化所产生的三角形?每次遍历整个图像一个接一个?这不可能很慢吗? – 2009-08-27 14:35:26

+0

@static_rtti:你每次想要遍历整个图像是什么意思? – yairchu 2009-08-27 16:32:50

+0

@static_rtti:我添加了关于如何栅格化三角形的解释 – yairchu 2009-08-27 17:11:10

4

可以在Pygame中检查出的多边形填充程序。看看draw_fillpoly函数。

该算法非常简单。它找出每个段沿Y轴相交的所有位置。对这些交叉点进行排序,然后横向填充每对交点。

这将处理复杂和相交的形状,但显然你可以粉碎这个算法与大量的段。

+0

不太相关,但顺便说一句皮特你是令人敬畏的pygame :) – yairchu 2009-08-28 09:27:52

2

对于的"even-odd rule"

鲁棒执行力度参见Darel Rex Finley's Efficient Polygon Fill,或它的Blender's version

这是一种奇数/偶数填充方法,它支持自相交线,而不需要复杂的代码来检测这种情况,并且不依赖绕线(多边形可以颠倒并产生相同的结果)


更新,我做了DAREL雷克斯的方法的优化版本,避免遍历所有坐标对于每个y像素。

独立实现:

虽然增速将可能是指数,从快速测试,其周围7.5倍更快(11X去除round呼叫时),利用绘制涂鸦在2540x1600的区域,情况因人而异任意手。