topical media & game development
basic-visual-03-PolygonTransform.c
? /
basic-visual-03-PolygonTransform.c
// ------------------------------------------------------------------------
// This program is complementary material for the book:
//
// Frank Nielsen
//
// Visual Computing: Geometry, Graphics, and Vision
//
// ISBN: 1-58450-427-7
//
// Charles River Media, Inc.
//
//
// All programs are available at www.charlesriver.com/visualcomputing/
//
// You may use this program for ACADEMIC and PERSONAL purposes ONLY.
//
//
// The use of this program in a commercial product requires EXPLICITLY
// written permission from the author. The author is NOT responsible or
// liable for damage or loss that may be caused by the use of this program.
//
// Copyright (c) 2005. Frank Nielsen. All rights reserved.
// ------------------------------------------------------------------------
// ------------------------------------------------------------------------
// File: PolygonTransform.cpp
//
// Description: 2D polygon transformations
// ------------------------------------------------------------------------
include <stdafx.h>
include <GL/glut.h>
include <math.h>
using namespace std;
static GLfloat face[][2]={ {6,0}, {0,12}, {2,20}, {4,12}, {8,16}, {12,12}, {14,20}, {16,12}, {10,0}, {6,0}} ;
static GLfloat nose[][2]={{7,7}, {8,9}, {9,7}, {7,7}};
static GLfloat lefteye[][2]={{4,10}, {4,11}, {5,11}, {5,10}, {4,10}};
static GLfloat righteye[][2]={{11,10} ,{11,11}, {12,11}, {12,10}, {11,10}};
static GLfloat mouth[][2]={{6,5}, {7,4}, {9,4}, {10,5}};
define INDEX(a,b) ((a)+(b)*4)
GLfloat M[16], MGL[16];
GLfloat minr,maxr;
GLfloat translateX=0.0,translateY=0.0;
GLfloat shear=1.0;
GLfloat angle=3.141592/4.0; // pi/4 approximatively -:)
void display(void)
{int i,j;
glClearColor(1,1,1,0);
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
// World Coordinate System
glLoadIdentity();
glColor3f(1,0,0);
glBegin(GL_LINES);
glVertex2f(minr,0);glVertex2f(maxr,0);
glVertex2f(0,minr);glVertex2f(0,maxr);
glEnd();
glTranslatef(translateX,translateY,0.0);
glMultMatrixf(M);
//glLoadMatrixf(M);
glColor3f(0,0,0);
// Local Coordinate Systems
glBegin(GL_LINE_STRIP);
for(i=0;i<10;i++)
{glVertex2f(face[i][0],face[i][1]);}
glEnd();
glBegin(GL_LINE_STRIP);
for(i=0;i<5;i++)
{glVertex2f(lefteye[i][0],lefteye[i][1]);}
glEnd();
glBegin(GL_LINE_STRIP);
for(i=0;i<5;i++)
{glVertex2f(righteye[i][0],righteye[i][1]);}
glEnd();
glBegin(GL_LINE_STRIP);
for(i=0;i<4;i++)
{glVertex2f(mouth[i][0],mouth[i][1]);}
glEnd();
glBegin(GL_LINE_STRIP);
for(i=0;i<4;i++)
{glVertex2f(nose[i][0],nose[i][1]);}
glEnd();
glGetFloatv(GL_MODELVIEW_MATRIX, MGL);
printf("Model Matrix OpenGL:\n");
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf("\%f ",MGL[INDEX(i,j)]);
printf("\n");}
glutSwapBuffers( );
}
void reshape(int w, int h)
{
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(minr,maxr,minr,maxr,-1,1);
}
void keypress(unsigned char key, int x, int y)
{
int i,j;
printf("Key \%c\n",key);
switch (key)
{
case 'I': case 'i':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
break;
case 'T': case 't':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,3)]=1.0;
M[INDEX(1,3)]=2.0;
break;
case 'R': case 'r':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,0)]=cos(angle); M[INDEX(0,1)]=-sin(angle);
M[INDEX(1,0)]=sin(angle); M[INDEX(1,1)]=cos(angle);
break;
case 'O': case 'o':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,0)]=M[INDEX(1,1)]=-1;
break;
case 'Y': case 'y':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,0)]=-1;
break;
case 'X': case 'x':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(1,1)]=-1;
break;
case 'K':case 'k':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(0,1)]=shear;
break;
case 'L':case 'l':
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
M[INDEX(1,0)]=shear;
break;
}
printf("Model Matrix:\n");
for(i=0;i<4;i++)
{for(j=0;j<4;j++)
printf("\%f ",M[INDEX(i,j)]);
printf("\n");}
display();
}
void move(int key, int x, int y)
{
float step = 0.1;
switch (key) {
case GLUT_KEY_UP:
translateY += step;
break;
case GLUT_KEY_DOWN:
translateY -= step;
break;
case GLUT_KEY_LEFT:
translateX -= step;
break;
case GLUT_KEY_RIGHT:
translateX += step;
break;
}
glutPostRedisplay();
}
void main(void)
{int i,j;
cout<<"Visual Computing: Geometry, Graphics, and Vision (ISBN:1-58450-427-7)"<<endl;
cout<<"Demo program\n\n"<<endl;
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(0,0);
glutInitWindowSize(512, 512);
glutCreateWindow("2D Transformations in OpenGL(R)");
minr=-50; maxr=50;
for(i=0;i<4;i++) for(j=0;j<4;j++) M[4*i+j]=((i==j) ? 1.0 : 0.0);
glutReshapeFunc(reshape);
glutDisplayFunc(display);
glutSpecialFunc(move);
glutKeyboardFunc(keypress);
glutMainLoop( );
}
(C) Æliens
20/2/2008
You may not copy or print any of this material without explicit permission of the author or the publisher.
In case of other copyright issues, contact the author.