栅格化2D多边形

时间:2009-08-27 14:13:51

标签: c++ algorithm graphics geometry rasterizing

我需要从封闭的2D多边形创建一个二进制位图,表示为一个点列表。能否请您指出有效且足够简单的算法来实现这一点,或者更好的是,一些C ++代码?

非常感谢!

PS:我想避免在我的项目中添加依赖项。但是,如果您建议使用开源库,我总是可以查看代码,因此它也很有用。

4 个答案:

答案 0 :(得分:11)

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

请参阅维基百科条目:

两者都非常容易实现,并且对于大多数目的来说足够快。有一些聪明,他们也可以做出抗锯齿。

答案 1 :(得分:5)

您可以在Pygame中查看多边形填充例程。查看draw_fillpoly函数。

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

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

答案 2 :(得分:3)

  • Triangulate your polygon
  • 每个三角形的栅格(如果您使用的是GPU,那么它可以替代它,它是GPU的原始操作)
    • 如果三角形没有与x轴平行的线段,则将其分成两个三角形,其中一条线与x轴平行,并通过中间线y点亮它的点
    • 现在剩下的任务是绘制一个三角形,其中有一个与x轴平行的线段。这样的三角形具有左侧区段和右侧区段
    • 迭代三角形的扫描线(min-y到max-y)。对于每个y,计算该扫描线中的左和右段的点。在扫描线段填充这两个点(一个简单的memset)。

复杂度为O(面积,以像素为单位)

答案 3 :(得分:2)

对于"even-odd rule"

的强有力的启示

请参阅Darel Rex Finley's Efficient Polygon FillBlender's version

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

更新,我制作了Darel Rex方法的优化版本,避免了为每个y像素循环所有坐标

独立实施:

虽然加速可能是指数级的,但从快速测试开始,它的速度提高了7.5倍(移除round时调用时为11倍),在2540x1600区域使用任意手绘涂鸦,YMMV。