我需要从一个封闭的2D多边形创建一个二进制位图,表示为点列表。你能否指点我一些有效率和足够简单的算法来做到这一点,或者更好一些C++代码?栅格化2D多边形
非常感谢! PS:我想避免添加一个依赖项到我的项目中。但是,如果您建议使用开放源代码库,则始终可以查看代码,因此它也可能很有用。
我需要从一个封闭的2D多边形创建一个二进制位图,表示为点列表。你能否指点我一些有效率和足够简单的算法来做到这一点,或者更好一些C++代码?栅格化2D多边形
非常感谢! PS:我想避免添加一个依赖项到我的项目中。但是,如果您建议使用开放源代码库,则始终可以查看代码,因此它也可能很有用。
你想要的神奇的谷歌短语是“非零蜿蜒规则”或“甚至奇怪的多边形填充”。
参见维基百科的条目:
两者都非常容易实现,而且足够快于大多数的目的。随着一些聪明,他们也可以被制成antialiased。
复杂度为O(像素区)
可以在Pygame中检查出的多边形填充程序。看看draw_fillpoly
函数。
该算法非常简单。它找出每个段沿Y轴相交的所有位置。对这些交叉点进行排序,然后横向填充每对交点。
这将处理复杂和相交的形状,但显然你可以粉碎这个算法与大量的段。
不太相关,但顺便说一句皮特你是令人敬畏的pygame :) – yairchu 2009-08-28 09:27:52
鲁棒执行力度参见Darel Rex Finley's Efficient Polygon Fill,或它的Blender's version。
这是一种奇数/偶数填充方法,它支持自相交线,而不需要复杂的代码来检测这种情况,并且不依赖绕线(多边形可以颠倒并产生相同的结果)。
更新,我做了DAREL雷克斯的方法的优化版本,避免遍历所有坐标对于每个y像素。
独立实现:
虽然增速将可能是指数,从快速测试,其周围7.5倍更快(11X去除round
呼叫时),利用绘制涂鸦在2540x1600的区域,情况因人而异任意手。
@plinth:对于简单的多边形是不是过度杀戮? – yairchu 2009-08-27 14:27:48
什么是简单的多边形? @static_rtti没有指定多少个点或多边形总是凸的,因此一个通用的解决方案是正确的答案。 NZW和EO很简单,适合面向扫描的解决方案等等。 – plinth 2009-08-27 14:31:26
@plinth:谢谢,这正是我一直在寻找的!当你没有那个魔术短语时,谷歌搜索的东西可能会很棘手:-) – 2009-08-27 15:01:35