目录
一、算法介绍
Wu反走样算法,可以将线条变得更平滑,即产生抗锯齿效果。示意图如下:
二、算法描述
从起点开始,每走一步,x增加1。
在每一步中,分别计算 距离真实直线最近的 上下两个像素点 和直线之间的误差值——y坐标与真实直线y坐标之差。
如果误差值为0,则该像素点的强度取100%;如果误差值为0.8,则该像素点的强度取20%,依此类推,将上下两个像素涂上不同强度的颜色。
如下图所示:
上图中,红线代表最近的上方像素距离直线的误差值;绿线代表最近的下方像素距离直线的误差值。可以很容易看出,误差值越小,颜色涂得越深。在代码中,要计算误差值,可以使用浮点数并取小数部分的误差值。
综上,即为Wu反走样算法内容。
三、算法总结
伪代码:
void CTestView::ALine(CDC* pDC)
{
CPoint p0(-100, -50), p1(200, 50), p;
int dx, dy;
dx = p1.x - p0.x;
dy = p1.y - p0.y;
double k = (double)dy / dx, e;
for (p = p0, e = 0; p.x < p1.x; p.x++) {
pDC->SetPixelV(p.x, p.y, RGB(e * 255, e * 255, e * 255));
pDC->SetPixelV(p.x, p.y + 1, RGB((1 - e) * 255, (1 - e) * 255, (1 - e) * 255));
e += k;
if (e >= 1.0) {
p.y++;
e--;
}
}
}