openGL虚线,点划线,KOCK曲线实验报告

  • 格式:doc
  • 大小:117.00 KB
  • 文档页数:12

下载文档原格式

  / 12
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验四实验报告

1、实验目的和要求

利用OpenGL实现实线,虚线,点划线的绘制,及kock曲线。

2、实验内容

1)用OpenGL程序绘制实现,虚线和点划线

2)用OpenGL程序,分别以直线和正三角形为初始生成员,实现迭代次数在6次以内的kock曲线,要求用键盘交互控制迭代次数。

3、实验步骤

1)相关算法及原理描述

①直线的绘制

在OpenGL中绘制直线通过指定直线段的端点来实现,用glVertex函数指定直线段端点的坐标位置,用glBegin/glEnd函数

对包含一系列的点坐标,并利用符号常量解释这些点构成直线的方

式。

②虚线的绘制

绘制虚线需要先调用函数过了Enable(GL_LINE_STIPPLE);打开划线模式。然后,函数glLineStipple将建立用于划线的模式

glLineStipple(Glint factor, GLushort pattern);

③Kock曲线

Kock曲线的初始生成员是一条直线,生成规则是将直线段分为三等分,首尾两段保持不变,中间用两段等长且互成60°角的直线

段代替。这样,直线段被分成四段,每段长度都只有原来的1/3。Kock

曲线的分形维数为 D=ln4/ln3≈1.26186

假设原直线的首尾点是P0(x0,y0),P1(x1,y1),则新的四段直线段的五个端点坐标分别为

(x0 , y0) (x0+(x1-x0)/3 , y0+(y1-y0)/3)

((x1+x0)/2±(y0-y1)√3/6 , (y1+y0)/2±(x1-x0)√3/6)

(x0+2(x1-x0)/3 , y0+2(y1-y0)/3) (x1 , y1)

其中,第三个点坐标公式中的正负号表示中间两条心直线段处于

元直线段的哪一侧。根据这一规则迭代六次。2)程序调试、测试与运行结果分析

①直线的绘制结果

②虚线的绘制结果

③以直线作为初始生成元的Kock曲线

④以三角形作为初始生成元的Kock曲线

4、实验总结

在上一次的实验基础上,利用GL_LINES画直线,这项实验内容比较容易。然后,利用glEnable(GL_LINE_STIPPLE)函数和glLineStiopple(Glint factor ,GLushort pattern)进行虚线和点画线的实现。也是比较简单的。

第二个实验是利用Kock曲线实现迭代生成图形,这个实验很难。用了两节课的时间,最终也没有成功。我自己没有做成功,去请教别人,看别人的才做出来的。看到生成的图像很漂亮

不管结果怎么样,我在这次的实验中学到了很多知识,对编程也好,对openGL也好,都有了更好更深的理解。

5、附录

1>直线的绘制

#include

int winWidth=400,winHeight=300;

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f);

}

void ChangeSize(int w,int h)

{

winWidth=w;

winHeight=h;

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,winWidth,0.0,winHeight);

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0f,0.0f,0.0f);

glBegin(GL_LINES);

glV ertex2i(100,80);

glV ertex2i(220,250);

glEnd();

glutSwapBuffers();

}

int main(int argc,char*argv[])

{

glutInit(&argc,argv);

glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);

glutInitWindowSize(400,300);

glutInitWindowPosition(100,100);

glutCreateWindow("直线");

glutDisplayFunc(Display);

glutReshapeFunc(ChangeSize);

Initial();

glutMainLoop();

return 0;

}

2>虚线及点划线的绘制

#include

int winWidth=400,winHeight=300;

void Initial(void)

{

glClearColor(1.0f,1.0f,1.0f,1.0f);

}

void ChangeSize(int w,int h)

{

winWidth=w;

winHeight=h;

glViewport(0,0,w,h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluOrtho2D(0.0,winWidth,0.0,winHeight);

}

void Display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0f,0.0f,0.0f);

glBegin(GL_LINES);

glV ertex2i(100,80);

glV ertex2i(220,250);