《计算机图形学 第4章 基本图形生成算法》由会员分享,可在线阅读,更多相关《计算机图形学 第4章 基本图形生成算法(57页珍藏版)》请在金锄头文库上搜索。
1、计算机图形学基础第四章 基本图形生成算法提出问题:如何在指定的输出设备上根据坐标描述构造基本二维几何图形(点、直线、圆、椭圆、多边形域、字符串及其相关属性等) 图形的生成:图形的生成:是在指定的输出设备上,根据坐标描述构造二维几何图形。 图形的扫描转换:图形的扫描转换:在光栅显示器等数字设备上确定一个最佳逼近于图形的象素集的过程。 基本图形生成算法1 直线的扫描转换直线的绘制要求:直线的绘制要求:n1.直线要直n2.直线的端点要准确,即无定向性和断裂情况n3.直线的亮度、色泽要均匀n4.画线的速度要快n5.要求直线具有不同的色泽、亮度、线型等解决的问题:解决的问题:给定直线两端点P0(x0,y
2、0)和P1(x1,y1),画出该直线。1.1 数值微分法(DDA法)直线的微分方程:1 直线的扫描转换DDA算法原理: =1/max(|x|,|y|)max(|x|,|y|)=|x|,即|k|1的情况:max(|x|,|y|)=|y|,此时|k|1:注意注意:round(x)=(int)(x+0.5)Void DDAline(int x0,int y0,int x1,int y1) int dx,dy,eps1,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; If (abs(dx)abs(dy) eps1=abs(dx);
3、 else eps1=abs(dy); xIncre=(float)dy/(float)eps1; yIncre=(float)dy/(float)eps1; for (k=0;k0;对于直线下方的点,F(x,y)0。1 直线的扫描转换基本原理基本原理:假定0k1,x是最大位移方向判别式判别式:则有:误差项的递推误差项的递推d0:误差项的递推误差项的递推d0:初始值初始值d的计算的计算0k1时Bresenham算法的算法步骤算法步骤为:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、d=0.5-k、x=x0、y=y0;3.绘制点(x,y)。判断d的符号;若d0
4、,则(x,y)更新为(x+1,y+1),d更新为d+1-k;否则(x,y)更新为(x+1,y),d更新为d-k。4.当直线没有画完时,重复步骤3。否则结束。1.2 中点Bresenham算法1 直线的扫描转换改进改进:用2dx代替d1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、d= x-2 y、x=x0、y=y0。3.绘制点(x,y)。判断d的符号。若d0.5,则(x,y)更新为(x+1,y+1),同时将d更新为d-1;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。5.1.3 改进的Bresenham算法5.1 直线的扫
5、描转换改进改进1:令e=d-0.5e初=-0.5,每走一步有e=e+k。if(e0)thene=e-11.3 改进的Bresenham算法1 直线的扫描转换算法步骤算法步骤为:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、e=-0.5、x=x0、y=y0。3.绘制点(x,y)。4.e更新为e+k,判断e的符号。若e0,则(x,y)更新为(x+1,y+1),同时将e更新为e-1;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。1.3 改进的Bresenham算法1 直线的扫描转换改进改进2:用2ex来替换ene初=-x,n每
6、走一步有e=e+2y。nif (e0) then e=e-2x1.3 改进的Bresenham算法1 直线的扫描转换算法步骤算法步骤:1.输入直线的两端点P0(x0,y0)和P1(x1,y1)。2.计算初始值x、y、e=- x、x=x0、y=y0。3.绘制点(x,y)。4.e更新为e+2 y,判断e的符号。若e0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2 x;否则(x,y)更新为(x+1,y)。5.当直线没有画完时,重复步骤3和4。否则结束。1.3 改进的Bresenham算法1 直线的扫描转换2 圆的扫描转换解决的问题:绘出圆心在原点,半径为整数R的圆x2+y2=R2(y,
7、x)(-y,x)(-x,y)(-x,-y)(-y,-x)(y,-x)(x,-y)2.1 八分法画圆解决问题:2.2 简单方程产生圆弧算法原理:利用其函数方程,直接离散计算 圆的函数方程为: 圆的极坐标方程为: 2.3 中点Bresenham画圆构造函数F(x,y)=x2-y2-R2。n对于圆上的点,有F(x,y)=0;n对于圆外的点,F(x,y)0;n而对于圆内的点,F(x,y)0时,下一点取Pd(xi +1,yi-1)。M的坐标为:M(xi +1,yi-0.5)当F(xM,yM)0时,取Pd(xi +1,yi-1)当F(xM,yM)=0时,约定取Pu。构造判别式:误差项的递推第一种情况:d0
8、: 误差项的递推第二种情况:d0:判别式的初始值初始点(0,R)候选点(1,R-1)(1,R)中 点 (1,R-0.5)算法步骤:1.输入圆的半径R。2.计算初始值d=1.25-R、x=0、y=R。3.绘制点(x,y)及其在八分圆中的另外七个对称点。4.判断d的符号。若d0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。5.当xy时,重复步骤3和4。否则结束。改进:用d-0.25代替d算法步骤:1.输入圆的半径R。2.计算初始值d=1-R、x=0、y=R。3.绘制点(x,y)及其在八分圆中的另外七个
9、对称点。4.判断d的符号。若d0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。5.当x0;v对于椭圆内的点,F(x,y) x分量y分量 0,取Pd(xi+1,yi-1)误差项的递推 情况一:d10:误差项的递推 情况二:d10:上半部判别式的初始值: 再来推导椭圆弧下半部分的绘制公式判别式判别式 误差项的递推误差项的递推 判别式的初值判别式的初值判别式 v若d20,取Pl(xi,yi-1)v若d20,取Pr(xi+1,yi-1)误差项的递推第一种情况:d20:误差项的递推第一种情况:d20:下半部判别式的初始值:用上半部分计算的最后点(x,y)来计算下半部分中d的初值注意:n上半部分的终止判别n下半部分误差项的初值算法步骤:1.输入椭圆的长半轴a和短半轴b。2.计算初始值d=b2+a2(-b+0.25)、x=0、y=b。3.绘制点(x,y)及其在四分象限上的另外三个对称点。4.判断d的符号。若d0,则先将d更新为d+b2(2x+3),再将(x,y)更新为(x+1,y);否则先将d更新为d+b2(2x+3)+a2(-2y+2),再将(x,y)更新为(x+1,y-1)。5.当b2(x+1)0时,重复步骤7和8。否则结束。