GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro...

Post on 13-Oct-2018

228 views 0 download

Transcript of GRAFICACIÓN Unidad I - cs.buap.mxhilario_sm/slide/graficacion/unidad-I.pdf · decir que nuestro...

GRAFICACIGRAFICACIÓÓNNUnidad IUnidad I

CatedrCatedráático: Hilario Salazar tico: Hilario Salazar MartMartííneznez

OBJETIVO ESPECIFICO:

El alumno aprenderá a relacionar los conceptos básicos de geometría analítica con los conceptos iniciales de graficado por computadora

1.1 COORDENADAS DEL MUNDO REAL, VENTANA Y RECUADRO

ENTIDADES DE DIBUJO• LINEA: Segmento rectilíneo delimitado por sus puntos extremos.

• POLILÍNEA: Curva quebrada y/o mixtilinea, formada por segmentos rectilíneos y/o curvilíneos.

• ARCOS: Segmento de circunferencia.

• CURVA CÓNICA: Se denomina asi a la intercepción de una superficie conica de segundo grado con un plano.

• CURVAS LIBRES. Son curvas simples o compuestas sujetas a una o varias ecuaciones (Las mas conocidas son splines y las Nurbs). Se denominan libres porque el diseñador puede modificar simplemente con desplazar o suprimir uno o mas puntos de control o incluso añadir nuevos.

1.2 Graficación de primitivas: rectas y arcos

Rectas horizontales y verticales.Las rectas mas fáciles son las verticales y las horizontales.• Para trazar una línea horizontal desde

P0 (Xinicial,y) P1(Xfinal,y) donde Xinicial ≤ XfinalSe obtiene manteniendo constante el valor de y e incrementado el valor de x

• Para trazar una línea vertical el valor de x permanece fijo y el valor de yvaria.

Recta horizontal

Rectas arbitrariasEl trazado de rectas con pendiente arbitrarias dan origen a ciertos problemas:

1. La pantalla de presentación puede iluminarse solo en posición de píxeles.

2. La presentación por barrido tiene un efecto de escalera que reproduce solo aproximadamente la recta real.

Por ejemplo el pixel de la posición A es una mejor selección que el de la posición B, Segundo, la determinación de los pixeles mas cercanos a la recta no es tare a facil, los diferentes algoritmos calculan pixeles distintos para obtener la aproximación de la recta.

Es un procedimiento de trazado de rectas que es fácil de programar y que produce rectas razonablemente buenas.Supóngase, modo de ejemplo, deseamos trazar un segmento de recta con puntos extremos P0( xinicial,yinicial) y P1(xfinal,yfinal) con una pendiente de

Cualquiera dos puntos consecutivos (x1,y1), (x2,y2) en la recta cumple con la ec. 2.1:

Para abs(m)<1 y xinicial<xfinal la liena se genera incrementando una entidad el valor anterior de x hasta llegar x final, resolviendo y en cada paso. (Si xinicial>xfinal) se intercambian ambos puntos) asi para cada par de puntos consecutivos

Al sustituir esta diferencia en la ec. 2.1 se obtiene

Analizador diferencial digital simple (ADD Simple)

La ec. 2-2 permite calcular valores consecutivos de y desde el valor anterior remplazando la multiplicación repetida con sumas en punto flotante. Este método de obtención de valor actual que agrega una constante al valor previo es unejemplo de calculo incremental.

Si abs(m)>1 y yinicial<yfinal, recta se general invirtiendo el procedimiento. Esto es, se incrementa el valor de y en una unidad hasta que se alcanza el valor de yfinal y se resuelve x. (Si yinicial>yfinal, se intercambian ambos extremos). Para puntos consecutivos

La ec. 2.3 es la ecuación incremental de la recta,

Ejemplo: programas-ejemplos\add-s.exe

ADD entero

El ADD simple presenta presenta el inconveniente de emplear dos operaciones que resultan costosas en el tiempo de computación: La adición en punto flotante y la función round.

La idea básica del ADD entero consiste en remplazar la pendiente real valuada por sus componentes enteros.

delta_y=yfinal-yinicialdelta_x=xfinal_xinicial

El algoritmo se divide en cuatro casos que dependen de la pendiente de la recta. Cada caso tiene su propio conjunto de reglas. El error indica la distancia que media entre la recta y un punto graficado.

Po(x,y) y Pf(xfinal,yfinal)

Algoritmo ADD enterodelta_y=yfinal-ydelta_x=xfinal-xm=(yfinal-y)/(xfinal-x)si delta_y<0

permutar(x’s,y’s)delta_y=- delta_ydelta_x=- delta_x

error=0si 0 ≤m ≤1 y delta_x>0 y delta_y >0

/*caso 1*/si error<0

x=x+1y=y+1dibujar(x,y)error=error+delta_y

si error>0x=x+1y=y+1

dibujar(x,y)error=error+delta_y-delta_x

si m>1 y delta_x>0 y delta_y >0/* caso 2*/

si error<0x=x+1y=y+1dibujar(x,y)error=error+delta_y-delta_x

si no y=y+1dibujar(x,y)error=error-delta_x

si -1 ≤ m ≤0 y delta_x<0 y delta_y >0/*caso 3*/

si error<0x=x-1

dibujar(x,y)error=error+delta_y

si nox=x-1y=y+1

dibujar(x,y)error=error+delta_x+delta_y

si m <-1 y delta_x<0 y delta_y >0/*caso 4*/

si error<0x=x-1y=y+1

dibujar(x,y)error=error+delta_x+delta_y

si noy=y+1dibujar(x,y)error=error+delta_x

dibujar(xfinal,yfinal)

ejemplo ADD entero Acceso directo a add-e

Graficación de primitivas: rectas y arcos

Rectas horizontales y verticales.Las rectas mas fáciles son las verticales y las horizontales.• Para trazar una línea horizontal desde

P0 (Xinicial,y) P1(Xfinal,y) donde Xinicial ≤ XfinalSe obtiene manteniendo constante el valor de y e incrementado el valor de x

• Para trazar una línea vertical el valor de x permanece fijo y el valor de yvaria.

Recta horizontal

INTRODUCCIÓN A LA PROGRAMACION CON OPENGL

• OpenGL.DLL.- La podemos encontrar con el nombre de OpenGL32.DLL (para el caso de S.O de 32 bits) o bien simplemente como GL.DLL. Esta es la librería principal, que contiene la mayoría de las funciones que aquíutilizaremos. Las funciones contenidas en esta librería inician con la letra gl.

• GLU.DLL.- También la podemos encontrar como GLU32.DLL. Contiene funciones para objetos comunes a dibujar como esfera, donas, cilindros, cubos, en fin, varias figuras ya predefinidas que pueden a llegar a ser útiles en ciertos casos, así como funciones para el manejo de la cámara entre otras muchas otras. Podremos identificar la funciones que pertenecen a esta librería porque llevan atepuestas en su nombre las siglas glu.

• GLUT.DLL.- Esta también permite crear objetos complejos como GLU, aunque la principal funcion de esta librería es permitir que los programas se vuelvan interactivos, o sea que posibilita la libre creación de ventanas, así como el acceso al raton y al teclado.

Como funciona OpenGL?OpenGL funciona a través de una serie de librerías DLL que suelen tener varios nombres, pero a fin de cuentas cubren funciones muy especificas y son muy sencillas de identificar, ahora veremos cuales son estas:

• Otro componente es el llamado Frame Buffer, que no es otra cosa que el área de memoria donde se construyen los gráficos antes de mostrarlos al usuario, es decir que nuestro programa de OpenGL escribe en esta área de memoria, y que automáticamente envía su contenido a la pantalla una vez que la escena esta completamente construida.

Tipos en OpenGL

Debemos recordar que las librerías de OpenGL fueron escritas originalmente en C, asi que conservan muchas características de este lenguaje, entre ellas, la estructura de sus procedimientos y los tipos que se utilizan.Los tipos de OpenGL se anteponen las siglas GL, esto guarda una marcada equivalencia con los tipos genéricos de C,

Ejem.:

Tamaño Correspondencia en C Definición en OpenGL8-bit integer signed char GLbyte16-bit integer short GLshort32-bit integer int or long GLint, GLsizei32-bit floating-point float GLfloat, GLclampf64-bit floating-point double GLdouble, GLclampd8-bit unsigned integer unsigned char GLubyte, GLboolean16-bit unsigned integer unsigned short GLushort32-bit unsigned integer unsigned int or unsigned long GLuint, GLenum, GLbitfield

Usaremos: a) glVertex3f(0.0,0.0,0.0) ; b) Glfloat vertice[3]={0.0,0.0,0.0};

glVertexfv(vertice);

Ambas funciones crean un vertice situado en el origen de cordenadas del mundo, es decir x=y=z=0.0en a) termia en 3f esto significa que vamos que vamos a especificar el vertice con 3 valores de tipo real, en b) tenemos que termia en fv estamos indicando a OpenGL que el verice lo daremos mediante un vector de floats.

glclearcolor() recibe como parámetro un vector de 4 valores que determinan el color con el que se inicializa nuestro frame buffer, antes de escribir en el, dando como resultado un color de fondo.

glColor3f(r,g,b) define el color del punto r(cantidad rojo), g(cantidad de verde) y b(cantidad de azul) utilizando el sistema RGB.

ejem: glColor3f(0.0,0.0,0.0) color negroglColor3f(1.0,1.0,1.0) color blanco

GLClear() sirve para borrar desde frame buffer valores de escena que hayan sido construidas previamente a la actual.

GLPointSize(2.0) determina el numero de pixeles reales que ocupara cada uno de nuestros puntos (cada punto deberá tener un grosor de 2 pixeles).

GLBegin() y GLEnd sirven para determinar los vértices de una figura.

Ejem: glColor3f(1.0,1.0,1.0);glBegin(Gl_TRIANGLES);

glVertex3f(-1.0,0.0,0.0);glVertex3f(1.0,0.0,0.0);glVertex3f(0.0,1.0,0.0);

glEnd();

Respecto a las constantes que podemos usar en la función glBegin tenemos entre otras

• GL_POINTS: puntos

• GL_LINES: cada 2 vértices definidos, se traza automáticamente una línea que los une.

• GL_POLYGON: se unen todos los vértices formado un polígono.

• GL_QUADS: cada 4 vértices se unen para formar un cuadrilátero.

• GL_TRIANGLES: cada 3vertices se unen para formar un triangulo.

• GL_TRIANGLE_STRIP: crea un triangulo con los 3 primero vértices. entonces sucesivamente crea un nuevo triangulo unido al anterior usando los dos últimos vertices vertices que se han definido y el actual.

• GL_QUAD_STRIP: igual que el anterior pero con cuadriláteros.

Header Files

#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>

#include <GL/glut.h>

Display-Windows Using GLUTglutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50,100);

y

glutInitWindowSize(400,300);glutCreateWindow(“An Example OpenGl Program”);glutDisplayFunc(lineSegment);glutMainLoop();

glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);

glMatrixMode (GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);

glBegin(GL_LINES);glVertex2i(180,15);glVertex2i(10,145);

glEnd();

A Complete OpenGL Program

Acceso directo a Pba

Compilación de ejemplos de OpenGl y Visual C++ 6.0 bajo Windows 98/Me/XP

Archivos necesarios para compilar

Glu32.dllGlut32.dllOpengl32.dll

C:\windows\system

Glaux.libGlu32.libOpengl32.libGlut32.lib

C:\Archivos de programa\Microsoft Visual Studio\VC98\lib

Gl.hGlaux.hGlu.hGlut.h

C:\Archivos de programa\Microsoft Visual Studio\VC98\includes\gl

1. File/New/proyects/Win32n Console Application o Win32 Applicationa) si utiliza GLUT entonces seleccione Win32n Console Applicationb) Si Apis de win32 seleccione Win32 Applicationc) Project name (escribir nombre del proyecto)d) Location (Directorio donde esta el código fte. del proyecto

2. File/New/Files/C++ Source File/File name (main) /OKaquí pegamos el código fuente

3. Antes de compilar, agregar las librerías correspondientes en Project/Settings/Links/cuadro Objects/library modules: aquí escribirglut32.lib, glu32.lib, glaux.lib bueno todas la librerías a usar

/Output file name (C:\CURSO-GRAFICACION\programas-ejemplos\Debug)

4. Compilar

5. Si todo esta bien, entonces es generada una carpeta debug y es aquí donde se encuentra el ejecutable (main.exe) de la aplicación

CREACIÓN DE UN NUEVO PROYECTO VC++ 6.0

Ejemplo 1#include <gl/glut.h>

void display(void) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glutWireTeapot(0.5);glFlush();glutSwapBuffers();

}

void main(void) {glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize(400, 400);glutInitWindowPosition(100, 100);glutCreateWindow(“Ejemplo cutre de GLUT”)

glClearColor(0.0, 0.0, 0.0, 1.0);glEnable(GL_DEPTH_TEST); glutDisplayFunc(display);glutMainLoop();

}

Compilación con Visual“File | New”. Seleccionamos “Win32 Console Application” en la pestaña “Projects”. Introducimos el nombre y path del proyecto. Pulsamos OK.

Compilación con VisualSeleccionamos la opción “An empty project” y pulsamos Finish y luego OK. Esto crea un proyecto vacío.

Compilación con Visual“Project | Add to project… | New…”. Seleccionamos en “Files” la opción “C++ Source File”. Le damos un nombre y pulsamos sobre OK.

Compilación VC++ 6.0“Project | Settings” . En “Link” seleccionamos “All Configurations”Añadimos al cuadro de edición “Object / library modules” las siguientes librerías: opengl32.lib glu32.lib glut32.lib y pulsamos OK.

CompilaciónVC++ 6.0Escribimos el código del program, pulsamos sobre el icono

Y a la pregunta respondemos “Sí”.

Acceso directo a ejemplo1Acceso directo a teteramAcceso directo a Brazo

Usando glut en Linux 1. Descargar (root) Mesa-glut-X.X-X.i386.rpm

2. Desempaquetar rpm –ivh Mesa-glut-X.X-X.i386.rpm

3. Instalar (entrar al directorio donde se desempaquetaron)ejecutar

* make (make linux)* make install

(cp –r include/GL a /usr/include/GLcp –r lib/* a /usr/lib)

4. gcc –o file file.c –lglut –lglu –lGL (Makefile)

Nota: si descarga el paquete desde mi pagina entonces utilice (glut-3.7)

# ./mkmkfiles.imake# make# make install

1) Compilar usando un archivo Makefile

a) Editar Makefile, suponemos que la aplicación es lines.c

# vi Makefile

INCLUDE = -I/usr/X11R6/include/LIBDIR = -L/usr/X11R6/lib/CFLAGS = -WallCC = gccLIBRARIES = -lX11 -lXi -lXmu -lglut -lGL -lGLU -lmOBJECTS = lines.oall: lines

lines: $(OBJECTS)$(CC) $(CFLAGS) $(INCLUDE) $(LIBDIR) -o $@ $(OBJECTS) $(LIBRARIES)

lines.o: lines.c$(CC) $(CFLAGS) -c lines.c

.PHONY: cleanclean:

rm lines $(OBJECTS)

b) Compilar el archivo lines.c# make

c) Ejecutar# ./lines

DESCRIPCIÓN DEL CUERPO DE UN PROGRAMA La librería GLUT son:

inicializa GLUTsetea nuestra ventana de trabajo donde x y y son las coordenadas de nuestra ventanadefinimos tamaño de nuestra ventanadefinimos el “modo”

modo puede tomar los siguientes valores:* GLUT_RGB o GLUT_RGBA selecciona una

ventana con RGB(rojo, verde, azul o RGBA(rojo, verde, azul y el canal alfa)

* GLUT_INDEX ?* También se puede especificar que buffer:

- GLUT_ACCUM buffer de acumulación - GLUT_STENCIL buffer stencil, se ocupa

para reflejos y sombras- GLUT_DEPTH buffer de fondo

se crea la ventanafunc es el nombre de la función que hace las tareas de dibujarahora le avisamos a GLUT que estamos listos para entrar en loop de eventos de la aplicación

glutInit(int arg, char **arrgv);glutWindowPosition(int x, int y);

glutWindowSize(int width, int height);glutDisplayMode(unsigned int mode);

glutCreateWindow(char *title);glutDisplayFunc(void *(func)(void));

glutMainLoop();

Si se quiere una ventana tipo RGB, con buffer simple seria:glutDisplayMode(GLUT_RGB | GLUT_SINGLE | GLUT_DEPTH);

OpenGL en Dev C++1. La librerías GLUT para Dev C++ descomprimir(*.zip) → Directorio X

2. glut32.dll (X) →windows/system (Windows 9x/Me),→windows/system32(WindowsNT/2000/XP/2003).

3. Glut.h (X)→ subdirectorio Include/Gl de Dev C++

4. glut32.def (X) e libglut.a (X) → C:\Dev C++\Lib

Creación de los programasPara que la compilación sea exitosa debemos indicar que librerías utilizaremos en nuestros programas. La forma de hacer esto en Dev-C es la siguiente:

1. Crear un proyecto. Eso lo consigues haciendo click en el botón Project... de la barra de herramientas, o bien, en el menu File -> New -> Project..., elije Emptyproject y dale nombre a tu proyecto

2. Ir al menu Project -> Project Options o selecciona el botón correspondiente de la barra de herramientas. En el cuadro de diálogo que aparece ve a la pestaña Parameters. En el cuadro que dice Linker agrega los siguientes archivos (se encuentran en el directorio lib de Dev-C):

libglu32.a libopengl32.a libglut32.a

Alternativa 1-lopengl32-lglut32-glu32

Alternativa 2

-lopengl32-lglut32-glu32

3. Solo falta agregar archivos fuente a tu proyecto, o bien, crearlos desde ahí. No olvides abrir el proyecto y no solo el código fuente cuando desees compilar tus programas.

Primitivas de objetos predefinidos

Hay algunos objetos que vamos a renderizar muy a menudo, y que por tanto, ya vienen definidos. Así, disponemos de las siguientes funciones:

• glutWireSphere(radius, slices, stacks)• glutSolidSphere(radius, slices, stacks)• glutWireCube(size), glutSolidCube(size)• glutWireCone(base, height, slices, stacks),• glutSolidCone(base, height, slices, stacks)• glutWireDodecahedron(void),• glutSolidDodecahedron(void)• glutWireOctahedron(void), glutSolidOctahedron(void)• glutWireTetrahedron(void), glutSolidTetrahedron(void)• glutWireIcosahedron(void), glutSolidIcosahedron(void)• glutWireTeapot(void), glutSolidTeapot(void)

Algoritmo de Línea Bresenham Básico

El algoritmo busca cual de dos píxeles es el que esta mas cerca según la trayectoria de la línea. Consideremos el proceso de conversión para líneas con pendiente positiva 0 < m < 1.Las posiciones de píxel a lo largo de la trayectoria de una línea se determinan al efectuar un muestreo de x en intervalos unitarios.

Si se inicia desde el extremo izquierdo (x0,y0) de una línea determinada, se pasa a cada columna sucesiva y se traza el píxel cuyo valor de y se aproxima mas a la trayectoria de la línea de rastreo.Si suponemos que se debe desplegar el píxel en (xk,yk), a continuación se necesita decidir que píxel se debe desplegar en la columna xk+1. Las alternativas son los píxeles (xk+1,yk), y (xk+1,yk+1).Al realizar el muestreo en la posición xk+1 designamos la separación de píxeles verticales de la trayectoria de la línea matemática como d1 y d2.

La coordenada de y en la línea matemática en la posición de la columna de píxel xk+1 se calcula comoLa coordenada de y en la línea matemática en la posición de la columna de pixel xk+1 se calcula como

(10) y = m (xk + 1) + bEntonces

d1 = y - yk = m (xk + 1) + b – yk yd2 = (y k + 1) - y = y k + 1 - m (x k + 1) – b

(11) d1 - d2 = 2m (x k + 1) - 2 yk + 2 b – 1

Un parámetro de decisión pk para el paso k en el algoritmo de línea se puede obtener al reordenar la ecuación anterior, de modo que implique solo cálculos de enteros.Esto se logra sustituyendo m = ∆ y / ∆ x donde ∆ x y ∆ y son las separaciones horizontal y vertical de las posicionesde los extremos de la línea y al definir:(12) pk = ∆x (d1 - d2) = ∆ x (2 ∆ y / ∆ x (x k + 1) - 2 yk + 2 b - 1)

= 2 ∆ y xk - 2 ∆ x yk + 2 ∆ y + 2 b ∆ x - ∆ x= 2 ∆ y xk - 2 ∆ x yk + c

El signo de pk es el mismo que el de d1 - d2 puesto que ∆ x > 0 en el ejemplo.El parámetro c es un constante, donde c = 2∆ y + 2 b ∆ x - ∆ x, que es independiente del pixel.

Si el pixel yk esta mas cerca de la trayectoria de la línea que el pixel y k + 1 (es decir d1 < d2), entonces el parámetro de decisión pk es negativo.

En ese caso, trazamos el pixel inferior; de otro modo, trazamos el pixel superior.Los cambios de coordenadas a lo largo de la línea ocurren en pasos unitarios ya sea en la dirección de x o en la de y. Por tanto, es posible obtener los valores de parámetros de decisión sucesivos al utilizar cálculos incrementales en enteros.

En el paso k + 1, el parámetro de decisión se evalúa con base en la ecuación anterior como

pk+1 = 2 ∆y xk+1 - 2 ∆ x yk+1 + c

Al sustraer la ecuación (12) de la anterior obtenemospk+1 - pk = 2 ∆ y (xk+1 - xk) - 2 ∆ x( yk+1 - yk)Pero xk+1 = x k + 1, de manera que

(13) pk+1 = pk + 2 ∆ y - 2 ∆ x( yk+1 - yk)

donde el termino yk+1 - yk es 0 o 1, dependiendo del signo del parámetro p.

Este calculo recurso de los parámetros de decisión se realiza en cada posición entera de x, empezando en el extremo izquierdo de las coordenadas de la línea.El primer parámetro p0 se evalúa a partir de la ecuación (12) en la posición del pixel inicial (x0,y0), sustituyendo con

b = y0 - m x0 y m = ∆ y / ∆ x.p0 = ∆ x (2 ∆ y / ∆ x(x0 + 1) - 2 y0 + 2 (y0 - (∆y / ∆x) x0) - 1)

= 2 ∆ y x0 + 2 ∆ y - 2 ∆ x y0 + 2 ∆ x y0 - 2 ∆ y x0 - ∆x

donde se obtiene la siguiente ecuación:

(14) p0 = 2 ∆y - ∆ x

En resumen, los pasos son:1. Se capturan los dos extremos de la línea y se almacena el extremo izquierdo en (x0,y0).2. Se carga (x0,y0) en el bufer de estructura, o sea, se traza el primer punto.3. Se calculan las constantes y, ∆x, 2 ∆ y, 2y-2 ∆ x, y se obtiene el valor inicial para el

parámetro de decisión como p0 = 2 ∆ y - ∆ x.4. En cada xk a lo largo de la línea, que inicia en k = 0, se efectúa la prueba siguiente: si pk

< 0, el siguiente punto que se debe trazar es (xk+1,yk) y p k +1 = pk + 2 ∆ y. De otro modo, el siguiente punto en trazarse es (xk+1,yk+1) y p k +1 = p k + 2 ∆ y -2 ∆ x.

5. Se repite el paso 4 otras ∆ x veces.

EjemploPara ilustrar el algoritmo, utilicemos la línea con extremos (20,10) y (30,18).Esta línea tiene una pendiente de 0.8, con ∆ x = 10, ∆ y = 8El parámetro de decisión inicial tiene el valor p0 = 2 ∆ y - ∆ x = 6y los incrementos para calcular parámetros de decisión sucesivos son:

2 ∆ y = 16 2 ∆ y - 2 ∆ x = -4

Trazamos el punto inicial (x0,y0) = (20,10) y determinamos las posiciones de píxel sucesivos a lo largo de la trayectoria de la línea a partir del parámetro de decisión como

\programas-ejemplos\lin-bez.exe

Algoritmos de Generación de CircunferenciasUna circunferencia se define como un conjunto de puntos que se encuentran, en su totalidad, a una distancia r de una posición central (xc, yc).Esta relación de distancia se expresa por medio del teorema de Pitágoras en coordenadas cartesianas como

(24) (x - xc)2 + (y - yc) 2 = r2

Algoritmo Básico

Se podría utilizar una ecuación para calcular la posición de los puntos de una circunferencia pasando a lo largo del eje de las x en pasos unitarios de xc - r a xc + r y calcular los valores correspondientes de y en cada posición como

Un método para dibujar el circulo es aprovechar la simetría de los cuadrantes, dibujando solo uno y trazando los puntos simétricos en los demás cuadrantes.Para el primer cuadrante se incrementaría x de 0 a r en pasos de 1, resolviendo para cada y positiva.El trazo para un circulo con radio de 10, centrado en (0,0), utilizando este algoritmo básico, se muestra a continuación:

El resultado de esto se muestra en la siguiente figura:

El problemas con método directo•Cálculos considerables en cada paso•El espacio entre píxeles no es uniforme•Se podría ajustar al espacio al intercambia x y y siempre que |m|>1

Si aprovechamos la simetría de la circunferencia , se puede generar todas las posiciones del pixel alrededor de una circunferencia, calculando los puntos x=0 y x=y

12

3

4

5 6

7

8

Simetría en la circunferencia

Para un r determinado y una posición central (xc,yc), se debe establecer el primero el algoritmo para calcular la posición del pixel alrededor de una trayectoria circular centrada en el origen de coordenadas (0,0). Asi cada posición calculada (x,y)se mueve a su posición propia en la pantalla al sumar xc a x y yc a y

A lo largo de la sección circular de en el primer cuadrante, la pendiente (m) de la curva varia entre 0 y -1.

Para aplicar el método del punto medio, se define una función de circunferencia como:

Cualquier punto (x,y) en la frontera de la circunferencia con radio r satisface la ecuación fcirc(x,y) = 0. Si el punto esta en el interior de la circunferencia, la función de la circunferencia es negativa.

Para resumir, la posición relativa se puede determinar al verificar el signo de la función de circunferencia:

La siguiente figura muestra el punto medio entre los dos pixeles candidatos en la posición de muestreo xk + 1.

Suponiendo que se acaba de trazar el pixel en (xk, yk), en seguida se necesita determinar si el pixel en la posición (xk + 1, yk), o aquel en la posición (xk + 1, yk - 1) esta mas cerca de la circunferencia. El parámetro de decisión es la función de circunferencia (27) evaluada en el punto medio entre esos dos píxeles.

Se obtiene al evaluar la función de circunferencia en la posición de inicio (x0, y0) = (0,r)

p0 = fcirc(1, r - 1/2) = 1 + (r - 1/2) 2 - r2

o(31) p0 = 1 + r 2 - r + ¼ - r2 = 5/4 – r

Si el radio r se especifica como un entero, se puede redondear simplemente p0 ap0 = 1 - r (para r como un entero).

Se puede resumir los pasos del algoritmo de la circunferencia de punto medio como sigue:

1. Se capturan el radio r y el centro de la circunferencia (xc,yc) y se obtiene el primer punto de una circunferencia centrada en el origen como (x0,y0) = (0,r).

2. Se calcula el valor inicial del parámetro de decisión como p0 = 5/4 - r.

3. En cada posición xk, iniciando en k=0, se efectúa la prueba siguiente:Si pk < 0, el siguiente punto a lo largo de la circunferencia centrada en (0,0) es(xk+1,yk) y pk+1 = pk + 2xk+1+1 = pk + 2xk +3. De otro modo, el siguiente punto a lo largo de la circunferencia es

(xk+1,yk -1) y pk+1 = pk + 2xk+1+1 - 2yk+1 = pk + 2xk - 2yk +5,

donde 2xk+1 = 2xk + 2 y 2yk+1 = 2yk + 2.

4. Se determinan puntos de simetría en los siete octantes.

5. Se mueve cada posición de pixel calculada (x,y) a la trayectoria circular centrada en (xc,yc) y se traza los valores de las coordenadas x = x + xc, y = y + yc.

6. Se repiten los pasos 3 a 5 hasta que x≥y.

EjemploDado el radio de una circunferencia r=10, se demuestra el algoritmo de la circunferencia de punto medio al determinar las posiciones a lo largo del octante de la circunferencia en el primer cuadrante desde x=0 hasta x=y. El valor inicial del parámetro de decisión es p0 = 1 - r = -9En el caso de la circunferencia centrada en el origen de las coordenadas, el punto inicial es(x0,y0) = (0,10) y los términos de incremento iniciales para calcular los parámetros de decisión son 2 x0 = 0, 2 y0 = 20 Los valores sucesivos del parámetro de decisión y las posiciones a lo largo de la trayectoria de la circunferencia se calculan mediante el método del punto medio como

En la siguiente figura se muestran las posiciones generadas en el primer cuadrante:

1.3 Interpolación cúbicos

Un interpolante cúbico tiene la profundidad de que las funciones de las tres dimensiones x(t), y(t) y z(t), son polinomios cúbicos en la variable t:

Como lo que aquí interesa son los segmentos de curva, el dominio de t es finito y se supondrá que 0≤t≤1.Una interpolación pasa a través de dos puntos y cumple con una condición de diferenciabilidad en cada extremos. Estas cuatro condiciones requieren, al menos, un grado polinomial de 3.

figura 1a

Esta razón del uso tan generalizado de los interpelantes. Si se dan N+1 puntos, se debe de funcionar Ninterpolantes. Las derivadas iguales en los extremos de cada interpolante proporciona la continuidad en las uniones (figura 1a).

El proceso para obtener los polinomios cúbicos es similar para x,y, y z. La única diferencia esta entre los valores asignados para los extremos y sus derivadas. Por esta razón solo se describe la ecuación x(t). Dados N+1 puntos

se desea obtener el interpolante cúbico que une dos puntos consecutivos. Para cada par de puntos xi, xi+1 se tiene las suposiciones siguientes

1. La curva interpolante pasa por los puntos extremos:

2. El interpolante cumple con una condición de diferenciabilidad en estos puntos, Así, son conocidos x’(0) y x’(1) donde la prima representa la diferenciación con respecto a t .Dado que :

Es un sistema de cuatro ecuaciones y cuatro incógnitas: a, b, c y d. Al obtener la solución única, se tiene

En términos de matrices:

Al sustituir los valores de t=0 y t=1 en las ecuaciones, se obtiene

Los coeficientes de los polinomios interpolantes cúbicos y(t) y z(t) se obtiene de manera similar, reaplazando los valores del dato x y sus derivadas por los correspondientes valores y derivadas de y y z.

Para dibujar un interpolante cúbico entre dos puntos consecutivos, se calculan varios valores de x(t), y(t) y z(t). Los valores calculados se unen por medio de segmentos de rectas.

1.3 CURVAS DE BEZIER

Polinomio cúbico de Bezier.

Acceso directo a bezier34

figura 2a

La curva de Bezier (cúbica) se determina completamente con cuatro puntos consecutivos:

La línea sigue el segmento de línea poligonal a través de los cuatro puntos de control, pero solo pasa por el primero y cuarto punto (Figura) los dos puntos intermedios se usan para definir la pendiente de la curva de los extremos. Solo veremos la ecuación las ecuaciones para la variable x (las de y y z son similares). Sea

las suposiciones son:1.La curva pasa por los extremos:

2.pendiente en los extremos esta determinada por el extremo y el punto adyacente. El coeficiente 3 resulta del hecho de que la derivada de x3 es 3x2:

Al sustituir estos valores en el lado izquierdo de la ecuación 12-1 y simplificando, se obtiene

B03(t)= 3! (1-t)3-0t0= (1-t)3

(3-0)!0!

B13(t)=3t(1-t)2=3t3+3t-6t2

B23(t)=3t2(1-t)=3t2-3t3

B33(t)=t3

P(t)=P3t3 + P2(3t2-3t3)+ … =(P3-3P2+3P1-Po)t3 + (….) t2 + (…) t + P0

= at3 + b t2 + c t + d

P(t)= at3 + bt2 + ct + dX’(0)=n(X1-X0) X‘(1)=n(Xn-Xn-1)

1) X(0)=d2) X(1)= a + b + c + d

3) 3(X1 - Xo) = X’(0)= c4) 3(X3 - X2)= X’(1)= 3a+2b+c

en 2) X(1)=a+b+3(X1- X0) + X0=a+b+3X1 -2X0

2a) b=-a-3X1+ 2X0 +X(1)=2Xo-3X1- a +X(1)

en 4) 3(X3-X2)=3a+2[2Xo-a-3X1+X(1)]+3(X1-X0)=3a+4X0-2a-6X1+2X(1)+3X1-3X0=a+X0-3X1+2X(1)+3X1-3X0=a+X0-3X1+2X(1)

a=-X0+3X1-3X2+3X3-2X(1)4a) a=-X0+3X1-3X2+3X3-2X(1)

1ª.

2ª.

en 2a) b =2X0+X0-3X1+3X2-3X3+2X(1)-3X1+X(1)= 3X0-6X1-3X2-3X3+3X(1)

cte.

abcd

=

X0X1X2X3

Tipos de superficie más frecuentes utilizadas:

A) Superficies de revolución. Se genera por rotación de una curva cualquiera (generatriz) alrededor de un eje.

B) Superficies cilíndrica. Se generan por una curva abierta o cerrada (base o generatriz) al desplazarse y siguiendo una trayectoria recta o curva abierta (eje). El plano que contiene a la generatriz formará en toda su trayectoria un ángulo constante con el eje o directriz. Estas superficies pueden clasificarse en:

• Barrido: la directriz es un segmento rectilíneo En este caso el desplazamiento es una traslación simple.

• Deslizamiento: La directriz es una polilínea 2D o 3D compuesto por tramos de rectas y curvos. El desplazamiento de la generatriz consta de desplazamientos y giros

C) Superficies regladas. Generadas por una línea rectas (generatriz) al desplazarse apoyadas en dos curvas ( directrices) iguales o diferentes

Superficie regladas

Superficies esculpidas

D) Superficies Esculpidas (deslizamiento 3D). Generadas por una curva al desplazarse apoyadas en dos curvas no concéntricas

E) Superficies Adaptadoras. Generadas por una línea recta apoyadas en dos curvas extremas diferentes, generalmente una poligonal rectilínea y la otra compuesta de arcos

F) Formas libres. Se puede obtener por dos procedimientos diferentes: interpolación o aproximación.La interpolación puede ser: Lineal, Bilineal, De Lagrange y Cubica

f.1) Superficies racionales Splines, B-splines, Bezier y Nurbs. La diferencia fundamental estriba en que están controladas no por un poligono, sino por un poliedro consistente en una malla de puntos en el espacio 3D debidamente ordenados

f.2) Superficies de Bezier. Estas superficies se determinan por un poliedro de u*v vértices y se generan a través del proceso siguiente.