前言
提示:本文所举的例子都是基于X轴为主位移方向
Wu反走样算法主要是根据直线上点距离上下像素的距离通过颜色的亮暗来画直线,说白了其实画了两条直线,只是颜色的设置使你看着还是一条线。
一、反走样算法是什么?
反走样算法是为了消除走样现象而设计的,那么,何为走样现象?走样现象就是线看着不直,像折线一样,这种反走样技术也称抗锯齿,走样在现实中没办法去避免,除非是绘制水平线、垂直线和45度斜线时不会发生走样,本文主要介绍Wu反走样算法。
二、算法原理
- Wu反走样算法的原理是对于理想直线上的任一点,同时用两个不同亮度等级的相邻像素来表示。
如图所示,当直线上的点与垂直线相交时,用两个像素点来表示,距离交点近的颜色深,距离远的和背景色相近,两个颜色亮度占比之和为100% - 构造距离误差项
假设当前坐标点为Pi(Xi,Yi),沿主位移方向递增一个单位,则下一个坐标点就要从Pu(Xi+1,Yi+1)和Pd(Xi+1,Yi)两个坐标点中选择一个,若直线与网格的交点是Q,e是Q到Pd的距离,那么坐标点Pd的亮度就为e,Pu的亮度就为1-e。
三、Wu反走样算法
- 沿主位移方向递增一个像素,在直线与垂直网格线交点的上下方同时绘制两个像素,但两个像素的亮度等级不同,和交点距离近的亮一点,距离远的暗一点,也就是和背景色相近。
- 递推计算误差项
ei的初值为0。主位移方向每递增一个单位,e就加上一个斜率k,当e大于1时,那么y坐标点就增加一个单位,完后e就得减去一,以保证从下一个y开始。
四、核心代码
本次代码都是以X轴为主位移方向
double e = 0;//初始化e
int Yi = start.y;//前一个点的y坐标
for (int x = start.x ; x <= ends.x; x++) {
putpixel(x, Yi + 1, RGB((1-e) * 255, (1 - e) * 255, (1 - e) * 255));
putpixel(x, Yi, RGB(e * 255, e * 255, e * 255));
e += k;
if (e >=1) {
e -= 1;
Yi++;
}
}
五、效果对比