martes, 17 de abril de 2012

Funciones para graficar círculos y elipses


Ecuación Ordinaria de la Circunferencia

Dados las coordenadas del centro de la circunferencia C(h;k) y el radio "r" de la misma, podemos utilizar la siguiente ecuación para determinar el valor de "y" correspondiente a un valor de "x".

Ejemplo:

Hallar la ecuación de la circunferencia cuyo centro es C(2;6) y con radio r = 4

(x - 2)² + (y - 6)² = 4²

Ecuación Canónica de la Circunferencia

Sean ahora las coordenadas del centro de la circunferencia C(0;0) y el radio "r", podemos utilizar la siguiente ecuación para determinar el valor de "y" correspondiente a un valor de "x".

Ejemplo:

Hallar la ecuación de la circunferencia cuyo centro es el origen y con radio r = 3

x ² + y ² = 3²



Forma cartesiana centrada en origen
La ecuación de una elipse en coordenadas cartesianas, con centro en el origen, es:
donde a > 0 y b > 0 son los semiejes de la elipse, donde si a corresponde al eje de las abscisas y b al eje de las ordenadas la elipse es horizontal, si es al revés, entonces es vertical. El origen O es la mitad del segmento [FF']. La distancia entre los focos FF' se llama distancia focal y vale 2c = 2ea, siendo e la excentricidad y a el semieje mayor.
Forma cartesiana centrada fuera del origen
Si el centro de la elipse se encuentra en el punto (h,k), la ecuación es:
Forma polar centrada en origen
En coordenadas polares, con origen en su centro, la ecuación de la elipse es:

Formas polares centradas en un foco



En coordenadas polares, con el origen en uno de sus focos, la ecuación de la elipse es:
REFERENCIAS:

lunes, 16 de abril de 2012

gluLookAt()

La función gluLookAt() en Open gl nos sirve para observar un objeto como si lo viéramos por una cámara que capta las imágenes.
Permite definir de forma específica donde se va a situar la cámara, hacía donde mirará ésta y cuál será el orden de los ejes de coordenadas.

gluLookAt(eyeX, eyeY, eyeZ, atX, atY, atZ, upX, upY, upZ)

Las primeras tres coordenadas es en que punto en el espacio se ubicara la cámara, las siguientes tres coordenadas es hacia que punto mirara la cámara y las ultimas tres es un vector en que tanto estará elevada la cámara para enfocar el punto al que se mira.

glTranslatef y GlutAt() se comportan de la misma manera en cuestion de que el objeto se puede ver como nosotros lo deseemos en un punto especifico la diferencia esta que en glTranslatef el obejto es movido, las coordenadas originales son modificadas, cambia su ubicacion en el espacio, mientras que en GlutAt() el objeto no es movido del espacio sino el angulo o forma en que se visualiza ese objeto por el lente de la "camara", lo que hace que se comporten de manera similar.


Ejecucion de codigo

domingo, 15 de abril de 2012

Carro con movimiento

#include
GLfloat anguloCuboX = 0.0f;
GLfloat anguloCuboY = 0.0f;
GLfloat anguloEsfera = 0.0f;
GLfloat TrasPisox=0.0f;
GLfloat TrasPisoy=0.0f;
GLfloat TrasPisoz=-5.0f;

GLfloat TrasRueda1x=3.0f;
GLfloat TrasRueda1y=0.5f;
GLfloat TrasRueda1z=-1.0f;

GLfloat TrasRueda2x=-0.5f;
GLfloat TrasRueda2y=0.5f;
GLfloat TrasRueda2z=-1.0f;

GLfloat TrasCarrox=0.0f;
GLfloat TrasCarroy=0.0f;
GLfloat TrasCarroz=-5.0f;

GLfloat e;
GLint ancho=400;
GLint alto=400;
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(0.0f, 0.0f, 1.0f);
    glScalef(1.5f,0.0f,1.5f);
    glBegin(GL_QUADS);       //cara abajo
    glVertex3f( 1.0f,-1.0f, -1.0f);
    glVertex3f( 1.0f,-1.0f,  1.0f);
    glVertex3f(-1.0f,-1.0f,  1.0f);
    glVertex3f(-1.0f,-1.0f, -1.0f);
    glEnd();
}
void carro(void)
{
    glColor3f(1.0f, 0.0f, 1.0f);

    glBegin(GL_POLYGON);       //carro
    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(TrasPisox,TrasPisoy,TrasPisoz);
    glRotatef(15, 1.0f, 0.0f, 0.0f);
    glRotatef(15, 0.0f, 1.0f, 0.0f);
    // dibuja piso
    Piso();
 
// dibuja rueda
    glLoadIdentity();
    glTranslatef(TrasRueda1x,TrasRueda1y,TrasRueda1z);
    glColor3f(1.0f, 1.0f, 1.0f);
    glutSolidSphere(0.5f, 16, 16);
 
//dibuja 2da rueda
    glLoadIdentity();
    glTranslatef(TrasRueda2x,TrasRueda2y,TrasRueda2z);
    glColor3f(1.0f, 1.0f, 1.0f);
    glutSolidSphere(0.5f, 16, 16);


    glLoadIdentity();
    glTranslatef(TrasCarrox,TrasCarroy,TrasCarroz);
    glColor3f(1.0f, 1.0f, 1.0f);
    carro();
    glFlush();
    glutSwapBuffers();
}
void init()
{
    glClearColor(0,0,0,0);
    glEnable(GL_DEPTH_TEST);
    ancho = 400;
    alto = 400;
}
void idle()
{
    display();
}


