扫描线填充算法_第1页
扫描线填充算法_第2页
扫描线填充算法_第3页
扫描线填充算法_第4页
扫描线填充算法_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、任意封闭多边形的扫描线填充算法类 收藏这个代码不是我写的, 但是我肯定这代码是一个牛人写的, 放在这里供大家学习和使用啦! 感谢原作者!我在这里做了些改进:1 去除了绘制多边形的函数,使其成为了一个纯的填充算法模块2 改进了其成员变量,使其更容易让大多数人所使用3 改进了填充,使其“看” (代码上)起来更像用扫描线在填充改进后的扫描线算法类如下:/ 扫描线填充算法类 class CPFillpublic:CPoint *Point;/ 指向点坐标的指针int Count;/ 多边形点的个数public:CPFill(int,int,int);/ 构造函数bool FillPolygon(CDC

2、*);/ 填充多边形bool CrossJudge(CPoint,CPoint,CPoint,CPoint,CPoint&);/ 判断两条线段是否相交int GetAi(int);/ 获取下一个点的索引号int GetBi(int);/ 获取前一个点的索引号bool Sort(int*,int);/ 冒泡排序CPFill();析构函数;/ 构造函数 (模块入口, koradji 注,合理的设计这个地方,就可以完全不用改动其他的地 方就可以使用这个类)CPFill:CPFill() / 获取前一个点的索引号int CPFill:GetBi(int i)return (i=0)? Count-1:

3、i-1;/ 获取下一个点的索引号 int CPFill:GetAi(int i)return (i=Count-1)?0:i+1;/ 在指定的 pDC 设备中,填充多边形bool CPFill:FillPolygon(CDC* pDC)/ 获取多边形中所有坐标点的最大值和最小值,作为扫描线循环的范围int minX=Point0.x , minY=Point0.y;int maxX=Point0.x , maxY=Point0.y;for(int i=1;iPointi.x) minX=Pointi.x;if(minYPointi.y) minY=Pointi.y;if(maxXPointi.

4、x) maxX=Pointi.x;if(maxYPointi.y) maxY=Pointi.y;CUIntArray xArray;int y;for(y=minY;ymaxY;y+)/ 扫描线从 minY 开始到 maxYfor(i=0;iPointCross.y)&(PointAi.yPointCross.y)/ 边顶点的 y 值大于交点的 y 值, x 坐标取两次 xArray.Add(PointCross.x); xArray.Add(PointCross.x);else个小/边顶点的y值在交点的y值之间,即一个顶点的y值大于交点的y值,而另于,相应的 x 坐标取一次if(PointB

5、i.y-PointCross.y)*(PointAi.y-PointCross.y)0) xArray.Add(PointCross.x); else if(PointCross.y=PointAi.y) xArray.Add(PointCross.x);elseif(PointCross=PointBi) continue;else xArray.Add(PointCross.x);/ 当交点不在线段的顶点时,x 坐标只取一次int *scanLineX,num=xArray.GetSize();scanLineX=new intnum;for(i=0;inum;i+) scanLineXi

6、=xArray.GetAt(i);/ 获取扫描线 x 值,以构成填充区间 xArray.RemoveAll();Sort(scanLineX,num);/ 对 scanLine (扫描线 x 坐标进行排序)for(i=0;i=num) break;pDC-MoveTo(scanLineXi,y);pDC-LineTo(scanLineXi+1,y);填充(Koradji 改进)Sleep(1);/CPU暂停1ms,以体现出多边形是以扫描线的方式,一条一条的填充的delete scanLineX;return true;/ 判断两条线段是否相交bool CPFill:CrossJudge(CPo

7、int L1P1,CPoint L1P2,CPoint L2P1,CPoint L2P2,CPoint& coordinate) L1P1、L1P2是一条线段的顶点坐标,而L2P1、L2P2是另一条线段的顶点坐标if(L1P1=L1P2) return false;/ 若 L1P1、L1P2相等,则构不成线段,退出 if(L2P1=L2P2) return false;/ 若 L2P1、L2P2等,则构不成线段,退出 if(L1P1.y-L1P2.y)*(L2P1.x-L2P2.x)=(L2P1.y-L2P2.y)*(L1P1.x-L1P2.x)/对斜率相等的情况下的 处理if(L1P1.y-

8、L1P2.y)*(L2P1.x-L1P1.x)=(L1P1.x-L1P2.x)*(L2P1.y-L1P1.y)判断两条线段是不是同 一条线段coordinate=L1P2;return true;else return false;if(L1P1.x=L1P2.x)当第一条线段斜率不存在时的double x,y;x=L1P1.x;y=(L2P1.y-L2P2.y)*1.0/(L2P1.x-L2P2.x)*(L1P1.x-L2P1.x)+L2P1.y;y=(float)(int)(y+0.5);if(L1P1.y-y)*(y-L1P2.y)=0)&(L1P1.x-x)*(x-L1P2.x)=0)

