2012-01-05 89 views
2

我试图通过从顶部开始逐行绘制一个反锯齿梯形。当线不是像素的整数时,末端像素是背景灰度和梯形灰度的加权平均,例如,如果线路是128.5个像素长,然后在每个端部,该灰度级是:绘制一个反锯齿梯形

0.25*(trapezoid_greylevel)+0.75*(background_greylevel) 

不幸结果不是非常平滑的(我已经检查这个线性化的显示器上):

Jagged trapezoid

我认为在每行结束时,我需要考虑到所有围绕它在适当的灰度到达的像素,但我不能工作了如何做到这一点。任何指针?

回答

2

由于梯形是凸的,所以很容易就梯形进行分类:如果梯形在所有梯形边的左侧(假设梯形沿逆时针方向),则点在内侧。假设正方形像素(以及大于像素的梯形),则可以通过对它们的角进行分类来容易地将像素相对于梯形进行分类:如果所有四个角都在外侧,则像素在外侧;如果所有四个角都在里面,那么像素就在里面。对于其他像素,您可以通过超级采样进行抗混叠。

您也可以使用如Warnock's algorithm中的四叉树进行自适应渲染,但是您必须针对梯形(或通常的凸多边形)实施更稳健的交叉点测试。你只需要检测一个正方形和梯形不相交,或者当梯形内有一个正方形时。像素级以外的四叉树深度将决定抗锯齿效果如何。

最后,您还可以通过计算梯形所覆盖的像素区域的百分比来精确地绘制。这是多边形裁剪的问题,您可以使用Sutherland–Hodgman algorithm

+0

@Robs,如果你最终实现了这一点,我希望看到图像和代码,如果你可以分享。谢谢。 – lhf 2012-01-13 18:12:17

0

如果速度不是问题,一个可能的解决方案是绘制4或8倍分辨率的非抗锯齿梯形,然后线性缩小图像。