南昌大学信工学院计算机图形学实验报告(附详细代码)_第1页
南昌大学信工学院计算机图形学实验报告(附详细代码)_第2页
南昌大学信工学院计算机图形学实验报告(附详细代码)_第3页
南昌大学信工学院计算机图形学实验报告(附详细代码)_第4页
南昌大学信工学院计算机图形学实验报告(附详细代码)_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、南昌丸爭实验报告实验课程: 学生姓名: 学 号: 专业班级:计算机图形学xxxxxx计算机科学与技术x班20xx年xx月xx日实验一直线和的生成实验二区域填充实验三裁剪算法实验四bezier曲线的绘制目录121523实验五b样条曲线的绘制27南昌大学卖验扌艮告学生姓名: 学 号: 专业班级:实验类型:验证口综合设计口创新 实验日期:实验成绩:实验一直线和的生成一、实验项目名称直线和圆的生成二、实验目的1、掌握dda、bresenham直线生成算法;2、掌握中点画圆生成算法三、实验要求1 编程实现dda、bresenham算法生成直线2、编程实现中点画圆的算法四、实验步骤1、根据实验要求分析实验

2、,并写出相应算法的实现2、选择适当语言实现算法;3、调试程序。五、实验内容1、bresenham画线算法的实现#include<glglut.h>#include<stdlib.h># include<math.h>void init(void)glclearcolor( 1.0,1.0,1.0,0.0);glmatrixmode(gl_projection);gluorlho2d(0.0,600.0,0.0,500.0);void setpixel(int x,int y)glbegin(gl_points);glvertex2i(x,y);glend()

3、;void linebres(int xojnt yo.int xendjnt yend)int dx=abs(xend-xo),dy=abs(yend-yo);int p=2*dy-dx;int twody=2*dy,twodyminusdx=2*(dy-dx); int x,y;if(xo>xend)x=xend;y=yend;elsex=xo;y=yo;setpixel( x, y);while(x<xend)x+;if(p<0)p+=twody;elsey+;p+=twodyminusdx;setpixel( x, y);void linesegment(void)

4、glclear(gl_color_buffer_bit); glcolor3f(0.0,0.0,1.0); linebres(50,50,400,300);glflush();void main(int argc,char* argv)glutlnit(&argc,argv);glutinitdisplaymode(glut_single|glut_rgb);glutinitwindowposition(50,100);glutinitwindowsize(400,300);glutcreatewindow(han line opengl program11);init();glutd

5、isplayfunc(linesegment); glutmainloopo;2、dda算法的实现#include<glglut.h>#include<math-h>void init(void)glcleai-color( 1.0,1.0,1.0,0.0); glmatrixmode(gl_projection); gluortho2d(0.0,600.0,0.0,500.0);void setpixel(int x,int y) glbegin(gl_points); glvertex2i(x,y);glend();inline int round(const fl

