修改添加项:
C/C++ 中的 __WINDOWS
linker 中的 opengl32.lib glu32.lib glaux.lib
实验注意点:
橡皮筋技术的关键在于控制图形随着用户的操作(鼠标移动)而不断发生着变化,此时需要擦除原有的图形同时生成新的图形。橡皮筋技术有两种实现方法:
一种是利用颜色的异或操作,对原有图形并不是擦除,而是在绘制一条同样的直线段并与原图形进行异或操作,此时原图形会从屏幕上消失;另一种是利用双缓存
技术,绘制图形是分别绘制到两个缓存,交替显示。这里我们利用双缓存技术实现橡皮筋技术。
程序中经常使用的函数:
1/鼠标函数,对鼠标在窗口范围内的按键按下或松开时间进行处理:glutMouseFunc(MousePlot);其中MousePot函数是鼠标响应函数,
void MousePlot(Glint button,Glint action,Glint xMouse,Glint yMouse);
2/处理鼠标移动的注册函数:
当一个或多个鼠标按键被按下时在窗口内移动的注册函数:glutMotionFunc(MouseMove);
当鼠标按键没有被按下时在窗口内移动的注册函数:glutPassiveMotionFunc(PassiveMouseMove);
void Mousemove(Glint xMouse,Glint yMouse); void PassiveMouseMove(Glint xMouse,Glint yMouse);
3/指定窗口双缓存:glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);
4/确定窗口的高度以解决坐标对应的问题,glutReshapeFunc(ChangeSize),当窗口的大小发生变化是调用的函数。该函数的原型为void ChangeSize(int w,int h);
w和h表示变化后窗口的宽度和高度。glViewport(0,0,w,h);重新指定窗口的显示区域。
程序及注释如下:
#include"gl/glut.h" int ipointnum=0;//已确定点的数目 int x1=0,x2=0,y1=0,y2=0;//确定的点坐标 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);//指定当前的绘图颜色 if(ipointnum>=1) { glBegin(GL_LINES);//绘制直线段 glVertex2i(x1,y1); glVertex2i(x2,y2); glEnd(); } glutSwapBuffers();//交换缓冲区 } 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; x1=xMouse;y1=winHeight-yMouse;//确定直线段的第一个端点 } else { ipointnum=2; x2=xMouse;y2=winHeight-yMouse;//确定直线段的第二个端点 glutPostRedisplay();//指定窗口重新绘制 } } if(button==GLUT_RIGHT_BUTTON&&action==GLUT_DOWN) { ipointnum=0; glutPostRedisplay(); } } void PassiveMouseMove(GLint xMouse,GLint yMouse) { if(ipointnum==1) { x2=xMouse; y2=winHeight-yMouse;//将当前鼠标位置指定为直线的未固定端点 glutPostRedisplay(); } } int main(int argc,char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB);//使用双缓存及RGB模型 glutInitWindowSize(400,300);//指定窗口的大小 glutInitWindowPosition(100,100);//指定窗口在屏幕上的位置 glutCreateWindow("橡皮筋技术"); glutDisplayFunc(Display); glutReshapeFunc(ChangeSize);//指定窗口再整形回调函数 glutMouseFunc(MousePlot);//指定鼠标响应函数 glutPassiveMotionFunc(PassiveMouseMove);//指定鼠标移动响应函数 Initial(); glutMainLoop();//启动主GLUT时间处理循环 return 0; }