opengl绘制实线、虚线、kock曲线(C++)_第1页
opengl绘制实线、虚线、kock曲线(C++)_第2页
opengl绘制实线、虚线、kock曲线(C++)_第3页
opengl绘制实线、虚线、kock曲线(C++)_第4页
opengl绘制实线、虚线、kock曲线(C++)_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、实验四1、实验目的和要求利用OpenGL实现实线,虚线,点划线的绘制,及kock曲线。2、实验内容用OpenGL程序绘制实现,虚线和点划线用OpenGL程序,分别以直线和正三角形为初始生成员,实现迭代次数在6次以内的kock曲线,要求用键盘交互控制迭代次数。3、实验步骤1)相关算法及原理描述直线的绘制在OpenGL中绘制直线通过指定直线段的端点来实现,用glVertex函数指定直线段端点的坐标位置,用glBegin/glEnd函数对包含一系列的点坐标,并利用符号常量解释这些点构成直线的方式。虚线的绘制绘制虚线需要先调用函数过了Enable(GL_LINE_STIPPLE);打开划线模式。然后,

2、函数glLineStipple将建立用于划线的模式glLineStipple(Glintfactor,GLushortpattern);Kock曲线Kock曲线的初始生成员是一条直线,生成规则是将直线段分为三等分,首尾两段保持不变,中间用两段等长且互成60角的直线段代替。这样,直线段被分成四段,每段长度都只有原来的1/3。Kock曲线的分形维数为D=ln4/ln31.26186假设原直线的首尾点是P0(xO,yO),P1(x1,y1),则新的四段直线段的五个端点坐标分别为(xO,yO)(xO+(x1-xO)/3,yO+(y1-yO)/3)(x1+x0)/2土(y0-y1)V3/6,(y1+y0

3、)/2(x1-x0)V3/6)(xO+2(x1-xO)/3,yO+2(y1-yO)/3)(x1,y1)其中,第三个点坐标公式中的正负号表示中间两条心直线段处于元直线段的哪一侧。根据这一规则迭代六次。2)程序调试、测试与运行结果分析直线的绘制结果PaintLine区1虚线的绘制结果回区IKock曲线绘制结果nxE次以内的Knockffi线绘制问冈5次哄内的Knockffl绘制4、实验总结这次是两个实验,先做的是直线、虚线的绘制,这要相对简单的多,直线、虚线的绘制只需要调用相应的函数即可,这个程序和上次的橡皮筋技术很像,只是线的两端点是自己指定的,不需要鼠标或键盘的确定。而Kock曲线就比较麻烦了

4、,只是知道原理,程序的编写遇到些困难。我觉得其实这和直线的绘制差不多,只是各新端点的坐标不好确定,所以利用了循环语句实现点的坐标的赋予,最终实现了该算法。这次的实验查了资料,也思考了很多,对直线、虚线、Kock曲线的绘制有了一定的了解与掌握,在下次实验中会继续认真完成的。5、附录1)直线的绘制#includeintwinWidth=400,winHeight=300;voidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f);voidChangeSize(intw,inth)winWidth=w;winHeight=h;glViewport(0,0,w

5、,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,winWidth,0.0,winHeight);voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glBegin(GL_LINES);glVertex2i(50,50);glVertex2i(300,250);glEnd();glutSwapBuffers();intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDis

6、playMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(100,100);glutCreateWindow(PaintLine);glutDisplayFunc(Display);glutReshapeFunc(ChangeSize);Initial();glutMainLoop();return0;2)虚线的绘制#includeintwinWidth=400,winHeight=300;voidInitial(void)glClearColor(1.0f,1.0f,1.0f,1.0f)

7、;voidChangeSize(intw,inth)winWidth=w;winHeight=h;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,winWidth,0.0,winHeight);voidDisplay(void)glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glEnable(GL_LINE_STIPPLE);glBegin(GL_LINES);glVertex2i(50,50);glVertex2i(30

8、0,250);glEnd();glutSwapBuffers();intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(100,100);glutCreateWindow(PaintLine);glLineWidth(3);glLineStipple(2,0 x0f0f);glutDisplayFunc(Display);glutReshapeFunc(ChangeSiz

9、e);Initial();glutMainLoop();return0;3)Kock曲线#include#include#include#includeusingnamespacestd;#definePI3.1415926structPointfloatx;floaty;inttype=0;staticvectorcount;/用来存放所有的点集合staticintm=0;/迭代次数floatline=0.0f;/线段的总长度voidfirst_state(vector&count)/初始情况是只有两个点Pointfirst=-0.6f,0.0f,end=0.6f,0.0f;line=sqr

