我需要从表示为点列表的封闭二维多边形创建二进制位图。您能否指出有效且足够简单的算法来做到这一点,或者更好的是一些 C++ 代码?
非常感谢!
PS:我想避免向我的项目添加依赖项。但是,如果您建议一个开源库,我可以随时查看代码,因此它也很有用。
我需要从表示为点列表的封闭二维多边形创建二进制位图。您能否指出有效且足够简单的算法来做到这一点,或者更好的是一些 C++ 代码?
非常感谢!
PS:我想避免向我的项目添加依赖项。但是,如果您建议一个开源库,我可以随时查看代码,因此它也很有用。
您可以查看 Pygame 中的多边形填充例程。看draw_fillpoly
功能。
该算法非常简单。它找到每个线段沿 Y 轴相交的所有位置。这些交叉点被排序,然后水平填充每对交叉点。
这将处理复杂和相交的形状,但显然你可以用大量的段来粉碎这个算法。
请参阅Darel Rex Finley 的 Efficient Polygon Fill或Blender 的版本。
这是一种奇偶填充方法,它支持自相交线,无需复杂的代码来检测这种情况,并且不依赖于缠绕(多边形可以反转并产生相同的结果)。
更新,我制作了 Darel Rex 方法的优化版本,避免循环遍历每个 y 像素的所有坐标。
独立实现:
虽然加速可能是指数级的,但从快速测试来看,round
在 2540x1600 区域 YMMV 上使用任意手绘涂鸦,它的速度提高了约 7.5 倍(移除呼叫时为 11 倍)。
复杂度为 O(以像素为单位的面积)