图形学实验一
运行环境:
实验工程和配置:
点击下载实验工程
Windows 10
Visual Studio 2017 已配置lib和include文件夹
系统文件配置32和64位的OpenGL环境。
实验一 图形的 平移 缩放
鼠标左右击缩放,方向键控制移动。(一开始在左下角,所以容易看不见)
// test1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #define GLUT_DISABLE_ATEXIT_HACK #pragma comment(lib, "Ws2_32.lib") #include <cmath> #include <cstdlib> #include <gl/glut.h> float width, highth, angle; void init(void)//画正方形 { glClearColor(1.0, 1.0, 6.0, 1.0);//背景颜色 glMatrixMode(GL_PROJECTION);// 投影 gluOrtho2D(0.0, 600.0, 0.0, 600.0);//参数分别代表(左下角x坐标,右上角x坐标,左下角y坐标,右上角y坐标) } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 1.0, 1.0);//矩形颜色 GLfloat PointA[2] = { 0+width,50+highth }, PointB[2] = { 10 + width,10 + highth }, PointC[2] = { 50 + width,0 + highth }, PointD[2] = { 10 + width,-10 + highth }, PointE[2] = { 0 + width,-50 + highth }, PointF[2] = { -10 + width,-10 + highth }, PointG[2] = { -50 + width,0 + highth }, PointH[2] = { -10 + width,10 + highth }; glBegin(GL_LINE_LOOP);//闭合折线 glLineWidth(6.0); glVertex2fv(PointA); glVertex2fv(PointB); glVertex2fv(PointC); glVertex2fv(PointD); glVertex2fv(PointE); glVertex2fv(PointF); glVertex2fv(PointG); glVertex2fv(PointH); glEnd(); glFlush(); } void mySpecialKeyboard(int key, int x, int y) { if (key == GLUT_KEY_RIGHT) width += 5; if (key == GLUT_KEY_LEFT) width -= 5; if (key == GLUT_KEY_UP) highth += 5; if (key == GLUT_KEY_DOWN) highth -= 5; glutPostRedisplay(); } void myKeyboard(unsigned char key, int x, int y) { glutPostRedisplay(); } void mymouse(int button, int state, int x, int y)//鼠标控制缩放 { if (state == GLUT_DOWN) { if (button == GLUT_LEFT_BUTTON) { glScalef(0.5, 0.5, 0.0); display(); } else if (button == GLUT_RIGHT_BUTTON) { glScalef(1.5, 1.5, 0.0); display(); } glutPostRedisplay();//重新调用绘制函数 } return; } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(50, 50); glutInitWindowSize(600, 600); glutCreateWindow("王子源,152210708117,鼠标右键放大,方向键移动"); init(); glutDisplayFunc(display); glutSpecialFunc(mySpecialKeyboard); glutMouseFunc(&mymouse); glutKeyboardFunc(myKeyboard); glutMainLoop(); return 0; }
实验一 图像的旋转
AS控制旋转方向
// test3.cpp: 定义控制台应用程序的入口点。 // #include "stdafx.h" #define GLUT_DISABLE_ATEXIT_HACK #pragma comment(lib, "Ws2_32.lib") #include <cmath> #include <cstdlib> #include <gl/glut.h> float DEG_TO_RAD = 0.0; //角度转为弧度的参数,即 2*PI/360 float theta = 30.0; //直线与X轴正方向的夹角 float length = 200.0; //直线的长度 float xf=300.0, yf = 200.0; //直线的第一个端点 void init(void) { glClearColor(1.0, 1.0, 1.0, 0.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 640.0, 0.0, 480.0); } void display(void) { glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 1.0, 1.0); glBegin(GL_POLYGON); glVertex2f(xf + (0)*cos(DEG_TO_RAD)- (200)*sin(DEG_TO_RAD), yf +(200)*cos(DEG_TO_RAD) +0*sin(DEG_TO_RAD)); glVertex2f(xf + (200)*cos(DEG_TO_RAD) - (0)*sin(DEG_TO_RAD), yf + (0)*cos(DEG_TO_RAD) + 200 * sin(DEG_TO_RAD)); glVertex2f(xf + (30)*cos(DEG_TO_RAD) + 30*sin(DEG_TO_RAD), yf - 30*cos(DEG_TO_RAD) + 30 * sin(DEG_TO_RAD)); glVertex2f(xf + (0)*cos(DEG_TO_RAD) + (200)*sin(DEG_TO_RAD), yf -(200)*cos(DEG_TO_RAD) + 0 * sin(DEG_TO_RAD)); glVertex2f(xf - 30*cos(DEG_TO_RAD) + (30)*sin(DEG_TO_RAD), yf - (30)*cos(DEG_TO_RAD) -30 * sin(DEG_TO_RAD)); glVertex2f(xf - 200*cos(DEG_TO_RAD) - (0)*sin(DEG_TO_RAD), yf + (0)*cos(DEG_TO_RAD) -200 * sin(DEG_TO_RAD)); glEnd(); glutSwapBuffers(); //交换前后台缓存 } void myKeyboard(unsigned char key, int x, int y) { if (key == 'a' || key == 'A') DEG_TO_RAD += 0.1; if (key == 's' || key == 'S') DEG_TO_RAD -= 0.1; if (key == 'c' || key == 'C') exit(0); if (DEG_TO_RAD>360) DEG_TO_RAD -= 360; if (DEG_TO_RAD<0) DEG_TO_RAD += 360; glutPostRedisplay(); //重新调用绘制函数 } void main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowPosition(100, 100); glutInitWindowSize(680, 680); glutCreateWindow("152210708117 A键左转,S键右转"); init(); glutDisplayFunc(display); glutKeyboardFunc(myKeyboard); // glutIdleFunc(idleFunc); //指定空闲回调函数 glutMainLoop(); }