10、t(pow(first.x-end.x,2)+pow(first.y-end.y,2);count.push_back(first);count.push_back(end);voidfirst_triangle(vector&count)/初始情况有三个点floatsqrtThree=sqrt(3.0);Pointfirst=0.2*sqrtThree,-0.2,second=-0.2*sqrtThree,-0.2,last=0,0.4;line=sqrt(pow(first.x-second.x,2)+pow(first.y-second.y,2);count.push_back(firs

11、t);count.push_back(second);count.push_back(last);voidDraw_pic(vector&count)/分别对两种的情况进行考虑一个是闭合的,一个开放的if(type=1)glBegin(GL_LINE_STRIP);for(vector:size_typei=0;i!=count.size();i+)glVertex2f(counti.x,counti.y);glEnd();elseif(type=2)glBegin(GL_LINE_LOOP);for(vector:size_typei=0;i!=count.size();i+)glVerte

12、x2f(counti.x,counti.y);glEnd();voidCalculate_point(vector&count)/计算线段的时候的,没有开始点和结束点计算的情况vectornew_count;floatpline=line/(float)pow(float)3,(int)m);/pline为三角形的边长,通过3的迭代次数次方来实现的vector:size_typei;for(i=0;i!=(count.size()-1);i+)Pointp1,p2,pmid;p1.x=counti.x+(counti+1.x-counti.x)/3;p1.y=counti.y+(counti+

13、1.y-counti.y)/3;p2.x=counti.x+2*(counti+1.x-counti.x)/3;p2.y=counti.y+2*(counti+1.y-counti.y)/3;doublealpha=atan(double)(counti+1.y-counti.y)/(counti+1.x-counti.x);if(counti+1.x-counti.x=0)alpha+=PI;pmid.x=p1.x+pline*cos(alpha+PI/3);pmid.y=p1.y+pline*sin(alpha+PI/3);new_count.push_back(counti);new_c

14、ount.push_back(p1);new_count.push_back(pmid);new_count.push_back(p2);new_count.push_back(counti);count.clear();count=new_count;/之前要清空voidCalculate_triangle(vector&count)/计算是三角形的时候,要加上对开始和结束点的计算vectornew_count;floatpline=line/(float)pow(float)3,(int)m);/pline为三角形的边长,通过3的迭代次数次方来实现的vector:size_typei;in

15、tcountSize=count.size();for(i=0;i!=countSize;i+)Pointp1,p2,pmid;intnext=i+1;if(next=countSize)next=0;p1.x=counti.x+(countnext.x-counti.x)/3;p1.y=counti.y+(countnext.y-counti.y)/3;p2.x=counti.x+2*(countnext.x-counti.x)/3;p2.y=counti.y+2*(countnext.y-counti.y)/3;doublealpha=atan(double)(countnext.y-co

16、unti.y)/(countnext.x-counti.x);if(countnext.x-counti.x=0)alpha+=PI;pmid.x=p1.x+pline*cos(alpha+PI/3);pmid.y=p1.y+pline*sin(alpha+PI/3);new_count.push_back(counti);new_count.push_back(p1);new_count.push_back(pmid);new_count.push_back(p2);/new_count.push_back(counti);count.clear();count=new_count;/之前要

17、清空voidmyDisplay()/自定义的图形绘制函数glClear(GL_COLOR_BUFFER_BIT);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glColor3f(0.0f,0.0f,1.0f);Draw_pic(count);glFlush();voidSpecialKeys(intkey,intx,inty)/键盘响应函数,当为UP的时候重绘和迭代if(key=GLUT_KEY_UP)m+;if(type=1)Calculate_point(count);elseif(type=2)Calculate_triangle(count)

18、;glutPostRedisplay();voidInitial(void)/设定初始的窗口内容色glClearColor(1.0f,1.0f,1.0f,1.0f);voidProcessMenu(intvalue)/处理相应菜单按钮的函数,设定一个模式值,对效果进行控制type=value;if(type=1)line=0.0f;m=0;count.clear();first_state(count);elseif(type=2)line=0.0f;m=0;count.clear();first_triangle(count);glutPostRedisplay();intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow(6次以内的Knock曲线绘制);/创建菜单并定义菜单回调函数intnGlutPolyMenu=glutC

温馨提示

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

最新文档

评论

0/150

提交评论