计算机图形学——反走样技术

一 什么是反走样技术

在绘制直线等图形时为了防止出现锯齿现象而设计的算法

二 反走样技术的应用

(一)直线的扫描转换

void myline(int x0, int y0, int x1, int y1)
{
	int x,y=y0;
	float e,k=float(y1-y0)/(x1-x0);  //e为直线到像素Pd的距离
    float Rf,Gf,Bf,Rb,Gb,Bb,R,G,B;  // Rf,Gf,Bf为前景色(直线颜色)三个分量,Rb,Gb,Bb为背景色三个分量,取值为[0,1]区间,R,G,B为当前像素颜色
	CDC *pDC=GetDC();
	e=0;
	for(x=x0;x<x1;x++)
	{
//直线扫描转换
		if (e>0.5)
        {
	
			R=Rb+e*(Rf-Rb);
			G=Gb+e*(Gf-Gb);                    
			B=Bb+e*(Bf-Bb);                    
			pDC->SetPixel(x,y+1,RGB(int(R*255+0.5), int(G*255+0.5), int(B*255+0.5))); 
		}
        else
        {
			R=Rb+(1-e)*(Rf-Rb);   
			G=Gb+(1-e)*(Gf-Gb);                      
			B=Bb+(1-e)*(Bf-Bb);                    
			pDC->SetPixel(x,y,RGB(int(R*255+0.5), int(G*255+0.5), int(B*255+0.5))); 
		}
		e=e+k;
	
		if(e>=1) {
			e=e-1;  
			y=y+1;  
		}
	}
	ReleaseDC(pDC);


}

(二)圆的扫描转换

void Circle(int x0, int y0, int r)
{
	int x=0,y=r;
	float e=0,d=1.25-r;
	float Rf,Gf,Bf,Rb,Gb,Bb,R,G,B;
	CDC *pDC=GetDC();
	while(x<=y){
		//计算Pu的颜色并绘制
		R=Rb+(1-e)*(Rf-Rb);   
		G=Gb+(1-e)*(Gf-Gb);                      
		B=Bb+(1-e)*(Bf-Bb);                    
		pDC->SetPixel(x,y,RGB(int(R*255+0.5), int(G*255+0.5), int(B*255+0.5))); 
		//计算Pd的颜色并绘制
		R=Rb+(1-e)*(Rf-Rb);   
		G=Gb+(1-e)*(Gf-Gb);                      
		B=Bb+(1-e)*(Bf-Bb); 
		pDC->SetPixel(x,y-1,RGB(int(R*255+0.5), int(G*255+0.5), int(B*255+0.5))); 
		if(d<0)
			{d=d+2*x+3;  x=x+1;  }
		else
			{ d=d+2*x-2*y+5;x=x+1;  y=y-1;     }
		 e=y-sqrt(r*r-x*x);
	}
	ReleaseDC(pDC);
}

你可能感兴趣的:(算法)