网学网为需要其他类别的朋友们搜集整理了反走样技术的研究与实现相关资料,希望对各位网友有所帮助!
客服咨询,网学网竭诚为您服务,本站永久域名:myeducs.cn |
3.2.2算法的实现 算法首先分析圆的特殊性,也就是圆具有八对称性,在画圆的同时进行反走样。 总之,算法充分利用圆的八对称性,以加权过取样算法基础,具体实现如下: 1) 显示圆的八个对称点函数 void CirclePoints(int x,int y,TColor color) { PutPixel(x,y,color); PutPixel(y,x,color); PutPixel(-y,x,color); PutPixel(-x,y,color); PutPixel(y,(-x),color); PutPixel(x,(-y),color); PutPixel(-x,(-y),color); PutPixel(-y,(-x),color); } 2) 以加权过取样算法为基础实现反走样圆 for(int i=1,ty=r->Value;i<=pts[0]-1;i++,ty--) { x1= (Form1->Image1->Width/2)+pts[i]; x2= (Form1->Image1->Width/2)+pts[i+1]; fx1= (Form1->Image1->Width/2)-pts[i]; fx2= (Form1->Image1->Width/2)-pts[i+1]; y=(Form1->Image1->Height/2)-ty; fy=(Form1->Image1->Height/2)+ty; SuperSamplingLine(x1,y,x2,y,true); SuperSamplingLine(y,x1,y,x2,true); SuperSamplingLine(fy,x1,fy,x2,true); SuperSamplingLine(fx2,y,fx1,y,true); SuperSamplingLine(y,fx2,y,fx1,true); SuperSamplingLine(x1,fy,x2,fy,true); SuperSamplingLine(fx2,fy,fx1,fy,true); SuperSamplingLine(fy,fx2,fy,fx1,true); } 下图3.3是圆反走样算法的部分效果实现图: 图3.3圆反走样效果 3.3 位图反走样 3.3.1实现原理 对位图进行反走样,原理很简单,就是将原图放大三倍以后进行像素点间的平均操作,也就是目标像素点周围的8个像素点加上自己这个像素点共9个像素点的红色分量的总和,然后取平均值,在赋给目标像素中的红色分量。同理,绿色分量和蓝色分量也类似处理。在这里用了两种方法可以实现此操作,一个就是直接用像素点进行操作,另一个就是Scanline方法。虽然这两种方法的实现原理是一样的,但是在速度上改进的Scanline方法明显要比直接用像素点进行操作的方法快。下面是这两个方法的具体实现。 3.3.2 程序实现 1)利用Pixels[]方法的实现技术 这是直接通过像素点的操作,对像素点逐个进行处理,分别得到红色、绿色、蓝色分量来反走样图形。这个方法虽然实现十分简单,但是处理的速度十分的慢,需要相当长的一段时间。算法的实现如下: (1)从一种颜色中求得R、G、B分量的过程 procedure TAntiAliasForm.SeparateColor(color: TColor; var r, g, b: Integer); begin r := Byte(color); g := Byte(color shr 8); b := Byte(color shr 16); end; (2)Pixels[]方法 procedure TAntiAliasForm.AntiAliasPicture; var x, y: integer; totr, totg, totb, r, g, b: integer; i, j: integer; begin for y := 0 to orig_bmp.Height - 1 do begin for x := 0 to orig_bmp.Width - 1 do begin //初始化为0 totr := 0; totg := 0; totb := 0; for i := 0 to 2 do begin //处理3*3矩阵中的像素点 for j := 0 to 2 do begin SeparateColor(big_bmp.Canvas.Pixels[(x*3)+j,(y*3)+I,r,g,b] totr := totr + r;//9个像素点的R分量总和 totg := totg + g; //9个像素点的G分量总和 totb := totb + b; //9个像素点的B分量总和 end; end; out_bmp.Canvas.Pixels[x, y] := RGB(totr div 9,totg div 9,totb div 9);//取平均值 end; end; end;
|
本站发布的计算机毕业设计均是完整无错的全套作品,包含开题报告+程序+论文+源代码+翻译+答辩稿PPT |
本文选自计算机毕业设计http://myeducs.cn |