triangulo_1.c



#include <stdio.h>
#include <GL/glut.h>
#include <unistd.h>

float Ang_rot, Px, Py, Pz, IncX, IncY, IncZ, Time;	// (Px, Py, Pz)PosiciOn	(IncX, IncY, IncZ)Incremento	(Time)Retardo
int X, Y, Z, Rotar, Inicio;					// Eje en turno (1)Activo (0)Inactivo

void PintaEjes()
{
	glBegin(GL_LINES);
		glColor3f(1,0,0); glVertex3f(-5, 0, 0); glVertex3f(5, 0, 0);	// X
		glColor3f(0,1,0); glVertex3f(0, -5, 0); glVertex3f(0, 5, 0);	// Y
		glColor3f(0,0,1); glVertex3f(0, 0, -5); glVertex3f(0, 0, 5);	// Z
	glEnd();
	glPushMatrix();
	glColor3f(1,0,0); glTranslatef(5.0f, 0.0f, 0.0f); glutWireSphere(0.20, 20, 20);
	glPopMatrix(); glPushMatrix();
	glColor3f(0,1,0); glTranslatef(0.0f, 5.0f, 0.0f); glutWireSphere(0.20, 20, 20);
	glPopMatrix(); glPushMatrix();
	glColor3f(0,0,1); glTranslatef(0.0f, 0.0f, 5.0f); glutWireSphere(0.20, 20, 20);
	glPopMatrix();
}

void Gradua  ( )
{
	int k=0, x1,y1,x2,y2;

	glBegin(GL_LINES);
		glColor3f(1,0,0); for(k=1; k<10; k++) { glVertex3f(-5+k, 0.2, 0); glVertex3f(-5+k, -0.2, 0); }
		glColor3f(0,1,0); for(k=1; k<10; k++) { glVertex3f(0.2, -5+k, 0); glVertex3f(-0.2, -5+k, 0); }
		glColor3f(0,1,0); for(k=1; k<10; k++) { glVertex3f(0.2, 0, -5+k); glVertex3f(-0.2, 0, -5+k); }
	glEnd();
}

int Inicializa()
{
	glClearColor(0.0,0.0,0.0,0.0); glClear(GL_COLOR_BUFFER_BIT);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	glOrtho(-8.0,8.0, -8.0,8.0, -7.0,7.0);
	Inicio = 1; Px = Py = Pz = 0; IncX = IncY = IncZ = 0; Time = (float)800000;
	Rotar = Ang_rot = X = Y = Z = 0;
	glMatrixMode(GL_MODELVIEW);
	gluLookAt(-1,-1,1,  2,2,-1,  0,0,1);
	return 1;
}

void Reset( )
{
	Px = Py = Pz = 0;
	IncX = IncY = IncZ = 0;
	X = Y = Z = 0;
}


void Dibuja(void)
{
	glClear(GL_COLOR_BUFFER_BIT);
	PintaEjes( ); Gradua( );


	//glRotatef(45, 0.0f, 1.0f, 0.0f);
	

	if ( Rotar )
	{
		glPushMatrix();
		glRotatef(Ang_rot, 0.0f, 0.0f, 1.0f);
		printf("ROTAR= %d\tANGULO= %f\n", Rotar, Ang_rot);
	}
	glBegin(GL_TRIANGLES);
		glColor3f(1.0f, 1.0f, 0.0f);	 glVertex3f(Px, 0.0f, 0.0f);
		glVertex3f(Px+0.3f, Py, Pz+0.5f); glVertex3f(Px-0.3f, Py, Pz+0.5f);
	glEnd();
	glFlush();
	if ( Rotar && !Inicio )
	{
		Ang_rot += 15; glPopMatrix();
		if (Ang_rot > 360) { Rotar=0; Ang_rot=0; }
	}
	else
	{
		Px += IncX; Py += IncY; Pz += IncZ;
		if ( X && Px == 5 ) IncX = -1;	if ( X && Px == -5 ) IncX = 1;	if ( X && Px == 0 ) Reset();
		if ( Y && Py == 5 ) IncY = -1;	if ( Y && Py == -5 ) IncY = 1;	if ( Y && Py == 0 ) Reset();
		if ( Z && Pz == 5 ) IncZ = -1;	if ( Z && Pz == -5 ) IncZ = 1;	if ( Z && Pz == 0 ) Reset();
		if ( !Px && !Py && !Pz && !Inicio) Rotar = 1;
		printf("ROTAR= %d\t Px=%f\t Py=%f\n", Rotar, Px, Py);
	}
}

void Tiempo(void)
{
	// sleep( Time );		// SEGUNDOS
	usleep( Time );			// MICRO SEGUNDOS
	glutPostRedisplay();
}

void TeclasFuncion(int Tecla, int x, int y)
{
	switch (Tecla)
	{
		case GLUT_KEY_UP:    { Reset(); Y = 1; IncY =  1; break; }
		case GLUT_KEY_DOWN:  { Reset(); Y = 1; IncY = -1; break; }
		case GLUT_KEY_RIGHT: { Reset(); X = 1; IncX =  1; break; }
		case GLUT_KEY_LEFT:  { Reset(); X = 1; IncX = -1; break; }

	}
	glutPostRedisplay();
}

static void Tecla(unsigned char key, int x, int y)
{
	switch (key)
	{
		case 27: exit(0); break;
	}
	glutPostRedisplay();
}

static void Raton(int Boton, int Estado, int x, int y)
{
	switch ( Boton )
	{
		case GLUT_RIGHT_BUTTON:	{ Reset(); X = 1; IncX = 1; break; }
		case GLUT_LEFT_BUTTON:	{ Reset(); Z = 1; IncZ = 1; break; }
		
	}
	if (Inicio) Inicio = 0;
	glutPostRedisplay();
}

int main(int argc, char ** argv)
{
	glutInit(&argc, argv);
	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
	glutInitWindowPosition(700,100);
	glutInitWindowSize(650,650);
	glutCreateWindow("USO DE LA CAMARA ... ");
	Inicializa();
	glutDisplayFunc(Dibuja);
	glutIdleFunc(Tiempo);		// MIENTRAS HAGAS NADA
	glutSpecialFunc(TeclasFuncion);	// DETECTA LAS TECLAS DE FUNCION
	glutKeyboardFunc(Tecla);	// DETECTA EL TECLADO
	glutMouseFunc(Raton);		// DETECTA AL RATON
	glutMainLoop();
}