图形的扫描转换(光栅化):确定一个像素集合,用于显示一个图形的过程。1. 确定有关像素;2. 对像素进行写操作。
设给定直线起点坐标为 ,终点坐标为
则直线的隐函数方程为:
直线在水平方向上的位移:
直线在垂直方向上的位移:
假定:,则确定x方向为主位移方向
每次在主位移方向上移动,另一个方向则根据中点误差项的值决定是否移动
当 时:
当 时::
中点误差项的初始值 ,第一个中点坐标是M(),则 为:
圆心在原点,半径为R的圆方程的隐函数表达式为:
根据圆的对称性,可以用四条对称轴 x=0, y=0, x=y, x=-y 把圆分成8等份。
绘制出第一象限内的1/8圆弧,根据对称性就可绘制出整圆,这称为八分法画圆算法。
构造中点误差项
因此, ,
当 时,
当 时,
void CTestView::MBCircle(double R,CDC *pDC)
{
double x,y,d;
d=1.25-R;x=0;y=R;
for(x=0;x<=y;x++)
{
CirclePoint(x,y,pDC); //调用八分法画圆子函数
if(d<0)
d+=2*x+3;
else
{
d+=2*(x-y)+5;
y--;
}
}
}
void CTestView::CirclePoint(double x,double y,CDC *pDC) //八分法画圆子函数
{
//圆心坐标
CP2 pc=CP2((p0.x+p1.x)/2.0,(p0.y+p1.y)/2.0);
//定义圆的边界颜色
COLORREF dr=RGB(0,0,255);
pDC->SetPixelV(Round(x+pc.x),Round(y+pc.y),clr);//x,y
pDC->SetPixelV(Round(y+pc.x),Round(x+pc.y),clr);//y,x
pDC->SetPixelV(Round(y+pc.x),Round(-x+pc.y),clr);//y,-x
pDC->SetPixelV(Round(x+pc.x),Round(-y+pc.y),clr);//x,-y
pDC->SetPixelV(Round(-x+pc.x),Round(-y+pc.y),clr);//-x,-y
pDC->SetPixelV(Round(-y+pc.x),Round(-x+pc.y),clr);//-y,-x
pDC->SetPixelV(Round(-y+pc.x),Round(x+pc.y),clr);//-y,x
pDC->SetPixelV(Round(-x+pc.x),Round(y+pc.y),clr);//-x,y
}
走样(Aliasing):由离散量表示连续量引起的失真;走样是理想直线扫描转换后的必然结果,不可避免,只能减轻。
反走样/抗锯齿(Anti-Aliasing,AA):用于减轻走样现象的技术。一类是硬件技术,一类是软件技术。
硬件技术:提高显示器分辨率,不是理想的反走样技术;
软件技术:加权区域采样
Wu反走样算法:根据像素和理想直线的距离对响铃两个像素的亮度等级进行调节。