openGL虚线,点划线,KOCK曲线实验报告
- 格式:doc
- 大小:117.00 KB
- 文档页数:12
实验四实验报告
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);