openGL虚线点划线KOCK曲线实验报告.docx
《openGL虚线点划线KOCK曲线实验报告.docx》由会员分享,可在线阅读,更多相关《openGL虚线点划线KOCK曲线实验报告.docx(8页珍藏版)》请在冰豆网上搜索。
openGL虚线点划线KOCK曲线实验报告
实验四实验报告
1、实验目的和要求
利用OpenGL实现实线,虚线,点划线的绘制,及kock曲线。
2、实验内容
1)用OpenGL程序绘制实现,虚线和点划线
2)用OpenGL程序,分别以直线和正三角形为初始生成员,实现迭代次数在6次以内的kock曲线,要求用键盘交互控制迭代次数。
3、实验步骤
1)相关算法及原理描述
1直线的绘制
在OpenGL中绘制直线通过指定直线段的端点来实现,用glVertex函数指定直线段端点的坐标位置,用glBegin/glEnd函数对包含一系列的点坐标,并利用符号常量解释这些点构成直线的方式。
2虚线的绘制
绘制虚线需要先调用函数过了Enable(GL_LINE_STIPPLE);打开划线模式。
然后,函数glLineStipple将建立用于划线的模式
glLineStipple(Glintfactor,GLushortpattern);
3Kock曲线
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)程序调试、测试与运行结果分析
1直线的绘制结果
2虚线的绘制结果
3以直线作为初始生成元的Kock曲线
4以三角形作为初始生成元的Kock曲线
4、实验总结
在上一次的实验基础上,利用 GL_LINES画直线,这项实验内容比较容易。
然后,利用glEnable(GL_LINE_STIPPLE)函数和glLineStiopple(Glintfactor,GLushort pattern)进行虚线和点画线的实现。
也是比较简单的。
第二个实验是利用Kock曲线实现迭代生成图形,这个实验很难。
用了两节课的时间,最终也没有成功。
我自己没有做成功,去请教别人,看别人的才做出来的。
看到生成的图像很漂亮
不管结果怎么样,我在这次的实验中学到了很多知识,对编程也好,对openGL也好,都有了更好更深的理解。
5、附录
1>直线的绘制
#include
intwinWidth=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,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(100,80);
glVertex2i(220,250);
glEnd();
glutSwapBuffers();
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("直线");
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
Initial();
glutMainLoop();
return0;
}
2>虚线及点划线的绘制
#include
intwinWidth=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,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(100,80);
glVertex2i(220,250);
glEnd();
glutSwapBuffers();
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
glutInitWindowSize(400,300);
glutInitWindowPosition(100,100);
glutCreateWindow("虚线");
glEnable(GL_LINE_STIPPLE);
glLineStipple(2,0X00FF);
glutDisplayFunc(Display);
glutReshapeFunc(ChangeSize);
Initial();
glutMainLoop();
return0;
}
3>以直线为生成元的Kock曲线
#include
#include
#include
#include
#definePI3.1415926
usingnamespacestd;
structPoint
{
floatx;
floaty;
};
staticvectorcount;
staticintm=0;//迭代次数
floatline;
voidfirst_state(vector&count) //初始情况是只有两个点
{
Pointfirst={-1.0f,0.0f},end={1.0f,0.0f};
line=sqrt(pow(first.x-end.x,2)+pow(first.y-end.y,2));
count.push_back(first);
count.push_back(end);
}
voidDraw_pic(vector&count)
{
for(vector:
:
size_typei=0;i!
=(count.size()-1);i++)
{
glBegin(GL_LINES);
glVertex2f(count[i].x,count[i].y);
glVertex2f(count[i+1].x,count[i+1].y);
glEnd();
}
}
voidCalculate_point(vector&count)
{
vectornew_count;
floatpline=line/(float)pow((float)3,(int)m);
vector:
:
size_typei;
for(i=0;i!
=(count.size()-1);i++)
{
Pointp1,p2,pmid;
p1.x=count[i].x+(count[i+1].x-count[i].x)/3;
p1.y=count[i].y+(count[i+1].y-count[i].y)/3;
p2.x=count[i+1].x-(count[i+1].x-count[i].x)/3;
p2.y=count[i+1].y-(count[i+1].y-count[i].y)/3;
doublealpha=0.0;
if(count[i+1].y>=count[i].y)
{
alpha=atan((double)(count[i+1].y-count[i].y)/(count[i+1].x-count[i].x));
if(count[i+1].x>count[i].x)
{
pmid.x=p1.x+pline*cos(alpha+PI/3);
pmid.y=p1.y+pline*sin(alpha+PI/3);