9、/ 判断交点是不是在该两条线段上coordinate.x=L1P1.x;coordinate.y=(int)(y+0.5);return true;return false;elseif(L2P1.x=L2P2.x)当第二条线段斜率不存在时double x,y;x=L2P1.x;y=(L1P1.y-L1P2.y)*1.0/(L1P1.x-L1P2.x)*(L2P1.x-L1P1.x)+L1P1.y;y=(float)(int)(y+0.5);if(L1P1.y-y)*(y-L1P2.y)=0) & (L1P1.x-x)*(x-L1P2.x)=0)判断交点是不是在该两条线段 上coordinat

10、e.x=L2P1.x;coordinate.y=(int)(y+0.5);return true;return false;else/ 两条线段斜率都存在时double k1,k2;k1=(L1P1.y-L1P2.y)*1.0/(L1P1.x-L1P2.x);k2=(L2P1.y-L2P2.y)*1.0/(L2P1.x-L2P2.x);/k1,k2 为计算的两线段的斜率double x,y;x=(L2P1.y-L1P1.y-k2*L2P1.x+k1*L1P1.x)/(k1-k2);y=(k1*k2*L2P1.x-k1*k2*L1P1.x+k2*L1P1.y-k1*L2P1.y)/(k2-k1)

11、;x=(float)(int)(x+0.5);y=(float)(int)(y+0.5);if(L1P1.y-y)*(y-L1P2.y)=0)&(L1P1.x-x)*(x-L1P2.x)=0) 判断交点是不是在该两条线段上coordinate.x=(int)(x+0.5);coordinate.y=(int)(y+0.5);return true;return false;return true;/ 冒泡排序bool CPFill:Sort(int* iArray,int iLength)int i,j,iTemp;bool bFlag;for(i=0;iiLength;i+)bFlag=tr

12、ue;for(j=0;j iArrayj+1)iTemp=iArrayj; iArrayj=iArrayj+1; iArrayj+1=iTemp;bFlag=false;if(bFlag) break;return true;/ 析构函数 ,删除动态生成的 Point 指针CPFill:CPFill()if(Point) delete Point;下面说说怎么为我所用这个类。index。在 MFC 中,若多边形控制定点的变量是: CPoint *P ,记录下标的变量为 int则构造函数则变为CPFill:CPFill(int index,CPoint *P)Poi nt=new CPoi nt

13、i ndex-1;Count=in dex-1;for(i nt i=0;iCo un t;i+)Poi nti=Pi;如果多边形控制定点的变量是:int pxMAX int pyMAX,记录下标的变量为int index。则构造函数是:CPFill:CPFill(i nt in dex,i nt px,i nt py)Poi nt=new CPoi nti ndex-1;Count=in dex-1;for(i nt i=0;i2);ASSERT(nCoIor=0);/ 边结构数据类型typedef struct Edgeint ymax; / 边的最大 y 坐标fIoat x; / 与当前

14、扫描线的交点 x 坐标fIoat dx; / 边所在直线斜率的倒数struct Edge * pNext; / 指向下一条边Edge, * LPEdge;int i=0,j=0,k=0;int y0=0,y1=0;/ 扫描线的最大和最小 y 坐标LPEdge pAET=NULL; / 活化边表头指针LPEdge * pET=NULL; / 边表头指针pAET=new Edge; / 初始化表头指针,第一个元素不用pAET-pNext=NULL;/ 获取 y 方向扫描线边界y0=y1=lpPoints0.y;for(i=1;inCount;i+)if(lpPointsi.yy1)y1=lpPoi

