132001f49Smrg 232001f49Smrg#include <stdio.h> 332001f49Smrg#include <stdlib.h> 432001f49Smrg#include <math.h> 532001f49Smrg#include "glut_wrap.h" 632001f49Smrg 732001f49Smrgstatic int Win; 832001f49Smrgstatic int WinWidth = 400, WinHeight = 400; 932001f49Smrgstatic GLfloat Xrot = 0, Yrot = 0, Zrot = 0; 1032001f49Smrgstatic GLboolean Anim = GL_FALSE; 1132001f49Smrg 1232001f49Smrgstatic int CurVert = 0, MoveAll = 0; 1332001f49Smrgstatic GLfloat Verts[3][2]; 1432001f49Smrg 1532001f49Smrg 1632001f49Smrgstatic void 1732001f49SmrgIdle(void) 1832001f49Smrg{ 1932001f49Smrg Xrot += 3.0; 2032001f49Smrg Yrot += 4.0; 2132001f49Smrg Zrot += 2.0; 2232001f49Smrg glutPostRedisplay(); 2332001f49Smrg} 2432001f49Smrg 2532001f49Smrg 2632001f49Smrgstatic void 2732001f49SmrgDraw(void) 2832001f49Smrg{ 2932001f49Smrg glClear(GL_COLOR_BUFFER_BIT); 3032001f49Smrg 3132001f49Smrg glBegin(GL_POLYGON); 3232001f49Smrg glVertex2fv(Verts[0]); 3332001f49Smrg glVertex2fv(Verts[1]); 3432001f49Smrg glVertex2fv(Verts[2]); 3532001f49Smrg glEnd(); 3632001f49Smrg 3732001f49Smrg glutSwapBuffers(); 3832001f49Smrg} 3932001f49Smrg 4032001f49Smrg 4132001f49Smrgstatic void 4232001f49SmrgReshape(int width, int height) 4332001f49Smrg{ 4432001f49Smrg WinWidth = width; 4532001f49Smrg WinHeight = height; 4632001f49Smrg glViewport(0, 0, width, height); 4732001f49Smrg glMatrixMode(GL_PROJECTION); 4832001f49Smrg glLoadIdentity(); 4932001f49Smrg glMatrixMode(GL_MODELVIEW); 5032001f49Smrg glLoadIdentity(); 5132001f49Smrg} 5232001f49Smrg 5332001f49Smrg 5432001f49Smrgstatic void 5532001f49SmrgRotVerts(void) 5632001f49Smrg{ 5732001f49Smrg float tx = Verts[0][0], ty = Verts[0][1]; 5832001f49Smrg Verts[0][0] = Verts[1][0]; Verts[0][1] = Verts[1][1]; 5932001f49Smrg Verts[1][0] = Verts[2][0]; Verts[1][1] = Verts[2][1]; 6032001f49Smrg Verts[2][0] = tx; Verts[2][1] = ty; 6132001f49Smrg} 6232001f49Smrg 6332001f49Smrgstatic void 6432001f49SmrgSave(void) 6532001f49Smrg{ 6632001f49Smrg int i; 6732001f49Smrg FILE *f = fopen("verts.txt", "w"); 6832001f49Smrg for (i = 0; i < 3; i++) 6932001f49Smrg fprintf(f, "%f %f\n", Verts[i][0], Verts[i][1]); 7032001f49Smrg fclose(f); 7132001f49Smrg printf("Saved data\n"); 7232001f49Smrg} 7332001f49Smrg 7432001f49Smrgstatic void 7532001f49SmrgRestore(void) 7632001f49Smrg{ 7732001f49Smrg int i; 7832001f49Smrg FILE *f = fopen("verts.txt", "r"); 7932001f49Smrg if (f) { 8032001f49Smrg printf("Restoring data\n"); 8132001f49Smrg for (i = 0; i < 3; i++) { 8232001f49Smrg int n =fscanf(f, "%f %f\n", &Verts[i][0], &Verts[i][1]); 8332001f49Smrg (void) n; 8432001f49Smrg } 8532001f49Smrg fclose(f); 8632001f49Smrg } 8732001f49Smrg} 8832001f49Smrg 8932001f49Smrgstatic void 9032001f49SmrgKey(unsigned char key, int x, int y) 9132001f49Smrg{ 9232001f49Smrg (void) x; 9332001f49Smrg (void) y; 9432001f49Smrg switch (key) { 9532001f49Smrg case 'r': 9632001f49Smrg RotVerts(); 9732001f49Smrg break; 9832001f49Smrg case 'a': 9932001f49Smrg MoveAll = 1; 10032001f49Smrg break; 10132001f49Smrg case '0': 10232001f49Smrg MoveAll = 0; 10332001f49Smrg CurVert = 0; 10432001f49Smrg break; 10532001f49Smrg case '1': 10632001f49Smrg MoveAll = 0; 10732001f49Smrg CurVert = 1; 10832001f49Smrg break; 10932001f49Smrg case '2': 11032001f49Smrg MoveAll = 0; 11132001f49Smrg CurVert = 2; 11232001f49Smrg break; 11332001f49Smrg case 's': 11432001f49Smrg Save(); 11532001f49Smrg break; 11632001f49Smrg case 27: 11732001f49Smrg glutDestroyWindow(Win); 11832001f49Smrg exit(0); 11932001f49Smrg break; 12032001f49Smrg } 12132001f49Smrg glutPostRedisplay(); 12232001f49Smrg} 12332001f49Smrg 12432001f49Smrgstatic void 12532001f49Smrgmove(float dx, float dy) 12632001f49Smrg{ 12732001f49Smrg int i; 12832001f49Smrg 12932001f49Smrg dx *= 0.05; 13032001f49Smrg dy *= 0.05; 13132001f49Smrg if (MoveAll) { 13232001f49Smrg for (i = 0; i < 3; i++) { 13332001f49Smrg Verts[i][0] += dx; 13432001f49Smrg Verts[i][1] += dy; 13532001f49Smrg } 13632001f49Smrg } 13732001f49Smrg else { 13832001f49Smrg Verts[CurVert][0] += dx; 13932001f49Smrg Verts[CurVert][1] += dy; 14032001f49Smrg } 14132001f49Smrg 14232001f49Smrg printf("\n"); 14332001f49Smrg for (i = 0; i < 3; i++) { 14432001f49Smrg printf("%f %f\n", Verts[i][0], Verts[i][1]); 14532001f49Smrg } 14632001f49Smrg} 14732001f49Smrg 14832001f49Smrg 14932001f49Smrgstatic void 15032001f49SmrgSpecialKey(int key, int x, int y) 15132001f49Smrg{ 15232001f49Smrg switch (key) { 15332001f49Smrg case GLUT_KEY_UP: 15432001f49Smrg move(0, +1); 15532001f49Smrg break; 15632001f49Smrg case GLUT_KEY_DOWN: 15732001f49Smrg move(0, -1); 15832001f49Smrg break; 15932001f49Smrg case GLUT_KEY_LEFT: 16032001f49Smrg move(-1, 0); 16132001f49Smrg break; 16232001f49Smrg case GLUT_KEY_RIGHT: 16332001f49Smrg move(1, 0); 16432001f49Smrg break; 16532001f49Smrg } 16632001f49Smrg glutPostRedisplay(); 16732001f49Smrg} 16832001f49Smrg 16932001f49Smrg 17032001f49Smrgstatic void 17132001f49SmrgInit(void) 17232001f49Smrg{ 17332001f49Smrg Verts[0][0] = 0.0; Verts[0][1] = 0.0; 17432001f49Smrg Verts[1][0] = 1.2; Verts[1][1] = -0.5; 17532001f49Smrg Verts[2][0] = 0.6; Verts[2][1] = -1.5; 17632001f49Smrg 17732001f49Smrg Restore(); 17832001f49Smrg 17932001f49Smrg glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); 18032001f49Smrg} 18132001f49Smrg 18232001f49Smrg 18332001f49Smrgint 18432001f49Smrgmain(int argc, char *argv[]) 18532001f49Smrg{ 18632001f49Smrg glutInit(&argc, argv); 18732001f49Smrg glutInitWindowSize(WinWidth, WinHeight); 18832001f49Smrg glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 18932001f49Smrg Win = glutCreateWindow(argv[0]); 19032001f49Smrg glutReshapeFunc(Reshape); 19132001f49Smrg glutKeyboardFunc(Key); 19232001f49Smrg glutSpecialFunc(SpecialKey); 19332001f49Smrg glutDisplayFunc(Draw); 19432001f49Smrg if (Anim) 19532001f49Smrg glutIdleFunc(Idle); 19632001f49Smrg Init(); 19732001f49Smrg glutMainLoop(); 19832001f49Smrg return 0; 19932001f49Smrg} 200