我需要从表示为点的列表封闭2D多边形创建一个二进制位。 能否请你点我高效,足够简单的算法来做到这一点,或者,甚至更好,一些C ++代码吗?
非常感谢!
PS:我想避免添加依赖我的项目。 但是,如果你认为一个开放源码库,我可以随时看代码,因此它可以是有用的。
我需要从表示为点的列表封闭2D多边形创建一个二进制位。 能否请你点我高效,足够简单的算法来做到这一点,或者,甚至更好,一些C ++代码吗?
非常感谢!
PS:我想避免添加依赖我的项目。 但是,如果你认为一个开放源码库,我可以随时看代码,因此它可以是有用的。
你想要魔谷歌的短语或者是“非零缠绕规则”或“偶奇多边形填充”。
参见维基百科条目:
两者都非常容易实现,而且足够快于大多数的目的。 对于一些小聪明,他们可以进行抗锯齿以及。
您可以检查出在Pygame的多边形填充程序。 看看draw_fillpoly
功能。
该算法是非常简单的。 它发现所有每段沿Y轴相交的位置。 这些交叉点进行排序,然后水平地填充每一对交叉点的。
这将处理复杂的和交叉的形状,但很明显,你可以用大量段粉碎这一算法。
复杂度为O(像素区)
对于一个强大的执行力度“奇偶规则”
见DAREL雷克斯芬利的高效多边形填充 ,或者Blender的版本的它。
这是支持自相交线,而不需要复杂的代码来检测这种情况奇数/偶数充填方法,并且不依赖于绕组(多边形可以颠倒并产生相同的结果)。
更新,我做了DAREL雷克斯的方法的优化版本,避免遍历每个Y型像素的所有坐标 。
单机实现:
尽管增速将可能是指数,从快速测试,其周围7.5倍更快(11倍拆卸时round
通话),使用在2540x1600的区域,情况因人而异任意手绘涂鸦。