总评成绩:_________________________
实验类型: 交互
实验名称: 实验2.3草拟
姓名: __肖祥炜____________
学号: ____201158501103______ 班级: ___计111-1_______
电子文档提交: 按时提交____ 延时提交____ 未提交____
格式正确____ 基本正确____ 不正确____
实验报告: 完 整____ 合 格____ 不合格____
实验成绩:____________________
验收记录:时间________________ 顺序________________
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
一、原创性声明
程序参考了drawFreeCurve.c程序自由画线部分,其余的都是自己原创的
二、实验要求
1.单击左键移动鼠标开始自由绘图。
2.单击鼠标右键绘制随机曲线:
(1)单击键盘a放大图形
(2)单击键盘b缩小图形
三、完成情况
l 功能1 : 基本内容
² 功能描述:
² 完成情况: 基本完成实验要求,但是在绘制随机线条时,图案总是显示在左下角,如果图案调到中间左键自由绘制的时候点不在鼠标点上,不知道怎么改!!
² Bug:暂时没有找到
² 备注:图形放大会放大到窗口外面。
四、实现方案
1.用鼠标响应函数控制左右键,在左键条件下用一个参数记录鼠标单击几次,只有当参数为1 时才响应鼠标移动函数绘制点,所以只要鼠标移动速度比较慢就能自由绘制图形。
2.自由绘制随机曲线:绘制bezier曲线,把他的四个点用随机数代替就行,设置八个随机数分别控制4个点,单击右键,响应一次随机函数给4个点赋值。
3.放大缩小:放大与减少随机函数。
五、创新和亮点
六、运行结果
给出尽可能完备的测试用例及测试结果(截图)
- 合法的测试用例至少两个
- 1:左键单击移动鼠标形成的图案
2.右键单击形成的随机曲线
3.放大随机曲线
- 非法的测试用例至少两个
七、源码
#include <GL/glut.h>
#include <stdlib.h>
#include<iostream.h>
/* globals */
int iPointNum = 0; //定义一个鼠标记录单击几次的参数
int w[7];
int c,d,f,h,g,j,k; //七个随机数
GLsizei wh = 800, ww = 600;
int num[7]={0};
/* initial window size */
GLfloat size = 3.0; /* half side length of square */
//红色部分引用drawFreeCurve.c程序的画点部分
void drawSquare(int x, int y)//画点函数颜色随机
{
y=wh-y;
glColor3ub( (char) rand()%256, (char) rand()%256, (char) rand()%256);
glBegin(GL_POLYGON);
glVertex2f(x+size, y+size);
glVertex2f(x-size, y+size);
glVertex2f(x-size, y-size);
glVertex2f(x+size, y-size);
glEnd();
glFlush();
}
void myReshape(GLsizei w, GLsizei h)//初始化窗体点部分的
{
/* adjust clipping box */
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(10.0, (GLdouble)w, 0.0, (GLdouble)h, -10.0, 10.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0,0,w,h);
glClearColor (1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(4.0);
glFlush();
ww = w;
wh = h;
}
/* display callback required by GLUT 3.0 */
void display(void)
{ glViewport(0,0,ww,wh);
}
void random()//随机数产生函数
{ int i;
for( i=0;i<7;i++)
w[i]=(int) rand()%100;
for(i=0;i<7;i++)
num[i]=w[i];
}
void mouse()/画随机曲线函数
{
c=w[0]+num[0];
d=w[1]+num[1];
f=w[2]+num[2];
h=w[3]+num[3];
g=w[4]+num[4];
j=w[5]+num[5];
k=w[6]+num[6];
GLfloat ControlP[4][3]={{c,c,0.0}, {d,f,0.0},
{h,g,0.0}, {j,k,0.0}};
glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,*ControlP);
glEnable(GL_MAP1_VERTEX_3);
glFlush();
glutPostRedisplay();
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0, 0.0, 0.0);
glMapGrid1f(100,0.0,1.0);
glEvalMesh1(GL_LINE, 0, 100);
glFlush();
}
void MousePlot(GLint button, GLint action, GLint xMouse, GLint yMouse)// 右键鼠标响应函数
{
if(button == GLUT_LEFT_BUTTON && action == GLUT_DOWN) {
if(iPointNum == 0 || iPointNum == 2){
iPointNum = 1;
GLint x = xMouse; GLint y = wh- yMouse;
}
else {
iPointNum = 2;
GLint x = xMouse; GLint y = wh - yMouse;
}
}
if(button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN){
iPointNum = 0;
random();
mouse();
}
}
void PassiveMouseMove (GLint xMouse, GLint yMouse)//鼠标移动函数
{
if(iPointNum == 1) {
GLint x = xMouse;
GLint y = yMouse;
drawSquare(x, y);
}
}
void keyboard(unsigned char key, int x, int y)//键盘响应
{int i;
switch (key) {
case 'a':
for(i=0;i<7;i++)
num[i] *=2;
mouse();
break
case 'b':
for(i=0;i<7;i++)
num[i] /=-2;
mouse();
break;
default:
break;
}
}
void main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutCreateWindow("草拟一");
glutInitWindowSize(400, 400);
glutInitWindowPosition (100, 100);
glutDisplayFunc(display); //回调函数
glutReshapeFunc (myReshape);
glutMouseFunc(MousePlot); //指定鼠标响应函数
glutPassiveMotionFunc(PassiveMouseMove); //指定鼠标移动响应函数
glutKeyboardFunc (keyboard); //键盘响应函数
glutMainLoop();
}
第二篇:opengl计算机图形学实验报告之3D漫游世界
北师大珠海分校信息技术学院
计算机图形学实验报告
实验报告文件命名方式:学号姓名_实验序号_实验名称.doc