15、ntsi.y;if(y0=y1) return;/ 初始化边表,第一个元素不用pET=new LPEdgey1-y0+1;for(i=0;ipNext=NULL;for(i=0;ilpPointsj.y)?i:j;peg-ymax=lpPointsk.y; / 该边最大 y 坐标k=(k=j)?i:j;peg-x=(float)lpPointsk.x; / 该边与扫描线焦点 x 坐标 if(lpPointsi.y != lpPointsj.y) peg-dx=(float)(lpPointsi.x-lpPointsj.x)/(lpPointsi.y-lpPointsj.y);/ 该边斜率的倒数

16、 peg-pNext=NULL;/ 插入边 ppeg=pETlpPointsk.y-y0; while(ppeg-pNext) ppeg=ppeg-pNext;ppeg-pNext=peg;/ end if/ end for i/ 扫描 for(i=y0;ipNext;LPEdge peg1=pETi-y0;if(peg0)/ 有新边加入while(peg1-pNext) peg1=peg1-pNext;peg1-pNext=pAET-pNext; pAET-pNext=peg0;/ 按照 x 递增排序 pAET peg0=pAET; while(peg0-pNext) LPEdge pegm

17、ax=peg0;LPEdge peg1=peg0;LPEdge pegi=NULL;while(peg1-pNext) if(peg1-pNext-xpegmax-pNext-x) pegmax=peg1;peg1=peg1-pNext;pegi=pegmax-pNext; pegmax-pNext=pegi-pNext; pegi-pNext=pAET-pNext; pAET-pNext=pegi;if(peg0 = pAET) peg0=pegi;/ 遍历活边表,画线 peg0=pAET; while(peg0-pNext) if(peg0-pNext-pNext)DrawLine(int

18、)peg0-pNext-x,i,(int)peg0-pNext-pNext-x,i,pDC,nColor); peg0=peg0-pNext-pNext; else break;/ 把 ymax=i 的节点从活边表删除并把每个节点的 x 值递增 dx peg0=pAET;while(peg0-pNext) if(peg0-pNext-ymax pNext; peg0-pNext=peg0-pNext-pNext; / 删除 delete peg1;continue; peg0-pNext-x+=peg0-pNext-dx; / 把每个节点的 x 值递增 dx peg0=peg0-pNext;/

19、 删除边表 for(i=0;i New 中建立项目,基于单文档, View 类基于 Cview 添加库:在 project-Setting 中指定库初始化:选择 View-Class Wizard, 打开 MFC 对话框,添加相应的定义 添加类成员说明基于 OpenGL 的程序框架已经构造好, 以后用户只需要在对应的函数中添加程序 代码即可。下面介绍如何在 VC+ 上进行 OpenGL 编程。 OpenGL 绘图的一般过程可以 看作这样的 , 先用 OpenGL 语句在 OpenGL 的绘图环境 RenderContext (RC) 中 画好图 , 然后再通过一个 Swap buffer 的过

20、程把图传给操作系统的绘图环境 Devic eContext (DC) 中 ,实实在在地画出到屏幕上.下面以画一条 Bezier 曲线为例,详细介绍 VC+ 上 OpenGL 编程的方法。文 中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地 画出第一个 OpenGL 平台上的图形来。一、产生程序框架 Test.dswNew Project | MFC Application Wizard (EXE) | Test | OK *注* : 加 “者”指要手工敲入的字串二、导入 Bezier 曲线类的文件 用下面方法产生 BezierCurve.h BezierCurve.c

21、pp 两个文件:WorkSpace | ClassView | Test Classes| New Class | Generi c Class( 不用 MFC 类 ) | CBezierCurve | OK三、编辑好 Bezier 曲线类的定义与实现 写好下面两个文件:BezierCurve.h BezierCurve.cpp四、设置编译环境:1. 在 BezierCurve.h 和 TestView.h 内各加上:#include #include #include 2. 在集成环境中Project | Settings | Link | Object/library module | o

22、pengl32.lib glu32.lib glaux.lib | OK五、设置 OpenGL 工作环境: ( 下面各个操作,均针对TestView.cpp )1. 处理 PreCreateWindow(): 设置 OpenGL 绘图窗口的风格cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC;2. 处理 OnCreate(): 创建 OpenGL 的绘图设备。OpenGL 绘图的机制是 : 先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC ) 把图画好,再把所绘结果通过SwapBuffer()

23、函数传给 Window 的绘图上下文 Device Context ( 简记为 DC). 要注意的是,程序运行过程中,可以有多 个 DC ,但只能有一个 RC 。因此当一个 DC 画完图后,要立即释放 RC ,以便其 它的 DC 也使用。在后面的代码中,将有详细注释。int CTestView:OnCreate(LPCREATESTRUCT lpCreateStruct)if (CView:OnCreate(lpCreateStruct) = -1)return -1;myInitOpenGL();return 0;void CTestView:myInitOpenGL()m_pDC = ne

24、w CClientDC(this); / 创建 DCASSERT(m_pDC != NULL);if (!mySetupPixelFormat() / 设定绘图的位图格式,函数下面列出return;m_hRC = wglCreateContext(m_pDC-m_hDC);/ 创建 RC wglMakeCurrent(m_pDC-m_hDC, m_hRC); /RC 与当前 DC 相关联 /CClient * m_pDC; HGLRC m_hRC; 是 CTestView 的成员变量BOOL CTestView:mySetupPixelFormat()/ 我们暂时不管格式的具体内容是什么,以后

25、熟悉了再改变格式static PIXELFORMATDESCRIPTOR pfd =sizeof(PIXELFORMATDESCRIPTOR),/ size of this pfd1, / version numberPFD_DRAW_TO_WINDOW PFD_SUPPORT_OPENGL PFD_DOUBLEBUFFER,| / support window| / support OpenGL / double bufferedPFD_TYPE_RGBA, / RGBA type24, / 24-bit color depth0, 0, 0, 0, 0, 0, / color bits i

26、gnored0, / no alpha buffer0, / shift bit ignored0, / no accumulation buffer0, 0, 0, 0, / accum bits ignored32, / 32-bit z-buffer0, / no stencil buffer0, / no auxiliary bufferPFD_MAIN_PLANE, / main layer0, / reserved0, 0, 0 / layer masks ignored;int pixelformat;&pfd) = 0 )if ( (pixelformat = ChoosePi

27、xelFormat(m_pDC-m_hDC, MessageBox(ChoosePixelFormat failed); return FALSE;if (SetPixelFormat(m_pDC-m_hDC,pixelformat, &pfd)= FALSE)MessageBox(SetPixelFormat failed);return FALSE;return TRUE;3. 处理 OnDestroy()void CTestView:OnDestroy()wglMakeCurrent(m_pDC-m_hDC,NULL); / 释放与 m_hDC wglDeleteContext(m_hR

28、C); / 删除 RCif (m_pDC)delete m_pDC; / 删除当前 View 拥有的 DC对应的 RCCView:OnDestroy();4. 处理 OnEraseBkgnd()BOOL CTestView:OnEraseBkgnd(CDC* pDC)/ TODO: Add your message handler code here and/orcall default/ return CView:OnEraseBkgnd(pDC); / 把这句话注释掉,若不然,Window/会用白色北景来刷新,导致画面闪烁 return TRUE;/ 只要空返回即可。5. 处理 OnDra

29、w()void CTestView:OnDraw(CDC* pDC) wglMakeCurrent(m_pDC-m_hDC,m_hRC);/ myDrawScene( ); / 具体的绘图函数,在 SwapBuffers(m_pDC-m_hDC);/ 把 RC /在屏幕上显示 wglMakeCurrent(m_pDC-m_hDC,NULL);/ void CTestView:myDrawScene( glClearColor(0.0f,0.0f,0.0f,1.0f);/使 RC 与当前 DC 相关联RC 中绘制 中所绘传到当前的 DC 上,从而释放 RC ,以便其它 DC 进行绘图)设置背景颜

30、色为黑色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glPushMatrix();glTranslated(0.0f,0.0f,-3.0f);/ 把物体沿 (0,0,-1) 方向平移 / 以便投影时可见。因为缺省的视点在(0,0,0), 只有移开/物体才能可见。/ 本例是为了演示平面Bezier 曲线的,只要作一个旋转/ 变换,可更清楚的看到其3D 效果。/ 下面画一条 Bezier 曲线bezier_curve.myPolygon();/ 画 Bezier 曲线的控制多边形bezier_curve.myDraw(); /CBezierC

31、urve bezier_curve / 是 CTestView 的成员变量/具体的函数见附录 glPopMatrix();glFlush(); / 结束 RC 绘图return;6. 处理 OnSize()void CTestView:OnSize(UINT nType, int cx, int cy)CView:OnSize(nType, cx, cy);VERIFY(wglMakeCurrent(m_pDC-m_hDC,m_hRC);/ 确认 RC 与当前 DC 关联w=cx;h=cy;确认 DC 释放 RCVERIFY(wglMakeCurrent(NULL,NULL);/7 处理 On

32、LButtonDown()void CTestView:OnLButtonDown(UINT nFlags, CPoint point)CView:OnLButtonDown(nFlags, point); if(bezier_curve.m_NMAX-1)MessageBox( 顶点个数超过了最大数 MAX=50); return;/以下为坐标变换作准备GetClientRect(&m_ClientRect);/ 获取视口区域大小 w=m_ClientRect.right-m_ClientRect.left;/ 视口宽度 w h=m_ClientRect.bottom-m_ClientRec

33、t.top;/ 视口高度 h /w,h 是 CTestView 的成员变量 centerx=(m_ClientRect.left+m_ClientRect.right)/2;/ 中心位置, centery=(m_ClientRect.top+m_ClientRect.bottom)/2;/ 取之作原点 /centerx,centery 是 CTestView 的成员变量GLdouble tmpx,tmpy;tmpx=scrx2glx(point.x);/ 屏幕上点坐标转化为 OpenGL 画图的规范坐标 tmpy=scry2gly(point.y);bezier_curve.m_Vertexb

34、ezier_curve.m_N.x=tmpx;/ 加一个顶点 bezier_curve.m_Vertexbezier_curve.m_N.y=tmpy;bezier_curve.m_N+;/ 顶点数加一 InvalidateRect(NULL,TRUE);/ 发送刷新重绘消息 double CTestView:scrx2glx(int scrx)return (double)(scrx-centerx)/double(h);double CTestView:scry2gly(int scry)附录:1.CBezierCurve 的声明 : (BezierCurve.h)class CBezie

35、rCurvepublic:myPOINT2D m_VertexMAX;/ 控制顶点,以数组存储/myPOINT2D 是一个存二维点的结构/ 成员为 Gldouble x,yint m_N; / 控制顶点的个数public:CBezierCurve();virtual CBezierCurve();void bezier_generation(myPOINT2D PMAX,int level);/算法的具体实现void myDraw();/ 画曲线函数void myPolygon(); / 画控制多边形;2. CBezierCurve 的实现 : (BezierCurve.cpp)CBezier

36、Curve:CBezierCurve()m_N=4;m_Vertex0.x=-0.5f;m_Vertex0.y=-0.5f;m_Vertex1.x=-0.5f;m_Vertex1.y=0.5f;m_Vertex2.x=0.5f;m_Vertex2.y=0.5f;m_Vertex3.x=0.5f;m_Vertex3.y=-0.5f;CBezierCurve:CBezierCurve()void CBezierCurve:myDraw()bezier_generation(m_Vertex,LEVEL);void CBezierCurve:bezier_generation(myPOINT2D P

37、MAX, int level) / 算法的具体描述,请参考相关书本int i,j;level-;if(level0)return;if(level=0)glColor3f(1.0f,1.0f,1.0f);glBegin(GL_LINES);/ 画出线段glVertex2d(P0.x,P0.y); glVertex2d(Pm_N-1.x,Pm_N-1.y);glEnd();/ 结束画线段return; / 递归到了最底层,跳出递归myPOINT2D QMAX,RMAX;for(i=0;i Q .x=P.x;Q.y=P.y;for(i=1;i=i;j-)Qj.x=(Qj-1.x+Qj.x)/dou

38、ble(2);Qj.y=(Qj-1.y+Qj.y)/double(2);R0.x=Qm_N-1.x;R0.y=Qm_N-1.y;bezier_generation(Q,level);bezier_generation(R,level);void CBezierCurve:myPolygon()glBegin(GL_LINE_STRIP); / 画出连线段 glColor3f(0.2f,0.4f,0.4f);for(int i=0;im_N;i+)glVertex2d(m_Vertex.x,m_Vertex.y);glEnd();/ 结束画连线段OpenGL开发库的组成开发基于OpenGL的应用

39、程序,必须先了解OpenGL的库函数。它采用 C语言风格,提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有OpenGL函数采用了以下格式库前缀有gl、glu、aux、glut、wgl、glx、agl等等,分别表示该函数属于 OpenGL那个开发库等,从 函数名后面中还可以看出需要多少个参数以及参数的类型。I代表int型,f代表float型,d代表double型,u代表无符号整型。例如 glVertex3fv() 表示了该函数属于 gl库,参数是三个float型参数指针。我 们用glVertex*() 来表示这一类函数。OpenGL函数库相关的API有核心库(g

40、l)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、 agl、wgl)和扩展函数库等。从图1可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl是针 对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬 件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。下面逐一对这些库进行详细介绍。1 . OpenGL核心库核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生岀来的函

41、数原形多达300多个。核心库中的函数主要可以分为以下几类函数。绘制基本几何图元的函数。如绘制图元的函数glBegain() 、glEnd()、glNormal*() 、glVertex*()。矩阵操作、几何变换和投影变换的函数。如矩阵入栈函数glPushMatrix()、矩阵出栈函数glPopMatrix()、 装载矩阵函数glLoadMatrix()、矩阵相乘函数glMultMatrix(),当前矩阵函数 glMatrixMode() 和矩阵标准化函数 glLoadldentity(),几何变换函数 glTranslate*()、glRotate*() 和 glScale*(),投影变换函数

42、 glOrtho() 、glFrustum()和视口变换函数 glViewport()等等。颜色、光照和材质的函数。如设置颜色模式函数glColor*() 、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数 glMaterial()等等。显示列表函数、主要有创建、结束、生成、删除和调用显示列表的函数glNewList() 、 glEndList()、glGenLists() 、glCallList()和 glDeleteLists() 。纹理映射函数,主要有一维纹理函数glTexlmage1D()、二维纹理函数glTexlmage

43、2D() 、设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*() 、glTexEnv*() 和glTetCoord*() 等。特殊效果函数。融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*()。光栅化、象素操作函数。如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素 glReadPixel()、复制象素 glCopyPixel() 等。选择与反馈函数。主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer() 和反馈缓冲区glFee

44、dbackBuffer() 等。曲线与曲面的绘制函数。生成曲线或曲面的函数 glMap*() 、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*() 。状态设置与查询函数。主要有glGet*() 、glEnable() 、glGetError() 等。2 . OpenGL 实用库 The OpenGL Utility Library (GLU)包含有43个函数,函数名的前缀为glu。OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点。线、面开始。Glu为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数

45、,为开发者提供相对简单的用法,实现一些较为复杂的操作。此函数由glu.dll来负责解释执行。OpenGL中的核心库和实用库可以在所有的OpenGL平台上运行。主要包括了以下几种。辅助纹理贴图函数,有 gluScalelmage() 、gluBuild1Dmipmaps() 、gluBuild2Dmipmaps() 。坐标转换和投影变换函数,定义投影方式函数gluPerspective() 、gluOrtho2D() 、gluLookAt(),拾取投影视景体函数gluPickMatrix(),投影矩阵计算gluProject() 和gluUnProject() 等等。多边形镶嵌工具,有 gluN

46、ewTess() 、 gluDeleteTess() 、gluTessCallback() 、gluBeginPolygon() gluTessVertex() 、gluNextContour() 、gluEndPolygon() 等等。二次曲面绘制工具,主要有绘制球面、锥面、柱面、圆环面gluNewQuadric() 、gluSphere()、gluCylinder() 、gluDisk() 、gluPartialDisk() 、gluDeleteQuadric() 等等。非均匀有理B样条绘制工具,主要用来定义和绘制Nurbs曲线和曲面,包括gluNewNurbsRenderer() 、gl

47、uNurbsCurve() 、gluBeginSurface() 、gluEndSurface() 、gluBeginCurve() 、gluNurbsProperty() 等函数。错误反馈工具,获取出错信息的字符串gluErrorString().3. OpenGL辅助库包含有31个函数,函数名前缀为aux。这部分函数提供窗口管理、输入输出处理以及绘制一些简单三维物体。此函数由glaux.dll来负责解释执行。创建aux库是为了学习和编写 OpenGL程序,它更像是一个用于测试创意的预备基础接管。Aux库在windows实现有很多错误,因此很容易导致频繁的崩溃。在跨平台的编程实例和演示中,a

48、ux很大程度上已经被glut库取代。OpenGL中的辅助库不能在所有的OpenGL平台上运行。辅助库函数主要包括以下几类。窗口初始化和退出函数,auxlnitDisplayMode() 和 auxlnitPosition() 。窗口处理和时间输入函数,auxReshapeFunc() 、auxKeyFunc()和 auxMouseFunc() 。颜色索引装入函数,auxSetOneColor() 。三维物体绘制函数。包括了两种形式网状体和实心体,如绘制立方体auxWireCube() 和auxSolidCube()。这里以网状体为例,长方体auxWireBox()、环形圆纹面 auxWireTorus() 、圆柱auxWireCylinder()、二十面体 auxWirelcosahedron()、八面体 auxWireOctahedron() 、四面体auxWireTetrahedron()、十二面体

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论