我需要创建一个二进制位图从一个封闭的二维多边形表示为一个列表的点。你能不能给我指出一些有效且足够简单的算法来做到这一点,或者更好的是,一些C++代码?非常感谢!PS:我想避免在我的项目中添加依赖项。但是,如果您建议使用开源库,我可以随时查看代码,因此它也很有用。
mspsb9vt1#
你想要的神奇谷歌短语是“非零缠绕规则”或“偶数奇数多边形填充”。查看维基百科条目:
两者都非常容易实现,并且对于大多数目的来说都足够快。用一些聪明的方法,它们也可以进行抗锯齿处理。
ergxz8rk2#
您可以在Pygame中查看多边形填充例程。看看draw_fillpoly函数。这个算法非常简单。它查找每个线段沿着Y轴相交的所有位置。对这些交点进行排序,然后水平填充每对交点。这将处理复杂和相交的形状,但显然,您可以用大量的线段来破坏该算法。
draw_fillpoly
gc0ot86w3#
对于"even-odd rule"的稳健实施参见Darel Rex Finley's Efficient Polygon Fill,或Blender的版本。这是一种奇/偶填充方法,支持自相交线,不需要复杂的代码来检测这种情况,并且不依赖于缠绕 (多边形可以反转并产生相同的结果)。更新,我做了一个Darel雷克斯方法的优化版本,避免了为每个y像素循环所有坐标。独立实现:
round
8wtpewkr4#
复杂度为O(面积以像素为单位)
nwwlzxa75#
除了其他人提到的扫描线算法之外,在论文Wavelet Rasterization by J. Manson and S. Schaefer中描述了一种完全不同的方法。该算法将图像的每一条边缘Map到小波域上,然后进行小波逆变换重构图像。优点是该算法能够计算精确的覆盖率(即,抗锯齿),这是用扫描线算法极难实现的。它也能容忍破碎的多边形;即具有不连续轮廓的多边形。
5条答案
按热度按时间mspsb9vt1#
你想要的神奇谷歌短语是“非零缠绕规则”或“偶数奇数多边形填充”。
查看维基百科条目:
两者都非常容易实现,并且对于大多数目的来说都足够快。用一些聪明的方法,它们也可以进行抗锯齿处理。
ergxz8rk2#
您可以在Pygame中查看多边形填充例程。看看
draw_fillpoly
函数。这个算法非常简单。它查找每个线段沿着Y轴相交的所有位置。对这些交点进行排序,然后水平填充每对交点。
这将处理复杂和相交的形状,但显然,您可以用大量的线段来破坏该算法。
gc0ot86w3#
对于"even-odd rule"的稳健实施
参见Darel Rex Finley's Efficient Polygon Fill,或Blender的版本。
这是一种奇/偶填充方法,支持自相交线,不需要复杂的代码来检测这种情况,并且不依赖于缠绕 (多边形可以反转并产生相同的结果)。
更新,我做了一个Darel雷克斯方法的优化版本,避免了为每个y像素循环所有坐标。
独立实现:
round
调用时为11倍)。8wtpewkr4#
复杂度为O(面积以像素为单位)
nwwlzxa75#
除了其他人提到的扫描线算法之外,在论文Wavelet Rasterization by J. Manson and S. Schaefer中描述了一种完全不同的方法。
该算法将图像的每一条边缘Map到小波域上,然后进行小波逆变换重构图像。
优点是该算法能够计算精确的覆盖率(即,抗锯齿),这是用扫描线算法极难实现的。它也能容忍破碎的多边形;即具有不连续轮廓的多边形。