多边形图像填充算法

时间:2009-08-03 20:44:19

标签: graphics image-processing

我想要一个有效的算法用图像填充多边形,我想将图像填充到梯形中。目前我分两步完成
1)首先对图像执行StretchBlt,
2)逐列垂直StretchBlt执行,   

有没有更好的方法来实现这个?有没有可以填充任何多边形的通用和快速算法?

谢谢,  晴天

2 个答案:

答案 0 :(得分:1)

我无法帮助你解决扭曲部分,但填充多边形非常简单,特别是如果它们是凸的。

对于每个Y扫描线,都有一个由Y索引的表,其中包含minX和maxX。

对于每个边缘,运行DDA线条绘制算法,并使用它来填写表格条目。

对于每条Y线,现在你有一个minX和maxX,所以你可以只填充扫描线的那一段。

困难的部分是精神伎俩 - 不要将坐标视为指定像素。将坐标视为位于像素之间的。换句话说,如果你有一个从点0,0到点2,2的矩形,它应该点亮4个像素,而不是9.多边形填充的大多数问题都围绕着这个问题。

补充:好的,听起来你真正想要的是如何将图像拉伸成非矩形(但是梯形)。我会根据参数st来做,从01。换句话说,原始矩形中的位置是(x + w0*s, y + h0*t)。然后定义一个函数,使st也映射到梯形中的位置,例如((x+t*a) + w0*s*(t-1) + w1*s*t, y + h1*t)。这定义了两个形状之间的坐标映射。然后,只需扫描xy,转换为st,并将点映射到另一个。您可能希望使用一些平滑滤镜而不是直接复制。

添加以尝试提供更好的解释: 我想你的矩形和梯形的顶边和底边都与X轴平行。矩形的左下角为<x0,y0>,梯形的左下角为<x1,y1>。我假设矩形的宽度和高度为<w,h>。 对于梯形,我假设它具有高度h1,并且它的宽度为w0,而它的宽度为w1。我假设它的左边缘“倾斜”距离a,因此左上角的位置为<x1+a, y1+h1>。现在假设您在矩形上迭代<x,y>。在每个点,计算s = (x-x0)/wt = (y-y0)/h,它们都在01的范围内。 (我会让你弄清楚如何在不使用浮点的情况下做到这一点。)然后将其转换为梯形中的坐标,xt = ((x1 + t*a) + s*(w0*(1-t) + w1*t))yt = y1 + h1*t。然后<xt,yt>是与矩形中的<x,y>对应的梯形中的点。现在我会告诉你如何复制:-)祝你好运。

P.S。请不要忘记 - 坐标在像素之间,而不在它们之间。

答案 1 :(得分:1)

回避问题并使用OpenGL为您做这件事是否可行? OpenGL可以渲染到内存上下文,如果你可以通过这样做来利用任何硬件加速,那么你可以在CPU上进行任何代码调整都会相形见绌(尽管在某些较旧的卡上,内存上下文渲染可能无法利用硬件)。

如果您想在软件中完全执行此操作,MESA可能是一个选项。