资源描述:
《电脑图形教程——基本图形生成算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第三章输出图元学习要点OpenGL的输出图元。实现输出图元的设备级算法-基本图形生成算法。输出图元图形软件包中用来描述各种图形元素的函数。选定坐标系统->指定一个图形的几何要素->观察函数(投影)->将对象映射到视频监视器实现对象的显示。坐标系统(1/2)描述图形的坐标系-世界坐标系。存储对象的坐标-帧缓存中的整数象素位置。显示图形的坐标-屏幕坐标(与帧缓存中的整数象素位置对应)。设置象素的颜色值(setPixel(x,y))。坐标系统(2/2)OpenGL中指定二维世界坐标系统glMatrixMode(GL_PROJECTION);glLoad
2、Identity();gluOrtho2D(xmin,xmax,ymin,ymax);OpenGl画点函数glVertex{234}{sifd}[v](TYPEcoords)。glVertex*()函数必须在glBegin()和glEnd()函数之间。glBegin()的参数是GL_POINTS。glVertex*()中的参数可以是坐标值、矩阵、C++类或结构(struct)。OpenGL画线函数在glBegin()和glEnd()之间调用多个glVertex*()函数实现画多个线段。三个OpenGL符号常量指定线段类型。GL_LINESGL_L
3、INE_STRIPGL_LINE_LOOP画线算法-基本图形生成算法图元扫描转换直线段扫描转换圆弧扫描转换多边形实区域填充字符图形反走样光栅图形中点的表示…(x,y)坐标地址线性表1D表示显示屏幕2D表示像素由其左下角坐标表示光栅图形中点的表示地址=(xmax-xmin)*(y-ymin)+(x-xmin)+基地址xyxmaxxminymaxymin每行像素点数行数行中位置光栅图形中点的表示Address(x,y)=(xmax-xmin)*(y-ymin)+(x-xmin)+基地址=k1+k2y+xAddress(x±1,y)=k1+k2y+(x
4、±1)=Address(x,y)±1Address(x,y±1)=k1+k2(y±1)+x=Address(x,y)±k2Address(x±1,y±1)=k1+k2(y±1)+(x±1)=Address(x,y)±k2±1对像素连续寻址时,如何减少计算量?增量法的优点?图形显示的几种方式图形显示前需要:扫描转换+裁剪裁剪→扫描转换:最常用,节约计算时间扫描转换→裁剪:算法简单直线段扫描转换假设像素间均匀网格,整型坐标系,直线段斜率05、素进行写操作三个常用算法:1数值微分法(DDA)2中点画线法3Bresenham算法。数值微分(DDA)法(1/5)已知线段端点:P0(x0,y0),P1(x1,y1)直线方程y=kx+b{(xi,yi)},i=0,….n.浮点数取整:yi=round(yi)=(int)(yi+0.5)用到浮点数的乘法、加法和取整运算数值微分(DDA)法(2/5)增量算法yi+1=kxi+1+b=k(xi+1)+b=yi+k(xi,yi)→(xi+1,yi+k)缺点:有浮点数取整运算不利于硬件实现效率低仅适用于k≤1的情形:x每增加1,y最多增加1。当k
6、1时,必须把x,y互换。Example:drawsegmentxyint(y+0.5)00010+0.4020.4+0.4130.8+0.4141.2+0.4251.6+0.42round数值微分(DDA)法(3/5)voidlineDDA(intx0,inty0,intxend,intyend)intdx=x0-xend,dy=y0-yend,y,steps,k;floatxIncrement,yIncrement,x=x0,y=y0;if(fabs(dx)>=fabs(dy))steps=fabs(dx);elsesteps=fabs(d
7、y);xIncrement=float(dx)/float(steps);yIncrement=float(dy)/float(steps);setPixel(round(x),round(y));for(k=0;ksteps;k++)x+=xIncrement;y+=yIncrement;setPixel(round(x),round(y));数值微分(DDA)法(4/5)数值微分(DDA)法(5/5)缺点:取整操作和浮点数运算十分耗时取整误差的积累使象素位置偏离实际线段不易硬件实现中点画线法(1/4)问题:判断距离理想直线最近的下一个
8、象素点已知:线段两端点(x0,y0),(x1,y1)直线方程:F(x,y)=ax+by+c=0a=y0-y1b=x1-x0c=x0y1-