miércoles, 25 de abril de 2012

Circulo y Elipse


La ecuación del Círculo
En la mayoría de las gráficas generadas por fórmulas, la formula está dado en la forma
y = f(x)
Tal forma hace muy facil encontrar los puntos en la gráfica. Todo lo que hay que hacer es elegir x, calcular f(x) (= alguna expresión dada que implique a x) y tendremos el valor correspondiente de y.
Sin embargo, cualquier ecuación concerniente a x e y puede ser usada como la propiedad compartida por todos los puntos de la gráfica. La diferencia principal es que en ecuaciones más complicadas, después de elegir la x, encontrar la y correspondiente requiere trabajo extra, ( y algunas veces es más fácil elegir la y y encontrar la x).
 Quizá la gráfica más conocida de este tipo es el círculo de radio R, cuya ecuación es 

x2  +  y2  =   R2
Dibujar un círculo de radio R centrado en el origen O de un sistema de ejes (x,y). Determinado algún punto P en el círculo con los valores especificados de (x,y), dibujar una línea perpendicular desde P hasta el punto A en el eje de las x. Luego

x = OA        y = AP       R = OP

Aquí x y/o y pueden ser negativas, si están hacia la izquierda del eje de las y o por debajo del eje de las x, pero a pesar del signo, x2 e y2 son ambas siempre positivas. Puesto que el triángulo OAP tiene un ángulo de 90°, por el  teorema de Pitágoras, para cualquier elección de P, la relación de abajo siempre contiene:
OA2  +  AP2  =   OP2
También se puede escribir
x2  +  y2  =   R2
La ecuación del círculo es cumplida por cualquier punto localizado en el. Por ejemplo, si la gráfica está definida por la ecuación:
 
  
x2  +  y2  =   25
esta ecuación se cumple por todos los puntos listados abajo: 
 

  x
  5 
  4 
  3 
  0 
  -3 
  -4 
  -5 
  -4 
  -3 
  0 
  3 
  4 
( 5 ) 
  y
  0 
  3 
  4
  5 
  4
  3 
  0 
  -3 
  -4 
  -5 
  -4 
  -3
( 0 ) 

  
 
La Ecuación de una Elipse
La ecuación del círculo aún expresa la misma relación si ambos lados se dividen por R2:
(x2/R2)  +  (y2/R2) =   1
La ecuación de una elipse es esa misma con una pequeña modificación:
 
  
(x2/a2)  +  (y2/b2) =   1
donde (a,b) son dos números dados, por ejemplo (8,4). ¿Cual será la gráfica de esa ecuación? Cerca del eje x y es muy pequeña y la ecuación se acerca casi a 
(x2/a2)  =   1
De donde


x2 = a2 y por lo tanto x = a ó x = -a   (a veces combinado con x = ±a)


La gráfica en esas cercanías se asemeja a la sección de un círculo de radio a, cuya ecuación
(x2/a2)  +  (y2/a2)  =   1
en esta región también está cercana a x2 = a2. De la misma forma  puede observar que cerca del eje de las y, donde x es pequeña, la gráfica corta el eje en y=±b y su figura aparenta la de un círculo de radio b.
  

glutLookAt


glutLookAt

Esta es la función que determina dónde y cómo está dispuesta la cámara. Cuidado que la posición de la cámara no tiene nada que ver con el tipo de proyección que hayamos definido. La proyección se define sólo una vez, típicamente al principio del programa en una función inicializadora, mientras que la cámara se mueve continuamente.

glTranslatef

Produce una traducción de x y z. La matriz actual (ver glMatrixMode) se multiplica por la matriz de traducción, con el producto sustitución de la matriz actual, como si glMultMatrix fueron llamados con la siguiente matriz de su argumento.


lunes, 23 de abril de 2012

El Carro

#include <GL/glut.h>
GLfloat anguloCuboX = 0.0f;
GLfloat anguloCuboY = 0.0f;
GLfloat anguloEsfera = 0.0f;




GLint ancho=600;
GLint alto=400;
 int ang =0 ;
 int movx = 0;
int hazPerspectiva = 0;
void reshape(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    if(hazPerspectiva)
  gluPerspective(60.0f,(GLfloat)width/(GLfloat)height, 1.0f, 20.0f);
              
     else
       glOrtho(-4,4, -4, 4, 1, 10);
       glMatrixMode(GL_MODELVIEW);
    ancho = width;
    alto = height;
}
void Piso(void)
{
    glColor3f(1.0f, 1.0f, 1.0f);
 glScalef(1.5f,0.0f,1.5f);
    glBegin(GL_QUADS);     
    glVertex3f( 10.0f,-10.0f, -10.0f);
    glVertex3f( 10.0f,-10.0f,  10.0f);
    glVertex3f(-10.0f,-10.0f,  10.0f);
    glVertex3f(-10.0f,-10.0f, -10.0f);
    glEnd();
}
void carro(void)
{
    glColor3f(1.0f, 0.0f, 0.0f);


    glBegin(GL_POLYGON);     
    glVertex3f(-1.5f,0.5f, -2.0f);
    glVertex3f( 3.5f,0.5f, -2.0f);
    glVertex3f(3.5f,2.0f,  -2.0f);
    glVertex3f(2.0f,2.0f, -2.0f);
    glVertex3f(1.f,3.0f, -2.0f);
    glVertex3f(-0.5f,3.0f, -2.0f);
    glVertex3f(-1.5f,2.0f, -2.0f);
    glEnd();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0.0f, 0.0f, -5.0f);
    glRotatef(15, 1.0f, 0.0f, 0.0f);
    glRotatef(15, 0.0f, 1.0f, 0.0f);
     Piso();
 

 glLoadIdentity();




  glColor3f(0.0f, 0.0f, 1.0f);
  glTranslatef(movx,0.0,0.0);
  carro();
  glLoadIdentity();
      
  glTranslatef(-.5f,0.5f,-1.0f);
  glColor3f(0.0f, 0.0f, 1.0f);
  glRotatef(ang,1.0,0.0,0.0);
  glTranslatef(movx,0.0,0.0);
  glutSolidSphere(0.5f, 16, 16);
  glLoadIdentity();




  glTranslatef(3.0f,0.5f,-1.0f);
  glColor3f(0.0f, 1.0f, 0.0f);
  glRotatef(ang,1.0,0.0,0.0);
  glTranslatef(movx,0.0,0.0);   
      glutSolidSphere(0.5f, 16, 16);
      glLoadIdentity();
    glFlush();
    glutSwapBuffers();
}
void init()
{
    glClearColor(0,0,0,0);
    glEnable(GL_DEPTH_TEST);
    ancho = 600;
    alto = 900;
}
void idle()
{
    display();
}
void specialkeyevent( int key, int Xx, int Yy )
{   
 switch ( key ) {
  
  case GLUT_KEY_LEFT:
   movx-=1;
   ang-=1;
   display();
   break;
  case GLUT_KEY_RIGHT:
   movx+=1;
   ang-=1;
   display();
   break;  
 }
 glutPostRedisplay();
}
int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(ancho, alto);
    glutCreateWindow("Coche en movimiento");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);
    glutSpecialFunc(specialkeyevent );
    glutMainLoop();
    return 0;
}