【教学课件】第4章二维填充图元的生成.ppt

上传人:小飞机 文档编号:5658754 上传时间:2023-08-06 格式:PPT 页数:78 大小:1.49MB
返回 下载 相关 举报
【教学课件】第4章二维填充图元的生成.ppt_第1页
第1页 / 共78页
【教学课件】第4章二维填充图元的生成.ppt_第2页
第2页 / 共78页
【教学课件】第4章二维填充图元的生成.ppt_第3页
第3页 / 共78页
【教学课件】第4章二维填充图元的生成.ppt_第4页
第4页 / 共78页
【教学课件】第4章二维填充图元的生成.ppt_第5页
第5页 / 共78页
点击查看更多>>
资源描述

《【教学课件】第4章二维填充图元的生成.ppt》由会员分享,可在线阅读,更多相关《【教学课件】第4章二维填充图元的生成.ppt(78页珍藏版)》请在三一办公上搜索。

1、1,第4章 二维填充图元的生成,2,本章目标,掌握如何绘制填充图元(矩形、多边形等)扫面转换算法(扫描线算法)填充算法学会使用OpenGL的绘制函数,3,主要内容,填充图元扫描转换矩形扫描转换多边形扫描转换扇形区域区域填充以图像填充区域字符的表示与输出OpenGL相关函数,4,4.1 填充图元,填充(Filling)矩形(Rectangle)多边形(Polygon)扇形(Ellipse Arc)步骤确定那些像素位于填充图元的内部用指定颜色绘制这些像素两类方法扫描转换(Scan Converting):参数点阵填充(Filling):点阵点阵,5,4.2 扫描转换矩形,含义用指定颜色填充矩形内部

2、区域定义矩形的参数左下角坐标(xmin,ymin)右上角坐标(xmax,ymax),void FillRectangle(Rectangle*rect,int color)int x,y;for(y=rect-ymin;y ymax;y+)for(x=rect-xmin;x xmax;x+)SetPixel(x,y,color);/*end of FillRectangle()*/,(xmin,ymin),(xmax,ymax),6,4.2 扫描转换矩形,问题矩形是简单的多边形,那么为什么要单独处理矩形?比一般多边形可简化计算应用非常多,如窗口系统共享边界如何处理?原则:左闭右开,下闭上开,属

3、于谁?,7,4.3 扫描转换多边形,多边形的表示方法顶点表示顶点序列P0P1P2Pn点阵表示扫描转换多边形:将顶点表示形式转换成点阵表示形式三种方法:逐点判断法;扫描线算法;边缘填充法多边形分类(只考虑:简单多边形,即多边形边不自相交)凸多边形(convex):内角小于180度凹多边形(concave):存在内角大于180度,8,4.3 扫描转换多边形,如何识别多边形的凸凹性方法1:观察多边形边的延长线是否划分顶点在两侧方法2:向量的叉积每条边建立一个向量,测试相邻边的叉积z坐标的正负(1)如果叉积同号,那么是凸多边形(2)如果叉积不同号,那么是凹多边形,(E1E2)z 0(E2E3)z 0(

4、E3E4)z 0(E5E6)z 0(E6E1)z 0,9,4.3 扫描转换多边形,向量叉积(Cross Product of Two Vector),当a与b为二维向量时,ab 矢量中x,y 分量为0,10,4.3.1 逐点判断法,基本原理判断绘图窗口内的像素是否位于多边形内,若是,则用指定颜色绘制该像素问题如何判断点在多边形的内外关系?射线法累计角度法*编码法*,(xmin,ymin),(xmax,ymax),11,4.3.1 逐点判断法,算法假设判断点是否在多边形内的函数为IsInside(),void FillPolygon(Polygon*P,int polygonColor)int

