opengl学习指导实验 计算机图形学上机(7)

2019-04-13 22:52

TempY=TempY*0.5;

mod=random(32766) % 3; switch(mod) { case 0: break;

case 1: TempX+=(double)StartX*0.5; break;

case 2: TempY+=(double)StartY*0.5; }

putpixel((int)TempX,(int)TempY,YELLOW); }

getch();

closegraph(); return 0; }

4、Mandelbrot集是特指在复平面上经过下列平方变换后不发散复数值Z的集合,平方变换为 Z0=Z; ZK=ZK-12+Z0; K=1,2,3,….N

即首先在复平面上选一点,然后计算变换位置Z2+Z。下一步,求变换位置的平方再加上初始Z值。重复此步骤直到可以确定变换是否发散。复平面上的收敛区域边界就是Mandelbrot集。 实现上述变换时,先在复平面上选一个窗口,然后将窗口上的位置映射到选定的屏幕视口中颜色编码的象素位置。变换式(即上面的公式)根据复平面上相应点的偏差率来选择象素颜色。复数大于2时,自平方算法下的结果将很快发散。因此,重复迭代Z时,,若复数的模大于2时就停止迭代。同时,迭代的次数通常取100和1000之间的某个值。根据迭代次数的多少,选择不同的颜色映射值。 实现Mandelbrot集算法时,可以把集合主要部分包含在下列复平面区域中: -2.25<=Re(Z)<=0.75 -1.25<=Im(Z)<=1.25

通过选择更小的窗口或放大所选区域的图示,可以发现一些集合边界上的细节。 #include\

typedef struct {float x,y;}ComplexNum;

complexNum complexSquare(complexNum z) { complexNum zSquare; zSquare.x=z.x*z.x-z.y*z.y; zSquare.y=2*z.x*z.y; return zSquare; }

int mandelSqTransf(complexNum z0,int maxIter) { complexNum z=z0; GLint count =0;

30

/*quit when z*z>4 */ while ((z.x*z.x+z.y*z.y<=4.0) && (count

void mandelbrot(int nx,int maxIter,,float realmin,float realmax,float imagmin,float imagmax) { float realInc=(realmax-realmin)/nx; float imagInc=(imagmax-imagmin)/ny; ComplexNum z; int x,y; int cnt; for(x=0,z.x=realmin;x

31

实验八 交互式技术

一、实验学时 2学时 二、实验类型 设计型实验 三、实验目的和要求

了解常用的交互式绘图技术,掌握简单的橡皮筋技术和菜单技术。 四、实验内容

1、下面的代码使用OpenGL函数实现直线的橡皮筋技术绘制。请修改代码,实现矩形的橡皮筋技术。

提示:1)已知绘制矩形的函数是glRecti(GLint x1,GLint y1, GLint x2,GLint y2)。当然同学们也可以编写绘制矩形的代码。

2)代码说明

第一个说明:鼠标的运动。在主函数中有一函数glutMotionFunc()是运动回调函数。只要鼠标移动了与系统有关的少量位置,就会产生事件。它的通常用法就是在按下鼠标键的同时移动鼠标画曲线。其函数原型是:

void glutMotionFunc ( void ( *f ) ( int x , int y ) ) //(x,y)代表鼠标位置 第二个说明:转换鼠标回调函数所返回的 y 值。因为鼠标回调函数的值是以屏幕坐标的形式给出,屏幕坐标系的原点为在屏幕左上角。而裁剪窗口使用的值和几何关系指定在世界坐标系下,其原点位于屏幕右下角。所以可以采用窗口高度 hh 减去鼠标得到的 y 值,得到准确的Y坐标值。 #include int i; int j;

GLint hh;

int xstart,ystart,xend,yend;

void mousemove(int xmove,int ymove) { glEnable(GL_COLOR_LOGIC_OP); glLogicOp(GL_XOR); glBegin(GL_LINES); glVertex2i(xstart,ystart); glVertex2i(xend,yend); glEnd(); xend=xmove; yend=hh-ymove; glBegin(GL_LINES); glVertex2i(xstart,ystart); glVertex2i(xend,yend); glEnd(); glFlush();

32

}

void mouseud (int btn,int state,int x,int y) { if (btn==GLUT_LEFT_BUTTON && state == GLUT_DOWN) { xstart = x; ystart = hh - y; xend=xstart; yend=ystart; } else if(btn==GLUT_LEFT_BUTTON && state == GLUT_UP) { xend =x; yend =hh-y; glDisable(GL_COLOR_LOGIC_OP); glBegin(GL_LINES); glVertex2i(xstart,ystart); glVertex2i(xend,yend); glEnd(); glFlush(); } }

void reshape(int w, int h) { glViewport(0,0,w,h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,(GLfloat)w,0.0,(GLfloat)h); hh=h; glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glClear(GL_COLOR_BUFFER_BIT); }

void init(void) { glClearColor(0.0,0.0,0.0,0.0); }

void display(void)

33

{ glColor3f(1.0,0.0,0.0); glFlush(); }

void main(int argc, char **argv) { glutInit(&argc,argv); glutInitDisplayMode (GLUT_SINGLE| GLUT_RGB); init(); glutInitWindowPosition(100,100); glutInitWindowSize(500,500); glutCreateWindow(\橡皮筋方式绘直线\ glutDisplayFunc(display); glutMotionFunc(mousemove); glutMouseFunc(mouseud); glutReshapeFunc(reshape); glutMainLoop(); }

2、菜单是交互式操作中非常好用的一种技术,GLUT提供了菜单这个窗口小组件技术。定义一个菜单至少有2个步骤。第一步,确定菜单中有哪些菜单项,即菜单中要显示哪些字符串。第二步,把特定的动作与行为“绑定”在一起。当用户松开将弹出一个菜单的鼠标键时,鼠标所在那一行的标识符就会传递给菜单回调函数。

1) 顶级菜单由glutCreateMenu()创建,要为这个函数指定菜单回调函数的名称。其函数原型如下:

void glutCreateMenu ( void (*f) ( int value) ) //该函数为所创建菜单返回一个独一无二的标识符。

2)菜单项由glutAddMenuEntry()添加到当前菜单。每个菜单项由两个部分组成:为这个菜单项显示的字串和选择这个菜单项时返回的值。其原型如下:

void glutAddMenuEntry ( char *name, int value)

3)最后,通过glutAttachMenu()把菜单附加给一个鼠标键。其原型如下:

void glutAttachMenu ( int button ) //button一般指GLUT_RIGHT_BUTTON,GLUT_LEFT_BUTTON。 4)子菜单 子菜单的名称在其父菜单中以菜单项的形式显示。 Void glutAddSubMenu ( char *name, int menu ) //添加一个名称为name的子菜单项,name将作为当前菜单中的下一项显示。Menu的值是创建子菜单时返回的子菜单标识符。 注意:要创建子菜单的话,必须建立在主菜单前,以便能在建立主菜单时它的标识符传递给glutAddMenu()。

下面是一个创建菜单的代码。请修改代码,请创建一个标题为“Color”的第三项菜单,并由该菜单弹出三个下拉菜单:一个将三角形顶点变红色,一个将三角形顶点变蓝色,一个将三角形顶点颜色变绿色。

提示:1)创建一个回调函数void colorSubMenu (GLint colorOption),让产生子菜单的glutCreateMenu()函数调用。

34


opengl学习指导实验 计算机图形学上机(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:仪器分析习题(色谱)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: