Programación Orientada a Objetos.doc

download Programación Orientada a Objetos.doc

of 25

Transcript of Programación Orientada a Objetos.doc

  • 7/23/2019 Programacin Orientada a Objetos.doc

    1/25

    1. Anlisis y Diseo Orientado a Objetos

    1.1. Elementos del Modelo de Objetos

    Fundamentales

    Abstraccin

    Denota las caractersticas esenciales de un objeto que lo

    distinguen de los dems, y establece asbarreras

    conceptuales bien definidas respecto de la perspectiva del

    observador.

    Contrato : establece las suposiciones que realiza objeto

    cliente respecto al servidor, abarcando las

    responsabilidades del servidor. Firma : cada una de las operaciones que ayudan al

    contrato tiene una firma nica que abarca todos los

    parmetros formales y tipo que retornan.

    Protocolo : conjunto de operaciones que puede realizar

    un cliente sobre objeto, incluye formas de llamada y

    ordenes que admite.

    Tipos de Abstraccin

    De entidades : objeto es modelo til en dominio desolucin del problema.

    De acciones : objeto proporciona conjunto general de

    operaciones, que realizan funciones del mismo tipo.

    De mquinas virtuales : objeto que agrupa operaciones,

    virtuales todas usadas por un nivel superior, o que

    utilizan operaciones de un nivel inferior.

    De coincidencia : objeto que almacena operaciones que

    no tienen relacin entre s.

    Encapsulamiento

    Es el proceso de almacenar en un mismo compartimiento

    elementos de una abstraccin, que constituye su

    comportamiento y estructura.

    Oculta los detalles de la implementacin de un objeto.

    Modularidad

    Es el acto de fragmentar un programa en componentes

    individuales para reducir su complejidad.Crear fronteras definidas y documentadas dentro del

    1

  • 7/23/2019 Programacin Orientada a Objetos.doc

    2/25

    programa, pues son claves para entender el problema.

    Jerarqua

    Son una clasificacin u ordenacin de abstracciones.

    Las dos jerarquas mas importantes de un sistema son:

    Estructura de Clases: Jerarqua de clases. Herencia.

    Estructura de Objetos: Jerarqua de partes. Agregacin.

    Una subclase puede heredar la estructura y comportamiento de

    su superclase.

    Secundarios

    Tipos (tipificacin)

    Son las puestas en vigor de la clase de objetos, de modo que

    los objetos de tipos distintos no pueden intercambiarse o, si

    pueden hacerlo, solo lo harn en formas restringidas.

    La comprobacin de tipos impide que se mezclen

    abstracciones.

    Concurrencia

    La concurrencia es la propiedad que distingue un objeto activo

    de uno que no est activo.

    Permite a diferentes objetos actuar al mismo tiempo.

    Persistencia

    Capacidad de un objeto por la que su existencia trasciende en

    el tiempo, es decir, que contina existiendo despus de que

    su creador deja de existir, y/o el espacio, es decir, la posicin

    del objeto vara respecto al espacio de direcciones en el que

    fue creado.

    La persistencia conserva el estado de un objeto en el tiempo y

    en el espacio.

    2

  • 7/23/2019 Programacin Orientada a Objetos.doc

    3/25

    2. Sobrecarga de Operadores

    2.1. Qu es la sobrecarga de operadores?

    Es solo otra forma de hacer una llamada a una funcin, una notacin mas

    clara para tipos de datos definidos por el programador.

    Permite expresiones claras para nuevos tipos de datos creados por el

    usuario.

    2.2. Cmo se sobrecargan los operadores?

    Los operadores se sobrecargan escribiendo una definicin de funcin (con

    encabezado y cuerpo) como lo hara normalmente, excepto que el nombrede la funcin ahora ser la palabra reservada operator seguido por el

    smbolo del operador que se va a sobrecargar. Por ejemplo, el nombre de la

    funcin operator+ se utilizara para sobrecargar el operador suma (+).

    2.3. Cules son los operadores que no pueden sobrecargarse?

    Los operadores que NO pueden sobrecargarse son:

    . .* :: ?:

    2.4. Cules son los operadores (sobre clases) que no necesitan

    sobrecargarse explcitamente?

    Los operadores que no necesitan sobrecargarse explcitamente son dos. El

    operador de asignacin (=) puede utilizarse con cada clase sin

    sobrecarga explicita. El comportamiento predeterminado del operador de

    asignacin es una asignacin de miembrosde los datos miembro de la

    clase. Adems, el operador de direccin (&) puede utilizarse con objetos

    de cualquier clase sin sobrecarga; simplemente devuelve le direccin del

    objeto en memoria.

    2.5. Para que tipos de clases es recomendable la sobrecarga?

    La sobrecarga es especialmente apropiada para las clases matemticas.

    Requieren la sobrecarga de un conjunto importante de operadores, en

    general, para mantener la consistencia de la manipulacin de dichas clases

    en la realidad.

    2.6. Restricciones en sobrecarga de operadores

    3

  • 7/23/2019 Programacin Orientada a Objetos.doc

    4/25

    Laprecedencia de un operador no se puede modificar mediante la

    sobrecarga. Sin embargo, se puede utilizar parntesis para forzar el

    orden de evaluacin.

    La asociatividad(es decir, si el operador se aplica de derecha a

    izquierda, o de izquierda a derecha) no se puede modificar mediante

    la sobrecarga.

    No es posible modificar numero de operandos de un operador:

    los unarios permanecen unarios sobrecargados, y los binarios

    permanecen como binarios sobrecargados. El nico operador ternario

    (?:) no puede sobrecargarse.

    No es posible crear nuevos operadores; solo se pueden

    sobrecargar los existentes.

    No es posible modificar la manera en que un operador

    funciona con objetos predefinidos. Solo funciona la sobrecarga en

    este caso, con objetos de tipos definidos por el usuario, o con una

    mezcla de objeto de tipo definido por el usuario y objeto de tipo

    integrado.

    2.7. Formas de sobrecargar operadores

    A travs de mtodos miembro.

    A travs de mtodos NO miembro con funciones amigas.

    A travs de mtodos NO miembro con funciones NO amigas

    (globales).

    Casos de Sobrecarga

    4

  • 7/23/2019 Programacin Orientada a Objetos.doc

    5/25

    3. Plantillas (Templates)

    3.1. Plantillas

    3.1.1. Qu son?

    Los templates son funciones o clases definidas para tipos no especificados.

    3.1.2. Para que sirven?

    Al utilizarlo se pasa el tipo como un argumento ya sea explcita o

    implcitamente. Adems, al ser componentes del lenguaje proveen control

    total de tipos y de mbito.

    3.2. Funciones plantillas

    3.2.1. Qu son y para que sirven?

    Proveen un comportamiento que puede ser invocado con distintos tipos.

    Tiene una representacin similar a una funcin. Se utilizan generalmente

    para realizar operaciones similares sobre distintos tipos de datos.

    3.2.2. Cules son los prototipos?

    template void NombreFuncion (T& ref)

    {/* declaracin de funcin genrica */};

    3.2.3. Cmo se llama (invoca) a la funcin plantilla?

    Se la invoca como cualquier otra funcin, pasndole los parmetros

    correspondientes para que realice las instrucciones declaradas en su

    cuerpo.

    3.3. Clases plantillas

    3.3.1. Qu son y para que sirven?

    5

  • 7/23/2019 Programacin Orientada a Objetos.doc

    6/25

    Las plantillas de clases fomentan la reutilizacin de cdigo al permitir la

    creacin de instancias de versiones de las clases genricas para tipos

    especficos. Tambin se conocen como tipos parametrizados, ya que

    requieren de uno o ms parmetros de tipo para especificar la manera de

    personalizar una plantilla de clase genrica para formar una

    especializacin de plantilla de clase.

    3.3.2. Cul es el prototipo?

    Ejemplo

    template class Minimax

    { public:T min(T a, T b);

    T max(T a, T b);

    };

    template T Minimax::min(T a, T b)

    {return (ab)?a:b; };

    3.3.3. Cmo se especializa una clase plantilla para un tipo determinado?

    El programador que desea producir una variedad de especializaciones de

    plantilla de clase escribe solo una definicin de plantilla de clase. Para cada

    especializacin de plantilla de clase adicional, utiliza una notacin simple y

    concisa, el compilador escribe el cdigo fuente para dicha especializacin

    que requiere el programador.

    3.4. A que se denomina programacin genrica? Por qu decimos que es

    un paradigma ms novedoso y amplio que el de la programacin orientadaa objetos?

    Es un paradigma de programacin centrado en los algoritmos ms en los

    datos, parametrizados al mximo y expresados de la forma ms

    independiente posible, permitiendo que sirvan para la mayora de tipos y

    estructuras de datos.

    3.5. En C++ este proceso se realiza en tiempo de compilacin o en tiempo

    de ejecucin?

    6

  • 7/23/2019 Programacin Orientada a Objetos.doc

    7/25

    La instanciacin de una plantilla en C++ se realiza en tiempo de

    compilacin, cuando el compilador escribe el cdigo fuente que requiere el

    programador para la misma.

    7

  • 7/23/2019 Programacin Orientada a Objetos.doc

    8/25

    4. Contenedoras (STL)

    4.1. Qu es la STL?

    La STL (del ingls Standard Template Library) es una biblioteca de clases y

    funciones templates creada para estandarizar y optimizar la utilizacin de

    algoritmos y estructuras de datos en el desarrollo de software en C++.

    4.2. Cules son sus elementos fundamentales?

    La STL posee tres componentes fundamentales: contenedores,

    iteradoresy algoritmos.

    4.3. Qu criterios se deben tener en cuenta para elegir el contenedor

    adecuado?

    Para cualquier aplicacin especfica podran ser apropiados varios

    contenedores distintos de la STL. Se debe seleccionar el contenedor mas

    apropiado que logre el mejor rendimiento, es decir, un balance entre

    velocidad y tamao, para dicha aplicacin.

    4.4. Descripcin breve de cada contenedor y lista de comandos comunes

    Los contenedores se dividen en tres categoras principales: contenedores de

    secuencia, contenedores asociativos y adaptadores de contenedores.

    Contenedores de secuencia: representan estructuras de datos

    lineales como vectores y listas enlazadas.

    vector: inserciones y eliminaciones al final, acceso

    directo.

    deque: inserciones y eliminaciones al final, accesodirecto.

    list: lista doblemente enlazada, insercin y eliminacin

    en cualquier parte.

    Contenedores asociativos: son contenedores lineales que por lo

    general pueden localizar elementos almacenados en ellos

    rpidamente. Pueden almacenar conjunto de valores o pares

    clave/valor.

    8

  • 7/23/2019 Programacin Orientada a Objetos.doc

    9/25

    set: bsqueda rpida, no se permiten duplicados.

    multiset: bsqueda rpida, se permiten duplicados.

    map: mapeo uno a uno, no se permiten duplicados,

    bsqueda rpida basada en claves.

    multimap: mapeo uno a uno, se permiten duplicados,

    bsqueda rpida basada en claves.

    Adaptadores de contenedores: implementa las pilas y colas que

    permiten a un programa ver a un contenedor secuencial en una

    manera restringida.

    stack: ultimo en entrar, primero en salir (LIFO).

    queue: primero en entrar, primero en salir (FIFO).

    priority_queue: el elemento de mayor prioridad siempre

    es el primero en salir.

    9

  • 7/23/2019 Programacin Orientada a Objetos.doc

    10/25

    5. Polimorfismo

    Un objeto de la superclase puede ser instanciado como cualquiera de susclases descendientes

    Es esta tal vez, la mejor forma de definir el polimorfismo, como una tcnica

    de programacin que nos permite programar en forma general, en vez de

    programar en forma especfica.

    Para aplicar esta tcnica, debemos tener en cuenta un mecanismo muy

    importante tal como la herencia.

    La herencia es una forma de reutilizacin de software para crear clases que

    asimilan los atributos y mtodos de una clase existente, redeclarandolospara que realice nuevas y distintas actividades.

    Adems, el polimorfismo, funciona mediante los manejadores de

    apuntadores a clases base y manejadores a referencias a clases bases, pero

    con manejadores de nombres.

    El encadenamiento tardo, quiere decir que los miembros que sern

    llamados en una instancia se definen en tiempo de ejecucin.

    Una forma de indicar que miembros de una clase pueden ser encadenados

    tardamente, se realiza a travs de los miembros virtuales.

    En la declaracin de clases base, no debemos olvidar que los atributos y

    mtodos que vayan a ser redefinidos en las clases derivadas deben ser

    declarados como virtuales.

    Declarar una funcin virtual, es decirle al compilador que dicha funcin ser

    modificada o redefinida completamente en sus clases derivadas. Al declarar

    como virtual un mtodo de una clase, automticamente quedara definido

    como virtual para todas sus clases derivadas.

    Para definir un mtodo como virtual, lo que hacemos es anteponer en la

    misma lnea, la palabra reservada virtual, de esta manera decimos que

    dicho mtodo esta incluido en la clase derivada y a su vez ser redefinida,

    ya sea parcial o totalmente.

    Algo muy importante a tener en cuenta para utilizar polimorfismo, es que

    los contructores de clases NO pueden ser declarados como virtuales,

    mientras que los destructores pueden y deben ser virtuales.

    El instanciamiento de clases derivadas a travs de clases base se realiza de

    la sgte manera:

    10

  • 7/23/2019 Programacin Orientada a Objetos.doc

    11/25

    Madre *puntero;

    puntero = new Hija;

    puntero->MetodoVirtualClaseHija();

    delete puntero;

    Esta tcnica, se denomina upcasting.Como vemos, los operadores que aqu aparecen, new y delete, son

    manejadores de apuntadores, claves en la implementacin del

    polimorfismo.

    Estos operadores son usados para controlar la asignacin y liberacin de

    memoria en un programa, para cualquier tipo de dato predefinido o definido

    por el usuario, en lo que se denomina administracin de memoria

    dinmica.

    Por otra parte, tambin tenemos la posibilidad de crear miembros de una

    clase madre como virtuales puros, esto es aplicndoles una condicinextra:

    virtual void NombreFuncion () = 0;

    Dicha igualacin a 0, quiere decir que esta funcin de clase madre, debe ser

    si o si redefinida completamente en las clases derivadas.

    Las clases abstractas, son aquellas que poseen al menos uno de sus

    miembros virtual puro, y no pueden instanciarse, tampoco tendra sentido

    hacerlo. Por otra parte, cuando posee todos los mtodos virtuales puros, se

    la denomina clase abstracta genuina.

    Otro aspecto muy importante a tener en cuenta, solo por conocimiento

    teorico de cmo se realizan las llamadas a funciones hijas a travs de

    madres, es la tabla de mtodos virtuales.

    Esta TMV, se genera cuando C++ compila crendola para cada clase, a

    partir de las funciones virtuales que posee cada una de ellas.

    Por otra parte, la TMV se utiliza para seleccionar la implementacin de la

    funcin apropiada cada vez que se llama a una funcin virtual de esa clase.

    Debemos notar la existencia de distintos niveles de apuntadores. Primer nivel, los apuntadores a las funciones en la TMV, que apuntan

    a las funciones reales que se ejecutan cuando se invoca a una funcin

    virtual.

    Segundo nivel, en cambio, cada vez que se crea una instancia del

    objeto de una clase con funciones virtual, el compilador adjunta al

    objeto un apuntador a la TMV de esa clase.

    Finalmente, podemos hacer mencin a la utilizacin simultnea de

    polimorfismo y la STL.

    Para que nos puede servir esto? Pues la respuesta es muy sencilla,conociendo el upcasting, y con el uso de la STL podemos crear listas

    11

  • 7/23/2019 Programacin Orientada a Objetos.doc

    12/25

    dinmicas de punteros a clases madres, de manera tal de ahorrar cdigo y

    ampliar la extensibilidad de los programas. Por ejemplo:

    vector Contenedor;

    12

  • 7/23/2019 Programacin Orientada a Objetos.doc

    13/25

    6. Recursividad

    Una funcin que se llama a s misma, se dice que es recursiva. Laresursividad en las funciones puede darse de dos formas:

    Directa: la funcin se llama a s misma directamente.

    Indirecta: la funcin llama a otra funcin, que a su vez llama a

    la primera.

    Se dice que un procedimiento es recursivo si en parte esta formado por si

    mismo o se define en funcion de s mismo.

    6.1. Propiedades

    Se reserva espacio para almacenar el nuevo conjunto completo de las

    nuevas variables. Hay variables con valores presentes y pendientes.

    La profundidad de la recursin debe ser finita, y adems pequea.

    Siempre debe poseer una condicin de salida, por la cual el ciclo recursivo

    finalice.

    6.2. Tipos de Recursividad

    6.2.1. Divide y Vencers

    El esquema divide y vencers es una tcnica para resolver problemas que

    consiste en dividir el problema original en subproblemas (de menor

    tamao), resolver los subproblemas y finalmente combinar las soluciones

    para dar una solucin al problema principal.

    En cada nivel del procedimiento este paradigma consta de los siguientes

    tres pasos:

    Dividir el problema en subproblemas. Resolver cada uno de los subproblemas.

    Combinar soluciones de subproblemas para obtener la solucin

    del problema original.

    Para que esta tcnica funcione deben cumplirse los dos requisitos

    siguientes:

    Primero, los subproblemas deben ser ms simples y sencillos

    que el problema original.

    Segundo, despus de un nmero finito de subdivisiones debeencontrarse un subproblema que pueda resolverse de manera

    13

  • 7/23/2019 Programacin Orientada a Objetos.doc

    14/25

    directa.

    14

  • 7/23/2019 Programacin Orientada a Objetos.doc

    15/25

    6.2.2. Bsqueda Exhaustiva

    A veces parece que no hay mejor manera de resolver un problema que

    tratando todas las posibles soluciones. Casi siempre es lenta, pero a veceses lo nico que se puede hacer.

    Tambin es til plantear un problema con esa tcnica y a partir de ah

    encontrar una mejor solucin.

    Otro uso prctico es resolver un problema con un tamao de datos de

    entrada lo suficientemente pequeo.

    La mayora de estos problemas pueden ser reducidos a generar objetos de

    combinatoria, como cadenas de caracteres, permutaciones y subconjuntos.

    6.2.3. Algoritmos de rastro inverso

    Encontrar solucin a problemas sin seguir una regla especfica de clculo,

    sino por ensayo y error.

    Descomposicin al tanteo:

    Tareas parciales que se pueden expresar recursivamente. Se explora un

    nmero finito de subtareas:

    Hay incongruencias? -> Rastreo inverso.

    Suprime solucin mas reciente.

    Ensayo de una nueva posibilidad.

    Es til donde hay muchas posibilidades iniciales, pero quedan pocas tras

    aplicar reglas posteriores.

    15

  • 7/23/2019 Programacin Orientada a Objetos.doc

    16/25

    7. Graficacin, OpenGL

    OpenGL contiene comandos para dibujo, no posee comandos para abrirventanas, ni para leer eventos de teclado y/o mouse.

    Para ello se usa a GLUT, cuyas instrucciones comienzan con el prefijo glut.

    En OpenGL, las instrucciones se escriben con minsculas (gl) y las

    constantes son con maysculas (GL).

    7.1. Ventanas

    7.1.1. Iniciar Ventana

    Para inicializar una ventana en OpenGL, se requiere de 5 rutinas bsicas:

    glutInit (int *argc, chat **argv) //inicializa GLUT, debe ser

    llamada antes que cualquier rutina.

    glutInitDisplayMode (unsigned int mode)//se especifica

    modelo RGB o ndices, buffer sencillo o doble.

    glutInitWindowPosition (int x, int y)//ubicacin de esquina

    superior izquierda de nuestra ventana en la pantalla.

    glutInitWindowSize (int x, int y)//tamao en pixeles de

    nuestra ventana.

    glutCreateWindow (char *string)//crea la ventana con uncontexto OpenGL.

    La pantalla se despliega cuando es llamada la funcin glutMainLoop().

    7.1.2. Limpiar Pantalla

    Se utiliza la instruccin:

    glClearColor (red,green,blue,alpha); //configura color de fondo para

    limpieza, en modo RGBA.

    Para el negro por ejemplo se utiliza el comando: glClearColor

    (0.0,0.0,0.0,0.0);

    La instruccin glClear (mask); limpia el buffer. Por ejemplo: glClear

    (GL_COLOR_BUFFER_BIT);

    7.1.3. Completar Dibujo

    Para ellos se usan las siguientes instrucciones:

    16

  • 7/23/2019 Programacin Orientada a Objetos.doc

    17/25

    glFlush (); //llama a ejecucin a los comandos OpenGL, sin

    garantizar que se completen en tiempo finito.

    glFinish (); //fuerza que TODOS los comandos OpenGL se terminen

    de ejecutar; no contina hasta que todos estn terminados.

    7.2. Sistema de Coordenadas

    7.2.1. Cambio de Tamao

    Cuando se inicializa, se mueve o se cambia de ubicacin una ventana, el

    sistema de ventana genera un evento avisando el cambio.

    Si se esta utilizando la librera GLUT esta notificacin es automtica, solo

    hay que registrar la funcin callback:

    glutReshapeFunc (mi_redibujar);

    La funcin de callbackrecibe el alto y ancho de la nueva ventana.

    La funcin glViewPort() ajusta el rectngulo de dibujo para que utilice toda

    la ventana.

    La funcin gluOrtho2D() pone el origen (0,0) en la esquina izquierda

    inferior y (w,h) como la esquina derecha superior.

    7.3. Primitivas OpenGL

    Son usadas para realizar los dibujos que se desean realizar. Las primitivasson: puntos, lneas y polgonos.

    Estas primitivas se describen por sus vrtices: coordenadas que definen

    punto, extremos de segmentos de lnea y esquinas de polgonos.

    Puntos: nmeros de punto flotante llamados vertex. Todos los

    clculos se realizan con vectores tridimensionales, si no se

    define z, se asume su valor 0.

    Lneas: son en realidad segmentos de recta, y no como una

    extensin al infinito como en matemticas. Vrtices definen

    puntos extremos de cada segmento. Si se definen lneas

    conectadas se utiliza nicamente el punto de finalizacin de

    cada lnea.

    Rectngulos: OpenGL provee una primitiva para dibujar

    directamente un rectngulo relleno:

    void glRect {s,i,f,d} (x1,y1,x2,y2);

    Polgonos: reas encerradas por lazo cerrado de segmentos de

    recta, con vrtices indicando extremos de segmentos que lo

    forman. Los polgonos se dibujan rellenos por defecto.

    17

  • 7/23/2019 Programacin Orientada a Objetos.doc

    18/25

    Hay funciones avanzadas para crear polgonos huecos,

    colores distintos para distintas caras, etc. Poseen restricciones:

    Los bordes no pueden intersectarse.

    Solo polgonos convexos, es decir, si dados dos

    puntos internos, el segmento que los une esta

    tambin en el interior.

    7.3.1. Implementacin de Primitivas

    Vrtices

    Para los vrtices se utiliza el siguiente comando:

    glVertex {2,3,4} {sifd} [v] (coordenadas);

    Esta instruccin, se utiliza siempre entre glBegin() glEnd().

    Parmetros de glBegin()

    Los parmetros de glBegin() son los siguientes:

    Tamao de un Punto

    18

  • 7/23/2019 Programacin Orientada a Objetos.doc

    19/25

    El tamao de un punto se modifica con:

    void glPointSize (GLfloat size); //el argumento tiene que ser

    >0.0 y como defecto es igual a 1.0.

    Modificar Lneas

    El ancho de la lnea se puede cambiar con:

    void glLineWidth (GLfloat size);

    Para cambiar la trama:

    glLineStipple (1, 0x3f07);

    glEnable (GL_LINE_STIPPLE);

    7.3.2. Primitivas: Patrones de Relleno

    El patrn es una serie de 16 ceros y unos:

    1 => hay que dibujar un punto.

    0 => no hay que dibujar un punto.

    El patrn puede ser escalado utilizando un factor de escala entre 1 y 255

    Cada subserie de unos y ceros se repite segn el factor de

    escala.

    Patrones de Lnea

    Convertimos los pixels a dibujar en 1 y los dems en 0.

    Por ejemplo para realizar la siguiente trama:

    En binario sera:

    1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1

    Convertimos este binario en hexadecimal y nos queda glLineStipple (1,

    0xE7E7);

    Patrones de Relleno de Polgonos

    19

  • 7/23/2019 Programacin Orientada a Objetos.doc

    20/25

    Los polgonos pueden rellenarse con un patrn de 32x32 bits:

    glPolygonStipple (const GLubyte *mask);

    Y para activarlo, hacemos:

    glEnable (GL_POLYGON_STIPPLE);

    7.4. Analoga de la cmara

    Viewing : apuntar a lo que se desea fotografiar.

    Modeling : ajustar la escena en la composicin.

    Projection : se elije el lente y se ajusta el zoom.

    Viewport : se determina el tamao final de la impresin de la

    foto.

    7.5. Transformaciones de Vrtices en OpenGL

    Transformacin de Vista: se logra con la instruccin:

    void gluLookAt(GLdouble eyex, GLdouble eyey, GLdoubleeyez, GLdouble centerx, GLdouble centery, GLdouble

    centerz, GLdouble upx, GLdouble upy, GLdouble upz);

    Posicin de la Cmara, Punto de Referencia, Direccin arriba.

    Transformacin de Modelo: utilizadas para posicionar y orientar el

    modelo, como rotar, trasladar o escalar.

    void glTranslatef{fd} (TYPE x, TYPE y, TYPE z);

    void glRotate {fd} (TYPE angle, TYPE x, TYPE y, TYPE z); void glScale {fd} (TYPE x, TYPE y, TYPE z);

    Transformacin de Proyeccin: determina como se proyectar el

    objeto en la pantalla.

    Existen dos tipos bsicos:

    Perspectiva : hace que los objetos ms lejanos se vean ms

    pequeos.

    glFrustrum(GLdouble left, GLdouble right, GLdoublebottom, GLdouble top, GLdouble near, GLdouble far)

    20

  • 7/23/2019 Programacin Orientada a Objetos.doc

    21/25

    Antes de usarse hay que indicar en reshape() el comando

    glMatrixMode() con el argumento GL_PROJECTION, as afecta a

    la matriz de proyeccin. Para que afecte al modelo se debe

    agregar el argumento GL_MODELVIEW. El comando

    glLoadIdentity() inicializa la matriz de transformacin actual.

    Ortogonal: mantiene las dimensiones reales de los objetos.

    El volumen de visualizacin es un paraleleppedo. No cambia el

    tamao del objeto.

    glOrtho (GLdouble left, GLdouble right, GLdouble bottom,

    GLdouble top, GLdouble near, GLdouble far)

    7.6. Primitivas OpenGL

    Son usadas para realizar los dibujos que se desean realizar. Las primitivas

    son: puntos, lneas y polgonos.

    Estas primitivas se describen por sus vrtices: coordenadas que definen

    punto, extremos de segmentos de lnea y esquinas de polgonos.

    Puntos: nmeros de punto flotante llamados vertex. Todos los

    clculos se realizan con vectores tridimensionales, si no se

    define z, se asume su valor cero.

    Lneas: son en realidad segmentos de recta, y no como una

    extensin al infinito como en matemticas. Vrtices definen

    puntos extremos de cada segmento.

    Polgonos: reas encerradas por lazo cerrado de segmentos de

    recta, con vrtices indicando extremos de segmentos que lo

    forman. Los polgonos se dibujan rellenos por defecto.

    Hay funciones avanzadas para crear polgonos huecos,

    colores distintos para distintas caras, etc. Poseen restricciones:

    Orillas no pueden intersectarse.

    Solo polgonos convexos, es decir, si dados dos

    puntos internos, el segmento que los une esta

    tambin en el interior.

    7.6.1. Definicin de los vrtices

    La instruccin principal usada para ello es:

    glVertex {1,2,3,4} {b,s,i,d} [v] (TYPE coords)

    21

  • 7/23/2019 Programacin Orientada a Objetos.doc

    22/25

    Donde las coordenadas posibles son 1, 2, 3 4, y los tipos de datos son

    sufijos.

    Ejemplo:

    glVertex2s (2,3);

    GLdouble dvect[3] = {5.0,9.0,1992.0};glVertex3dv (dvect);

    Las llamadas que se hacen a glVertexson efectivas solo entre las

    instrucciones glBegin() y glEnd(), pues los vrtices son en realidad

    argumentos de estas instrucciones.

    7.7. Representacin y Matrices

    Escalamiento

    Escalamiento

    x= sx x y= sy y

    Notacin matricial

    P=S P

    Rotacin

    Rotacin

    x=x cos(a) y sin(a) y=x sin(a) + y cos(a)

    Notacin matricial

    22

    Sx=2

    Sy=1

    Sx=5/2

    Sy=3/2

    =

    y

    x

    aa

    aa

    y

    x

    )cos()sin(

    )sin()cos(

    '

    'a

    =

    y

    x

    s

    s

    y

    x

    y

    x

    0

    0

    '

    '

  • 7/23/2019 Programacin Orientada a Objetos.doc

    23/25

    Traslacin

    Traslacin

    x = x + dx

    y = y + dy

    23

  • 7/23/2019 Programacin Orientada a Objetos.doc

    24/25

    7.8. Coordenadas homogneas

    Todo punto 2D (P1) puede ser representado por cualquierpunto a lo largo del rayo 3D (llamado espacio homogneo)

    Las coordenadas ordinarias corresponden al punto donde z=1

    Usando coordenadas homogneas cada punto pasa a ser:

    Donde

    X = (x*h) / h

    X = (x*h) / h

    Para este caso, h = 0 no est permitido. Para nuestros casos h = 1. Reescribiendo las transformaciones en coordenadas

    homogneas:

    Nota : Transformaciones respecto al origen.

    24

    h

    y

    x

    y

    xh

    h

    =

    100

    0)cos()sin(

    0)sin()cos(

    )( aa

    aa

    aR

    =

    100

    00

    00

    ),(y

    x

    yxs

    s

    ssS

    =

    100

    10

    01

    ),(y

    x

    yxd

    d

    ddT

  • 7/23/2019 Programacin Orientada a Objetos.doc

    25/25

    7.9. Bases de la GLUT (pasos a seguir)

    Estructura de la aplicacin. Configurar y abrir una ventana.

    Iniciar estados en OpenGL.

    Registrar las funciones callback:

    render.

    resize.

    Input: keyboard, mouse, etc.

    Definir el ciclo de procesamiento de eventos.