我需要从封闭的2D多边形创建一个二进制位图,表示为一个点列表。能否请您指出有效且足够简单的算法来实现这一点,或者更好的是,一些C ++代码?
非常感谢!
PS:我想避免在我的项目中添加依赖项。但是,如果您建议使用开源库,我总是可以查看代码,因此它也很有用。
答案 0 :(得分:11)
你想要的神奇谷歌短语是“非零缠绕规则”或“甚至奇数多边形填充”。
请参阅维基百科条目:
两者都非常容易实现,并且对于大多数目的来说足够快。有一些聪明,他们也可以做出抗锯齿。
答案 1 :(得分:5)
您可以在Pygame中查看多边形填充例程。查看draw_fillpoly
函数。
算法非常简单。它找到每个线段沿Y轴相交的所有位置。对这些交叉点进行排序,然后水平填充每对交叉点。
这将处理复杂和相交的形状,但显然你可以用大量的段来粉碎这个算法。
答案 2 :(得分:3)
复杂度为O(面积,以像素为单位)
答案 3 :(得分:2)
请参阅Darel Rex Finley's Efficient Polygon Fill或Blender's version。
这是一种奇数/偶数填充方法,它支持自相交线,无需复杂的代码来检测这种情况,并且不依赖于绕组(多边形可以反转并产生相同的结果)
更新,我制作了Darel Rex方法的优化版本,避免了为每个y像素循环所有坐标。
独立实施:
虽然加速可能是指数级的,但从快速测试开始,它的速度提高了7.5倍(移除round
时调用时为11倍),在2540x1600区域使用任意手绘涂鸦,YMMV。