6、oat a)return int(a+0.5);void linedda (int xojnt yojnt xend,int yend) int dx=xend-x0,dy=yend-y0,steps,k; float xincrement,yincremenl,x=xo,y=yo; if(abs(dx)>abs(dy) steps=abs(dx);else steps=abs(dy);xincrement=glfloat(dx)/glfloat(steps); yincrement=glfloat(dy)/glfloat(steps); setpixel( x, y);for(k=0;

7、k<steps;k+)( x+=xlncrement; y+=ylncrement; setpixel( x, y);void linesegment(void)glclear(gl_color_buffer_bit);glcolor3f(1.0,0.0,0.0);linedda(50,50,400,300);glflush();void main(int argc,char* argv)glutlnit( dargsargv); glutinitdisplaymode(glut_single|glut_rgb); glutinitwindowposition(50,100);gluti

8、nitwindowsize(400,300);glutcreatewindow(hdda opengl program");init();glutdisplayfunc(linesegment); glutmainloop();13、圆的生成#include<glglut.h>#include <math.h>const int n = 20;const glfloat r = 0.5f;const glfloat pi = 3.1415926536f;void init(void)glclearcolom 1.0,1.0,1.0,0.0);glmatrixm

9、ode(gl_projection);gluortho2d(0.0,200.0,0.0,150.0);int i;glclear(gl_color_buffer_bit);glcolor3f(l.0,0.0,0.0); glbegin(gl_polygon);for(i=0; i<n; +i)glvertex2f(r*cos(2*pi/n*i), r*sin(2*pi/n*i);glend();glflush();1void main(int argc,char* argv)glutlnit(&argc,argv); glutinildisplaymode(glut_single

10、|glut_rgb); glutinitwindowposition(50,100);glutinitwindowsize(500,500);glutcreatewindow('ran circle opengl program*);glutdisplayfunc(mydisplay);glutmainloopo;return ;4、修改后的圆的生成#include <gl/glut.h>#include <math.h> const int n = 20;const glfloat r = 0.5f;const glfloat pi = 3.141592653

11、6f;void mydisplay(void)int i;glclear(gl_color_buffer_bit);glcolor3f( 1.0,0.0,0.0); glbegin(gl_polygon);for(i=0; i<n; +i) glvertex2f(r*cos(2*pi/n*i), r*sin(2*pi/n*i);glend();glflush();int main(int argc, char *argv)glutlnil(&argc, argv);glutinitdisplaymode(glut_rgb | glut_single); glutinitwindo

12、wposition( 100, 100);glutinitwindowsize(400, 400); glutcreatewindow(n 画圆的程序”); glutdisplayfunc(&mydisplay); glutmainloopo;return 05中点画算法#include<gl/glut.h>#include<stdlib.h># include<math.h>void init(void)glclearcolor(1.0,1.0,1.0,0.0);glmatrixmode(gl_projection);gluortho2d(0.0,

13、200.0,0.0j 50.0);1class screenptprivate:glint x,y;public:screenpt()x=y=0;void setcoords(glint xcoordvalue,glint ycoordvalue) x=xcoordvalue;y= ycoordvalue;glint getx() constreturn x;glint gety() const return y;void incrementx()x+;y_;;void setpixel(glint xcoord,glint ycoord) glbegin(gl.points);glverte

14、x2i(xcoord,ycoord); glend();void circlemidpoint(glint xc.glint yc,glint radius)screenpt circpt;glint p=l-radius;circpt.setcoords(0.radius);void ciecleplotpoints(glint,glint,screenpt); ciecleplotpoints(xc,yc,circpt); while(circpt.getx()<circpt.gety() circptjncrementxo;if(p<0)p += 2 * circpt.get

15、x() + 1; else circpt.decrementyo;p += 2 * (circpt.getx() - circpt.getyo) + 1; ciecleplotpoints(xc,yc,circpt);void ciecleplotpoints(glint xc,glint yc.screenpl circpt) setpixel(xc+circpt.getx(),yc+circpt.gety(); setpixel(xc-circpt.getx(),yc+circpt.gety(); setpixel(xc+circpt.getx(),yc-circpt.gety(); se

16、tpixel(xc-circpt.getx(),yc-circpt.gety();setpixel(xc+circpt.gety(),yc+circpt.getx(); setpixel(xc-circpt.gety(),yc+circpt.getx(); setpixel(xc+circpt.gety(),yc-circpt.getx(); setpixel(xc-circpt.gety(),yc-circpt.getx();glclear(gl_color_buffer_b!t);glcolor3f(0.0,l.(),0.0);circlemidpoint(50,50,20);glflus

17、h();void main(int argc,char* argv)glullnit(&argc,argv); glutinitdisplaymode(glut_single|glut_rgb); glutinitwindowposition(50,100);glutinitwindowsize(400,300);glutcreatewindow("a circle opengl program'1);glutdisplayfunc(mydisplay);glutmainloopo;六. 实验结果圆的生成:中点画圆算法:七、实验心得课本上有画直线和中点画圆的核心代码,

18、只要加上main函数和窗口定义等的基本函数, 稍微修改就可以得到完整的程序,比较简单。©南昌大学卖验报告学生姓名: 学 号: 专业班级:实验类型:口验证口综合设计口创新 实验日期:实验成绩:实验二区域填充一. 实验项目名称区域填充二. 实验目的1、理解区域的表示方法,能正确区分并应用区域的连通性;2、常握基于边界、内点的区域填充算法;3、掌握边界标志算法进行多边形扫描转换的程序实现方法;4、掌握边界种子填充算法进行区域填充的程序实现方法三. 实验要求编程实现种子填充算法四. 实验步骤1、根据实验要求分析实验,并写出相应算法的实现2、选择适当语言实现算法;3、调试程序。五. 实验内容1

19、、输入种子点坐标(x,y)、填充色、边界颜色2、种子像素入栈;当栈非空时重复执行如下三步操作:(1) 栈顶像素出栈;(2) 将出栈像素置成填充色;(3) 检查出栈像素的4-邻接点,若其中某个像素点不是边界色且未置成多边形色,则把 该像素入栈。实验代码如下:# incl ude<gl/gl ut .h>#include<stdlib.h>#include<math.h># include<windows.h>void init(void)glclearcolor( 1 0,lo 100.0);glmatrixmode(gl_projection);

20、gluortho2d(0.0,400.0,0.0,400.0);/初始化投影窗口,保持与显示的窗口一致void setpixel(int x,int y,long fillcolor)/自定义的 setpixel 函数glcolor3f(fillcolor«l 6,fillcolor«8,fillcolor);glbegin(gl.points);glvertex2i(x,y);glend();void boundaryfill4(int x,int y,long fillcolor,long bordercolor)/递归的边界填充算法unsigned char para

21、ms3;/定义存储颜色的数组long interiorcolor;/定义内部颜色glreadpixels(x,y,l ,1 ,gl_rgb,gl_unsigned_byte,params);/ 读取当前像素点的颜色 interiorcolor=rgb (params olparamsf 1 ,params2);/ 内部颜色的获取 if(interiorcolor! =bordercolor&&interiorcolor!=fillcolor)/ 递归setpixel(x,y,fillcolor);boundaryfill4(x+1 ,y,fillcolor,bordercolo

22、r);/ 右边 boundaryfill4(x-l,y,fillcolor,bordercolor);/ 左边 boundaryfill4(x,y+1,fillcolor,bordercolor);/ 上边 boundary fill4(x,y-1 ,fillcolor,bordercolor);/ 下边void linesegment(void)long bordercolor=rgb(0,255,0);/定义边界颜色long fillcolor=rgb(0,0,255);/定义填充颜色 glclear(gl_color_buffer_bit);glco!or3f(0,255,0);/画填充

23、的多边形,简单起见,画了一个正方形 glbegin(gl_line_loop);glvertex2i(50,50);glvertex2i(80,50);glvertex2i(80,80);glvertex2i(5o,ioo);glend();boundaryfill4(55,55,fillcolor,bordercolor);/ 调用递归函数glflush();void main(int argc,char* argv)glutlnit(&argc,argv); glutinitdisplaymode(glut_single|glut_rgb); glutinitwindowposit

24、ion(50,100);glutinitwindowsize(400,400);/保持与投影窗口尺寸一致 glutcreatewindow(n种子填充算法程序");glutdisplayf un c(linesegment);glutmainloopo;六、实验结果七、实验心得区域填充指的是在输出平面的闭合区域内完整地填充某种颜色或图案。种子填充在常握 了 “栈”这一抽象数据类型的实现方法的前提下,比较容易完成。©南昌大学卖验报告学生姓名: 学 号: 专业班级:实验类型:口验证口综合设计口创新 实验日期:实验成绩:实验三裁剪算法一、实验项目名称裁剪算法二、实验目的学握sut

25、herland-cohen直线裁剪算法三、实验要求实现sutherland-cohen直线裁剪算法四、实验步骤1、根据实验耍求分析实验,并写出相应算法的实现;2、选择适当语言实现算法;3、调试程序。五、实验内容cohen-sutherland 算法:任意平面线段和矩形窗口的位置关系只会有如下3种:a. 完全落在窗口内。b. 完全落在窗口外。c. 部分落在窗口内,部分落在窗口外。耍想判断线段和窗口的位置关系,只要找到线段的两端点用对于矩形窗口的位置即可. 线段的两端点相对于矩形窗口的位置可能会有如下儿种情况:3. 线段的两个端点均在窗口内,这时线段全部落在窗口内,完全可见,应予以保留。b. 线段

26、的两个端点均在窗口边界线外同侧,这吋线段全部落在窗口外,完全不可见,应 予以舍弃。c. 线段的一个端点在窗口内,另一个端点在窗口外,这时线段部分可见,应求出线段与 窗口边界线的交点,从而得到线段在窗口内的可见部分。d. 线段的两个端点均不在窗口内,但不处于窗口边界线外同侧,这时有可能线段是部分 可见的,也可能是完全不可见的。cohen-sutherland裁剪算法就是按照上述思路來对线段进行裁剪的,只是在线段的两端 点相对于矩形窗口的位置上,巧妙地运用了编码的思想。首先,如下图所示,延长窗口的四条边界线,将平面划分成9个区域,然后,用四位二 进制数63626160对这9个区域进行编码,编码规则

27、如下:第0位第1位0: 第2位62: 笫3位63:当线段的端点在窗口的左边界z左时, 当线段的端点在窗口的右边界z右时, 当线段的端点在窗口的下边界之下吋, 当线段的端点在窗口的上边界之上时,该位编码为1,该位编码为1,该位编码为1,该位编码为1,否则,该位编码为0。否则,该位编码为0。否则,该位编码为0。否则,该位编码为0。100110001010000100000010010101000110于是算法步骤可描述如下:步骤1:根据上述编码规则,对线段的两个端点进行编码。步骤2:根据线段的两端点编码判断线段相对于窗口的位置关系,从而决定对线段如何 剪。取两端点编码全为0000时,说明线段完全位

28、于窗口内,是完全可见的,于是显示此线段。 两端点编码逐位逻辑与不为0时,说明线段的两个端点位于窗口外同侧,即此线段完全位于 窗口外,是完全不可见的,于是全部舍弃,不显示此线段。两端点编码逐位逻辑与为0时,说明此线段或者部分可见,或者完全不可见。此时需要 计算出线段与窗口某一边界线或边界线的延长线的交点,若交点在窗口边界线的延长线上, 则说明该线段完全位于窗口外,不予以显示;若交点在窗口边界线上,则对以其中一个交点 为分割点的两端线段,再分别对其端点进行编码,并按照上述(1)和(2)所示的方法进行 测试,从而舍弃完全位于窗口外的一段线段,保留并显示完全位于窗口内的一段线段。实验代码如下:#inc

29、lude<stdlib.h> #include<math.h> #include<gl/glut.h>void init (void)glclearcolor( 1.0,1.0,1.0,1.0); glmatrixmode (gl.projection); gluortho2d(0.0,200.0,0.0,150.0);void setpixel (glint xcoord,glint ycoord) glbegin(gl_points);glvertex2i (xcoord,ycoord);glend();void setrect ()/绘制矩形裁剪窗口

30、glcolor3f(l.0,0.0,0.0);int pointl=90,20);int point2= 150,20;int point3= 150,140);int point4=90,140;glbegin(gl_line_strip);gl vertex2i v(point 1);glvertex2iv(point2);glvertex2iv(point3);glvertex2iv(point4);gl vertex2iv(point 1);glend();glflush();void linebres (int xo,int yo,int xend,int yend)/绘制直线 gl

31、color3f(1.0,0.0,0.0);int dx=abs(xend-xo),dy=abs(yend-yo);int p=2*dy-dx;int twody=2*dy,twodyminusdx=2*(dy-dx);int x,y;if(xo>xend)x=xend;y=yend;xend=xo;elsex=xo;y=yo;setpixel(x,y);while(x<xend)x+;if(p<0)p+=twody;elsey+;p+=twodyminusdx;setpixel(x,y);glflusho;1void linebres2 (int xo,int yojnt x

32、endjnt yend)/绘制裁剪后的直线 glcolor3f(1.0,1.0,1.0);int dx=abs(xend-xo),dy=abs(yend-yo);int p=2*dy-dx;int twody=2*dy,twodyminusdx=2*(dy-dx);int x,y;if(xo>xend)x=xend;y=yend;xend=xo;elsex=xo;y=yo;setpixel(x,y);while(x<xend)x+;if(p<0)p+=twody;elsey+;p+=twodyminusdx;setpixel(x,y);glflusho;1class wcpt

33、2dpublic:glfloat x,y;inline glint round(const glfloat a)return glint(a+0.5); const glint winleftbitcode=0x 1;const glint winrightbitcode=0x2;const glint winbottombitcode=0x4;const glint wintopbitcode=0x8;inline glint inside(glint code)return glint(jcode);inline glint reject(glint codel.glint code2)r

34、eturn glint(codel &code2);inline glint accept(glint code 1,glint code2)return glint(!(code l|code2);glubyte encode(wcpt2d pt,wcpt2d winmin,wcpt2d winmax) glubyte code=oxoo; if(pt.x<winmin.x) code=code|winleftbitcode;if(pt.x>winmax.x) code=code|winrightbitcode;if(pt.y<winmin.y) code=code

35、|winbottombitcode;if(pt.y>winmax.y) code=code|wintopbitcode;return (code); glflush();1void swappts(wcpt2d *pl,wcpt2d *p2)wcpt2d tern;tem=*pl;*pl=*p2;*p2=tem; glflush();void swapcodes(glubyte *cl,glubyte *c2) glubyte tem; tem=*cl;*cl=*c2;*c2=tem; glflush(); void lineclipcohsuth()glcolor3f(1.0,0.0,

36、0.0);/ 裁剪线的颜色 wcpt2d winmin,winmax; winmin.x=90.0;winmin.y=20.0;winmax.x=150.0;winmax.y= 140.0;wcpt2d pl,p2;pl.x=20.0;pl.y=50.0; p2.x=200.0; p2.y= 100.0;setrect ();linebres(round(pl .x),round(pl .y),round(p2.x),round(p2.y);glubyte codel,code2;glint done=false,plotline=false;glfloat m;while(!done)cod

37、e 1 =encode(p 1 .winmin,winmax);code2=encode(p2,winmin,winmax);if(accept(code 1 ,code2)done=true;plotline=true;elseif(reject(code 1 ,code2)done=true;elseif(inside(codel)svvappts(&p1 ,&p2);swapcodes(&code 1 & code2);if(p2.x!=pl.x)m=(p2.y-p 1 .y)/(p2.x-p 1 .x); if(code 1 & winleftb

38、itcode) pl.y+=(winmin.x-pl.x)*m; pl.x=winmin.x;elseif(code 1 & winrightbitcode) p ly+=(winmax.x-ppl.x=winmax.x;elseif(codel & winbottombitcode) if(p2.x!=pl.x)p l.x+=(winmin.y-p pl.y=winmin.y;elseif(code 1 & wintopbitcode)if(p2.x!=pl.x)p l.x+=(winmax.y-p 1 .y)/m;pl.y=winmax.y;if(plolline)

39、linebres2(round(p 1 .x),round(p 1 .y),round(p2.x),round(p2.y); glflush();void main(int argc, char *argv)glutlnit(&argc, argv);glutinitdisplaymode(glut_single |glut_rgb ); glutinitwindowposition(50, 100);glutinitwindowsize(400, 300); glutcreatewindow(n 裁剪算法”);gluldisplayfunc(lineclipcohsuth); glu

40、tmainloop();六. 实验结果3裁弟算法回七、实验心得通过这个实验,我掌握了 sutherland-cohen直线裁剪算法,希望在以后的实验中能够 再接再厉,做得更好!©南昌大学卖验报告学生姓名: 学 号: 专业班级:实验类型:口验证口综合设计口创新 实验日期:实验成绩:实验四bezier曲线的绘制一. 实验项目名称bezier曲线的绘制二. 实验目的1、裳握bezier曲线的定义生成算法;2、常握参数化曲线曲面的原理和方法。3、理解参数化曲线曲面的基本性质,特別是bezier曲线的基本性质。4、掌握型值点和控制顶点以及控制多边形的概念,理解控制点对曲线的控制作用。三. 实验

41、要求实现bezier曲线的算法四. 实验步骤1、根据实验要求分析实验,并写出相应算法的实现2、选择适当语言实现算法;3、调试程序。五. 实验内容bezier曲线的定义:给定空间n+1个点的位置矢量pi (i=0,l,2,.,n)则bezier曲线可定义为:p心已“,虫0,11=0其屮,pi构成该bezier曲线的特征多边形。实验代码如下:# incl ude<gl/gl ut .h>#include<stdio.h>#include<math.h>glsizei winwidth=700,winheight=700;glfloat xwcmin=-50,xw

42、cmax=50;glfloat ywcmin=-50,ywcmax=50;class wcptsdpublic:glfloat x,y,z;void init (void)glclearcolor(1.0,1.0,1.0,1.0);glmatrixmode (gl_projection);gluorlho2d(0.0,200.0,0.0j 50.0);1void plotpoint(wcpt3d bezcurvept)g!begin(gl_points);glvertex2f(bezcurvept.x,bezcurvept.y);glendo;glflush();void binomialco

43、effs(glint n,glint *c)/计算二项式系数glint k,j;for(k=0;k<=n;k+) ck=l;for(j=n;j>=k+l;j-)ck*=j;for(j=n-k;j>=2;j-)ck仁j;glflush();void computebezpt(glfloat u,wcpt3d * bezpt,glint nctrlpts,wcpt3d * ctrlpts,glint * c) /计算曲线沿路径坐标值glint k,n=nctrlpts-l;glfloat bezblendfcn;bezpt->x=bezpt->y=bezpt->

44、z=o.o;for(k=0;k<nctrlpts;k+) bezblendfcn=ck*pow(u,k)*pow(l -u,n-k);bezpt->x +=ctrlptsk.x*bezblendfcn;bezpt->y +=ctrlptsk.y*bezblendfcn;bezpt->z +=ctrlptsk.z*bezblendfcn;glflush();void bezier(wcpt3d *ctrlpts,glint nctrlpts,glint nbezcurvepts) /bezier 算法wcpt3d bezcurvept;glfloat u;glint *c

45、,k;c=new glint nctrlpts;binomialcoeffs(nctrlpts-1 ,c); for(k=0;k<nbezcurvepts;k+) u=glfloat(k)/glfloat (nbezcurvepts); computebezpt(u,&bezcurvept,nctrlpts,ctrlpts,c); plotpoint(bezcurvept);glflush();delete fc;void displayfunc(void) glint nctrlpts=4,nbezcurvepts=2000;wcpt3d ctrlpts4=-20.0,-30.

46、0,0.0,-10.0,100.0,0.0,10,-200.0,0,60,60,10); glclear(gl_color_buffer_bit);glpointsize(4);glcolor3f(1.0,0.0,0.0);bezier(ctrlpts,nctrlpts,nbezcurvepts);glflush();void winreshapefcn(glint newwidth.glint newheight) glviewport(0,0,newheight,newwidth);glmatrixmode (gl_projection);glloadldentityo;gluortho2

47、d(xwcmin,xwcmax,ywcmin,yvvcmax); glclear(gl_color_buffer_bit);glflush();void main(int argcchar* argv)glutlnit(&argc,argv);glutinitdisplaymode(glut_single|glut_rgb);glutinitwindowposition( 10,10);glutinitwindowsize(win width,winheight); glutcreatewindow("bezier 曲线”);inito;glutdisplayfunc(dis

48、playfunc); glutreshapefunc(winreshapefcn); glutmainloopo;六、实验结果七. 实验心得贝塞尔曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精 确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我 们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。®南昌大学卖验报告学生姓名: 学 号: 专业班级:实验类型:口验证口综合设计口创新 实验日期:实验成绩: 实验五b样条曲线的绘制一、实验项目名称b样条曲线的绘制二. 实验目的1、常握b样条曲线的定义生成算法;2、常握参数化曲线曲面的原理和

49、方法。3、理解参数化曲线曲面的基本性质。4、掌握型值点和控制顶点以及控制多边形的概念,理解控制点对曲线的控制作用。三、实验要求实现b样条曲线的算法四. 实验步骤1、根据实验要求分析实验,并写出相应算法的实现2、选择适当语言实现算法;3、调试程序。五. 实验内容b样条曲线的定义:在二维模式下,用自编程序生成三次b样条曲线。四个控制顶点的坐标可由用户任意输 入。三次b样条曲线和控制多边形必须同时显示在显示器上。用户改变控制点后,曲线应同 时得到调整。b样条曲线原理:b样条曲线是一种基函数为b样条基函数的参数曲线,三次b样条参数方程如下:p (t)二(丿0 3 丿3 (° 丿2,3(

50、9;)丿3.3(')p1gt2t其中参数te0,1p°、p» p2、p:,为四个控制顶点。b样条曲线是一种逼近曲线,曲线并不过任一个控制顶点。实验代码如下:#include <stdlib.h>#include <gl/glut.h>#pragma comment(lib,mglut32.1ib")#ifofloat points43= 10,10,0 ,5,10,2 ,5,0,0 ,10,5,2;#define num.points 4#elsefloatpoints93= 10,5,0,5,10,0,-5,15,0,-10,-5

51、,0, 4,4,0, 10,5,0,5,10,0, -5,15,0,-10,-5,0);#define num_points 9/*绘制首尾相接的平滑曲线*/#endifunsigned int lod=2();#define num_segments (num_points-3)float* getpoint(int i)if (i<0)return points0; 返冋第一个点if(i<num_points)return pointsi;return pointslnum_points-l j;返回最后一个点void myldle(void)glutpostredisplayo;void ondraw()glclear(gl_color_buffer_bit);glloadldentityo;glpointsize(3);glcoior3f(0.3,0,0.5);glbegin(gl_line_strip);for(int i=0;i! =

温馨提示

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

评论

0/150

提交评论