5、x,y;for(y=ymin;y=ymax;y+)for(x=xmin;x=xmax;x+)if(IsInside(P,x,y)SetPixel(x,y,polygonColor);else SetPixel(x,y,backgroundColor);/*end of FillPolygonPbyP()*/,#define MAX 100typedef struct/多边形顶点个数 int PolygonNum;/多边形顶点数组 Point vertexcesMAX Polygon;/多边形结构,12,4.3.1 逐点判断法,判断点是否在多边形内射线法 步骤从待判别点 v 发出射线求与多边形交

6、点个数 kk 的奇偶性决定了点与多边形的内外关系偶数:外奇数:内,v2,13,4.3.1 逐点判断法,判断点是否在多边形内射线法 奇异情况射线在边上:无数个点 判断是否与边同线交点为顶点:算几个?异侧:1个同侧:2个,14,4.3.1 逐点判断法,逐点判断扫描转换方法特点程序简单测试点是否在多边形内的算法速度太慢,效率低改进逐点判断法孤立考虑各个像素与多边形的内外关系利用内部点的连续性,15,4.3.1 逐点判断法,思考题 下图是某油田油井分布图,已知每口油井的位置(x,y坐标值)和产油量,如何求任意多边形(虚线所示)中的总产油量?,利用射线法判断油井是否在多边形内?,16,4.3.2 扫描线

7、算法,英文:Scan-Line Algorithm目标利用相邻像素之间的连贯性,提高算法效率处理对象:简单多边形非自交多边形(边与边之间除了顶点外无其它交点)扫描线(Scanning Line)平行于坐标轴的直线一般取平行于X轴区间:扫描线与边的交点间的线段,17,4.3.2 扫描线算法,连贯性(Coherence)边的连贯性(Edge Coherence)某条边与当前扫描线相交,也可能与下一条扫描线相交扫描线的连贯性(Scan-line Coherence)当前扫描线与各边的交点顺序与 下一条扫描线与各边的交点顺序可能相同或类似区间的连贯性(Span Coherence)同一区间上的像素取同

8、一颜色属性,18,4.3.2 扫描线算法,基本原理将整个绘图窗口内扫描多边形的问题分解到一条条扫描线,只要完成每条扫描线的绘制就实现了多边形的扫描转换一条扫描线与多边形的边有偶数个交点,每2个点形成一区间步骤(对于每一条扫描线)(1)计算扫描线与边的交点(2)交点按x坐标从小到大排序(3)交点两两配对,填充区间,19,4.3.2 扫描线算法,计算交点分类第一类交点:位于同一条边上的后继交点-(P2,P4)第二类交点:新出现的边与扫描线的交点-(P3)计算:由扫描线ye与多边形的交点递推计算扫描线 ye1的交点第一类交点:xx1/m第二类交点:线段的下端点即为交点,P3,P4,P0,P2,P1,

9、20,4.3.2 扫描线算法,计算交点(续)交点取整规则:要求:使生成的像素全部位于多边形之内用于线画图元扫描转换的四舍五入原则导致部分像素位于多边形之外,从而不可用,扫描转换,位于多边形内,21,4.3.2 扫描线算法,取整规则假定非水平变与扫描线 y=e 相交,交点的横坐标为x规则1 X为小数,即交点落于扫描线上两个相邻像素之间(a)交点位于左边之上,向右取整(b)交点位于右边之上,向左取整,22,4.3.2 扫描线算法,规则2落在右上边界的像素不予填充。具体实现时,只要对扫描线与多边形的相交区间左闭右开,23,4.3.2 扫描线算法,规则3 扫描线与多边形的顶点相交时,采用上开下闭及右开

10、左闭取交点,保证交点正确配对。检查两相邻边在扫描线的哪一侧。只要检查顶点的两条边的另外两个端点的Y值,两个Y值中大于交点Y值的个数是0,1,2,来决定取0,1,2个交点,24,4.3.2 扫描线算法,计算交点(续)水平边不考虑排序扫描线连贯性采用插入排序交点两两配对与区间绘制区间连续性连续绘制区间上的像素,25,4.3.2 扫描线算法,算法实现数据结构(1)边的分类表ET(Edge Table)(又称新边表)按照边的下端点 y 坐标,对非水平边进行分类的链表下端点 y 坐标值等于i 的边属于第i类作用:避免盲目求交,26,4.3.2 扫描线算法,ET定义每条扫描线,对应一个链表链表中每个结点的

11、结构,typedef struct int ymax;float x,deltax;Edge*nextEdge;Edge;,ET的结点信息:ymax:边的上端点的y坐标值x:边的下端点的 x 坐标deltax:边的斜率的倒数nextEdge:下一条边的指针,27,4.3.2 扫描线算法,结点结构解释,typedef struct int ymax;float x,deltax;Edge*nextEdge;Edge;,float x,deltax;用于递推计算交点 xx1/m,int ymax;当扫描线 y=e+1=ymax,说明下一条扫描线与此边不相交,28,4.3.2 扫描线算法,(2)活性

12、边表AEL(Active Edge List)存放活性边的顺序链表,且按交点 x 的值从小到大排序 活性边:与当前扫描线相交的边 边结构定义:,typedef struct int ymax;float x,deltax;Edge*nextEdge;Edge;,AEL 的结点信息:ymax:所交边的最高扫描线号x:当前扫描线与边的交点的x坐标deltax:边的斜率的倒数nextEdge:下一条边的指针,29,4.3.2 扫描线算法,实例,(a)Y=6对应的活性边表,(b)Y=7对应的活性边表,30,4.3.2 扫描线算法,算法(Scan-Line Algorithm)1、建立ET;2、将扫描线

13、纵坐标y的初值置为ET中非空 元素的最小序号,如图中,y=1;3、置AEL为空;4、执行下列步骤直至ET和AEL都为空4.1、如ET中的第y类非空,则将其中的所有 边取出并插入AEL中;4.2、如果有新边插入AEL,则对AEL中各边排序;4.3、对AEL中的边两两配对,(1和2为一对,3和4为一对,),将每对边中x坐标按规则取整,获得有效的填充区段,再填充4.4、将当前扫描线纵坐标 y 值递值1;4.5、将AEL中满足y=ymax边删去(因为每条边被看作下闭上开的);4.6、对AEL中剩下的每一条边的x递增deltax,即x=x+deltax,31,4.3.2 扫描线算法,4.3.2 扫描线算

14、法,例子,y=5 y=6 y=7 y=8,AET:y=1 y=2 y=3 y=4,4 4-1,5 33/4 5/4,5 19/2 5/4,4 3-1,8 2 0,5 43/4 5/4,8 2 0,8 2 0,8 2 0,11 12 0,11 12 0,8 7-5,11 7 5/4,11 12 0,11 33/4 5/4,11 12 0,32,4.3.2 扫描线算法,思考问题算法如何体现连贯性?对凸多边形而言,算法是否可以简化?如何简化?对三角形而言,算法如何简化?,三角形广泛应用于物体建模,33,思考题,思考问题 如何高效计算平面上 n 条线段的交点?,利用扫描线和边的连贯性,时间复杂性mn(

15、m为扫描线条数,n为与扫描线相交边的平均条数,n n),一般方法:两两求交点,时间复杂性 n2,34,4.3.3 边缘填充算法*,写像素的逻辑操作主要包括:拷贝、异或(求余)等写模型:像素的颜色与源像素及像素当前颜色相关,35,4.3.3 边缘填充算法*,求余运算假定A为一个正整数,则 M 的余定义为 A M,记为 求余运算可用异或逻辑运算实现例性质,36,4.3.3 边缘填充算法*,求余运算(续)应用:光标移动、橡皮筋线和加亮菜单等操作如:交互绘制线段时的橡皮筋线,交互方式:(1)点击鼠标左键输入线段的一个端点(2)点击右键(或左键)输入另一端点(3)鼠标移动过程中绘制瞬时线段,注意:不能采

16、用直接绘制(复制、拷贝)方法,37,4.3.3 边缘填充算法*,边缘填充算法光栅图形中,如果某区域已着上值为M的颜色值后,做偶数次求余运算,该区域颜色不变;而做奇数次求余运算,则该区域颜色变为值为 的颜色这一规律应用于多边形扫描转换,称为边缘填充算法。算法基本思想对于每条扫描线和每条多边形边的交点,将该扫描线上交点右方的所有像素取余M为填充色,A为当前背景色,38,4.3.3 边缘填充算法*,算法1(以扫描线为中心的边缘填充算法)1、将当前扫描线上的所有像素着上值为 颜色;2、求余:for(i=0;i=m;i+)在当前扫描线上,从横坐标为xi的交点向右求余;,图中次序:x0,x1,x2,x3,

17、次序可以任意,39,4.3.3 边缘填充算法*,算法2(以边为中心的边缘填充算法)1、将绘图窗口的背景色置为;2、对多边形的每一条非水平边做:从该边上的每个像素开始向右求余,40,特点适合用于具有帧缓存的图形系统。处理后,按扫描线顺序读出帧缓存的内容,送入显示设备优点:算法简单缺点:对于复杂图形,每一像素可能被访问多次,输入/输出的量比扫描线算法大得多,4.3.3 边缘填充算法*,41,扇形区域的描述圆的半径R起始角度:1终止角度:2原理:同扫描转换多边形对每条扫描线,首先计算与扇形区域边界的交点,再用指定颜色绘制绘制配对交点间的像素问题如何确定扫描线与直线段和圆弧段的交点及相交顺序?,4.4

18、 扫描转换扇形区域,42,方法:分类按点 P1(x,y)和P2(x,y)点所处象限的不同,需要将扇形区域分成44=16种情况 假设 P1 点落在第一象限 扫描线和区域边界只有2个交点扇形区域的扫描转换分四种情况(1)P2落在第一象限区域:OP1A和AP1P2,4.4 扫描转换扇形区域,43,(2)P2落在第二象限,此时又分为两种情况 当 时三个区域:OAP1、AP1BP2和P2BC当 时三个区域:OAP2、AP1BP2和P1BC,4.4 扫描转换扇形区域,44,(3)P2 落在第三象限三个区域:P1CA、BOP1A和P2OB(4)P2落在第四象限三个区域:AP1D、BOP1 A、CP2OB和C

19、EP2,4.4 扫描转换扇形区域,45,遗留问题:当 P1 落在其它区域时?P1 落在第二、三、四象限时,将扇形区域绕坐标原点顺时针旋转90度(180,270),使 P1 落在第1象限扫描转换再逆时针旋转90度(180,270),4.4 扫描转换扇形区域,46,区域:点阵表示的图形,像素集合表示方法:内点表示、边界表示内点表示枚举出区域内部的所有像素内部的所有像素为同一个颜色边界像素与内部像素的颜色不同边界表示枚举出边界上所有的像素边界上的所有像素为同一颜色内部像素与边界像素的颜色不同,4.5 区域填充,47,种子填充法对区域重新着色的过程 将指定的颜色从种子点开始扩展到整个区域区域填充算法要

20、求区域是连通的,4.5 区域填充,48,连通性4连通区域:区域中任意两点可通过上下左右四个方向互相 到达8连通区域:区域中任意两点可通过上下左右和对角线八 个方向互相到达,4.5 区域填充,49,4.5 区域填充,4连通与8连通区域的区别连通性:4连通可看作8连通区域,但对边界有要求不同依据区域内点能否访问到区域外的点,对边界的要求是4连通区域,边界只要8连通即可8连通区域,边界必须是4连通例:如左图(1)4连通区域,边界为 像素(2)8连通区域,边界为 和 像素,50,4.5.1 种子填充法,种子填充算法(泛滥填充:flood-fill)(1)内点表示的4连通区域种子P(x,y),原色old

21、Color,新颜色newColor方法:先判断P(x,y)的颜色,若其值不等于oldColor,说明该像素位于区域外,或已设置为newColor,算法结束;否则,置像素颜色为newColor,再对其相邻的上下左右四个像素分别作为种子作上述递归处理。,void FloodFill4(int x,int y,int oldColor,int newColor)if(GetPixel(x,y)=oldColor)SetPixel(x,y,newColor);FloodFill4(x,y+1,oldColor,newColor);FloodFill4(x,y-1,oldColor,newColor);

22、FloodFill4(x-1,y,oldColor,newColor);FloodFill4(x+1,y,oldColor,newColor);/*end of FloodFill4()*/,51,4.5.1 种子填充法,FloodFill4(x,y+1,oldColor,newColor);FloodFill4(x,y-1,oldColor,newColor);FloodFill4(x-1,y,oldColor,newColor);FloodFill4(x+1,y,oldColor,newColor);,52,(2)边界表示的4连通区域,4.5.1 种子填充法,void BoundaryFi

23、ll4(int x,int y,int oldColor,int newColor)/oldColor边界像素颜色 int color;color=GetPixel(x,y);if(color!=oldColor)/*end of BoundaryFill4()*/,53,缺点有些像素需要重复判断,降低算法效率栈结构占空间递归执行,算法简单,但效率不高,区域内每一像素都引起一次递归,进/出栈,费时费内存改进减少递归次数,提高效率方法之一使用扫描线填充算法,4.5.1 种子填充法,54,扫描线算法*,扫描线算法目标:减少递归层次适用于内点表示的4连通区域基本过程:当给定种子点时,首先填充种子点所

24、在的扫描线上的位于给定区域的一个区段,然后确定与这一区段相通的上下两条扫描线上位于给定区域内的区段,并依次保存下来。反复这个过程,直到填充结束,55,扫描线算法*,算法步骤1、初始化:将种子区段压入堆栈2、出栈:如果堆栈为空,则算法结束;否则取栈顶元素(x,y)作为种子点3、区段填充:从种子点(x,y)开始沿纵坐标为y的扫描行向左右两个方向逐个像素填色,直到边界为止4、定范围:以 xLeft,xRight为(3)得到的区段 5、进栈:分别在与当前扫描线相邻的上下扫描线上,确定位于区间xLeft,xRight内的区段。如果区段内的像素颜色值为newColor或boundaryColor,则转到(

25、2)区段压入堆栈,转到(2),56,例,扫描线算法*,像素中的序号标指它所在区段位于堆栈中的位置,57,多边形扫描转换与区域填充方法比较基本思想不同前者:顶点表示转换成点阵表示后者:只改变区域内填充颜色,没有改变表示方法对边界的要求不同前者:扫描线与多边形边界交点个数为偶数后者:区域封闭,防止递归填充跨界基本的条件不同前者:从边界顶点信息出发后者:区域内种子点,4.5.3 扫描转换与区域填充的比较,58,填充方式(1)均匀着色(2)位图不透明(3)位图透明(4)像素图填充在确定区域内的像素后,查询它对应的位图或图像中的单元,再以该单元的值按填充方式的不同显示该像素方法(1)均匀着色方法:将图元

26、内部像素置成同一颜色(2)位图不透明:若像素对应的位图单元为1,则以前景色显示该像素;若为0,则以背景色显示该像素;(3)位图透明:若像素对应的位图单元为1,则以前景色显示该像素;若为0,则不做任何处理。(4)像素图填充:以像素对应的像素图单元的颜色值显示该像素。,4.6 以图像填充区域,59,基本问题建立区域与图像间的对应关系方法1:建立整个绘图空间与图像空间的1-1映射,4.6 以图像填充区域,图像(纹理),绘图空间,60,例 适用:动画中漫游图像,如透过车窗看外景,4.6 以图像填充区域,61,方法2:建立区域局部坐标空间与图像空间的1-1映射,4.6 以图像填充区域,适用:图像作为区域

27、表面属性的情况,例如,桌面与其上的木纹,62,字符集ASCII码:128个字符GB231280:汉字6763个,682个图形符号点阵字体存储(压缩与非压缩)显示:检索与写缓冲矢量字体表示:笔画组成曲线(参数)扫描转换:参数到点阵显示:1、由编码检索 2、扫描转换存储:空间少(windows下的仿宋体库:SIMFANG.TTF 为3904K),4.7 字符的表示与输出,63,4.8 OpenGL相关函数,区域函数(填充作用)矩形函数:glRecti|s|f|dv()glBegin()中的参数 GL_POLYGON、GL_TRIANGLES、GL_TRIANGLE_STRIP、GL_TRIANGL

28、E_FAN三角形的三种绘制参数,int p1=20,100,p2=50,50;int p3=110,50,p4=140,100;int p5=110,150,p6=50,150;glBegin(GL_TRIANGLES);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();,GL_TRIANGLE_STRIP,GL_TRIANGLES,GL_TRIANGLE_FAN,p1,p1,p1,64,菜单函数int glutCreateMenu(vo

29、id(*func)(int value);/创建菜单void glutAddMenuEntry(char*name,int value);/添加菜单项void glutAddSubMenu(char*name,int menu);/添加子菜单glutAttachMenu(int button);例:,4.8 OpenGL相关函数,void MenuInit()int sub_menu1=glutCreateMenu(objectMenu);glutAddMenuEntry(直线,11);glutAddMenuEntry(多边形,12);glutCreateMenu(topMenu);glutA

30、ddSubMenu(图形,sub_menu1);glutAddMenuEntry(退出,2);glutAttachMenu(GLUT_RIGHT_BUTTON);,void objectMenu(int id)if(id=11)GraphicsType=11;else if(id=12)GraphicsType=12;else GraphicsType=0;void topMenu(int id)if(id=2)exit(0);,65,线框图与填充图函数:glPloygonMode(face,displayMode)face:指定前后面。可选值:GL_FRONT、GL_BACK和GL_FRON

31、T_AND_BACKdisplayMode:GL_FILL和GL_LINE,4.8 OpenGL相关函数,void display(void)glClearColor(1.0,1.0,1.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glPolygonMode(GL_FRONT,GL_LINE);glBegin(GL_POLYGON);glColor3f(1.0,0,0);glVertex2f(0.5,0);glVertex2f(-0.5,0.5);glVertex2f(-0.5,-0.5);glVertex2f(0.6,-0.5);glEnd();glFlush()

32、;,前向面:顶点序列逆时针顺序排列,66,颜色插值模式函数:glShadeModel(mode)Mode:GL_FLAT和GL_SMOOTH例:,4.8 OpenGL相关函数,void display(void)glClearColor(1.0,1.0,1.0,0.0);glClear(GL_COLOR_BUFFER_BIT);glShadeModel(GL_FLAT);/默认为GL_SMOOTH glBegin(GL_POLYGON);glColor3f(1,0,0);glVertex2f(-0.5,0.5);glColor3f(0,1,0);glVertex2f(-0.5,-0.5);gl

33、Color3f(0,0,1);glVertex2f(0.5,-0.5);glColor3f(1,1,1);glVertex2f(0.5,0.5);glEnd();glFlush();,GL_FLAT方式下以第1个点颜色填充,67,顶点数组原因:复杂图形需要很多坐标描述,导致函数调用量大增,影响程序的执行效率采用顶点数组减少函数调用方法调用函数glEnableClientState(GL_VERTEX_ARRAY),激活顶点数组特性调用glVertexPointer指定顶点坐标的位置和数据格式使用与数组相关的函数绘制图形,4.8 OpenGL相关函数,68,例:glClear(GL_COLOR_

34、BUFFER_BIT);glColor3f(1.0,0.0,0.0);vertex2 pt=20,100,50,50,110,50,140,100,110,150,50,150;glEnableClientState(GL_VERTEX_ARRAY);glVertexPointer(2,GL_INT,0,pt);GLubyte vertIndex=0,1,2,3,4,5;glDrawElements(GL_TRIANGLES,24,GL_UNSIGNED_BYTE,vertIndex);glFlush();,4.8 OpenGL相关函数,69,4.8 OpenGL相关函数,写像素模式16种,默

35、认方式为GL_COPY模式改变时,需要调用glEnable(GL_COLOR_LOGIC_OP)设置模式:glLogicOp(GL_XOR)例:异或模式,背景,正方形,70,4.8 OpenGL相关函数,填充图案函数启用函数:glEnable(GL_POLYGON_STIPPLE)关闭函数:glDisable(GL_POLYGON_STIPPLE)设置掩模(mask):glPolygonStipple(fillPattern)注意:filePattern类型为GLubyte,大小为3232,GLubyte fillPattern=0 x96,0 x96,0 x96,0 x96,0 x84,0

36、x84,0 x84,0 x84,0 x48,0 x48,0 x48,0 x48,0 x20,0 x20,0 x20,0 x20,0 x10,0 x10,0 x10,0 x10,0 x10,0 x10,0 x10,0 x10,0 x18,0 x18,0 x18,0 x18,0 x64,0 x64,0 x64,0 x64,。(重复3次),71,4.8 OpenGL相关函数,OpenGL位图函数void glRasterPos234SIFDV(TYPE x,TYPE y,TYPE z,TYPE w);设置当前所画位图或图像的原点glBitmap(width,height,x0,y0,xOffset,

37、yOffset,bitShape)设定当前光栅位置该函数显示二值位图。bitShape中的元素值为0或1,当为1时,用设定的颜色绘制对应的像素,否则对应像素不受影响位图的存储模式:字节glPixelStorei(GL_UNPACK_ALIGNMENT,1);,72,4.8 OpenGL相关函数,程序,void display()/最好放在初始化函数中 glPixelStorei(GL_UNPACK_ALIGNMENT,1);glColor3f(0.0,0.0,0.0);glRasterPos2i(100,200);glBitmap(8,12,0.0,0.0,20.0,20.0,rasters)

38、;glColor3f(1.0,0.0,0.0);glRasterPos2i(120,220);glBitmap(8,12,0.0,0.0,0.0,0.0,rasters);glColor3f(0.0,0.0,1.0);glRasterPos2i(150,200);glBitmap(8,12,0.0,0.0,0.0,0.0,rasters);glFlush();,rasters,73,4.8 OpenGL相关函数,绘制字符OpenGL基本库:位图方法,需要自己创建字库GLUT工具包:位图和轮廓字体位图字符函数:glutBitmapCharacter(font,character)font:指定字

39、型,常量(如GLUT_BITMAP_8_BY_13)Character:字符的ASCII码值轮廓字符函数:glutStrokeCharacter(font,character)font:指定字型,常量(如GLUT_STROKE_ROMAN)Character:字符的ASCII码值位图和轮廓字符比较前者速度快,后者放大缩小不变形,74,4.8 OpenGL相关函数,程序,void display()glColor3f(1.0,0.0,0.0);glRasterPos2i(50,50);glutBitmapCharacter(GLUT_BITMAP_9_BY_15,66);glRasterPos2

40、i(80,50);glutBitmapCharacter(GLUT_BITMAP_TIMES_ROMAN_10,66);glColor3f(0.0,0.0,1.0);glPushMatrix();glTranslatef(50,100,0);glScalef(0.2,0.2,1);glutStrokeCharacter(GLUT_STROKE_ROMAN,66);glPopMatrix();glTranslatef(100,100,0);glScalef(0.6,0.6,1);glutStrokeCharacter(GLUT_STROKE_ROMAN,66);glutSwapBuffers()

41、;,75,小结,多边形的扫描转换点是否在区域内的判断方法(射线法)扫描线算法(思想、步骤和算法实现)多边形的区域填充种子填充(连通性)扇形区域的扫描转换字符的绘制方法OpenGL函数,76,作业,1、多边形扫描转换的扫描线算法利用了扫描线的连贯性和边的连贯性,在数据结构和算法中各体现在何处?2、一个多边形的顶点坐标如下图所示。(a)写出边的分类表(b)说明扫描线y6,7,8,9和10时,哪些边是活性边。并给出活性边表。,77,作业,3、内点表示的区域和边界表示的区域在填充时有什么不同?4、根据三角形的特殊性,如何简化扫描转换三角形的扫描线算法。,78,上机题1:补充,添加填充图元的功能填充多边形多边形交互输入、颜色定义和填充,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号