void keyboard(unsigned char key, int x, int y)
{
    switch(key)
    {
    case 'p':
    case 'P':
 hazPerspectiva=1;
 reshape(ancho,alto);
 break;
    case 'o':
    case 'O':
 hazPerspectiva=0;
 reshape(ancho,alto);
 break;
    case 'i':
    case 'I':

   TrasRueda1x-=.10;
   TrasRueda2x-=.10;
   TrasCarrox-=.10;

 break;

case 'd':
    case 'D':
    TrasRueda1x+=.10;
TrasRueda2x+=.10;
    TrasCarrox+=.10;

      break;
    }
}



int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(ancho, alto);
    glutCreateWindow("Carrito");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}




Piso y esfera

#include

GLfloat anguloCuboX = 0.0f;
GLfloat anguloCuboY = 0.0f;
GLfloat anguloEsfera = 0.0f;
GLfloat TrasEsferax= 3.0f;
GLfloat TrasEsferay= 0.0f;
GLfloat TrasEsferaz= -5.0f;

GLint ancho=400;
GLint alto=400;

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(-6,6, -6, 6, 2, 12);
    glMatrixMode(GL_MODELVIEW);

    ancho = width;
    alto = height;
}

void drawCube(void)
{
    glColor3f(0.0f, 1.0f, 1.0f);
    glBegin(GL_QUADS);       //piso
    glVertex3f( 1.0f,-1.0f, -1.0f);
    glVertex3f( 1.0f,-1.0f,  1.0f);
    glVertex3f(-1.0f,-1.0f,  1.0f);
    glVertex3f(-1.0f,-1.0f, -1.0f);
    glEnd();
}
void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();

    glTranslatef(0.0f, 0.0f, -5.0f);

   glRotatef(5, 1.0f, 0.0f, 0.0f);
   glRotatef(5, 0.0f, 1.0f, 0.0f);
    drawCube();
    glLoadIdentity();
    glTranslatef(TrasEsferax,TrasEsferay,TrasEsferaz);

    glColor3f(1.0f, 1.0f, 0.0f);
    glutWireSphere(0.3f, 6, 6);
    glFlush();
    glutSwapBuffers();

}
void init()
{
    glClearColor(0,0,0,0);
    glEnable(GL_DEPTH_TEST);
    ancho = 400;
    alto = 400;
}

void idle()
{
    display();
}

void keyboard(unsigned char key, int x, int y)
{
    switch(key)
    {
    case 'p':
    case 'P':
 hazPerspectiva=1;
 reshape(ancho,alto);
 break;

    case 'o':
    case 'O':
 hazPerspectiva=0;
 reshape(ancho,alto);
 break;
 case 'i':
    case 'I':
    TrasEsferax-=1.0;
  break;
 case 'D':
    case 'd':
    TrasEsferax+=1.0;
  break;
 case 'A':
    case 'a':
    TrasEsferay+=1.0;
  break;
 case 'B':
    case 'b':
    TrasEsferay-=1.0;
  break;
 case 'c':
    case 'C':
    TrasEsferaz+=0.5;
  break;
 
 case 'l':
    case 'L':
    TrasEsferaz-=0.5;
  break;

    }
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(ancho, alto);
    glutCreateWindow("Piso_pelota");
    init();
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    glutIdleFunc(idle);
    glutKeyboardFunc(keyboard);
    glutMainLoop();
    return 0;
}