universidad autonoma metropolitana iztapalapa proyecto de …148.206.53.84/tesiuami/uam1612.pdf ·...

124
CLa&&ddli PROVECTO DE INyESllGACJON BIBLIOTECA DE FUNCJONES GRAFleAS Y GRAFlCACJON PWUlRAI UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA PROYECTO DE INVESTIGACION "BIBLIOTECA DE FUNCIONES GRAFICAS Y GRFICACION POLIEDRAL" ............. .......... :.; ~. .......... .......... REALIZADO POR: HERNANDEZ HERNADEZ EVERARDO MISAEL 90323392 LUG0 MARTINEZ ELOY DAVID 90322873 ORTIZ MARTINEZ OSVALDO 90325121 ASESOR DE PROYECTO: MIGUEL ANGEL PIZAÑA LOPEZ México, D.F. octubre de 1995. * UNMRSIDAD AUTONOMA MITROPOLlTANA "ETAPALAPA"

Upload: trinhnga

Post on 05-Nov-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

CLa&&ddli PROVECTO DE INyESllGACJON BIBLIOTECA DE FUNCJONES GRAFleAS Y GRAFlCACJON PWUlRAI

UNIVERSIDAD AUTONOMA METROPOLITANA IZTAPALAPA

PROYECTO DE INVESTIGACION

"BIBLIOTECA DE FUNCIONES GRAFICAS Y

GRFICACION POLIEDRAL"

.............

.......... :.; ~. .......... ..........

REALIZADO POR: HERNANDEZ HERNADEZ EVERARDO MISAEL 90323392 LUG0 MARTINEZ ELOY DAVID 90322873 ORTIZ MARTINEZ OSVALDO 90325121

ASESOR DE PROYECTO: MIGUEL ANGEL PIZAÑA LOPEZ

México, D.F. octubre de 1995. *

UNMRSIDAD AUTONOMA MITROPOLlTANA "ETAPALAPA"

Caalbartldti BIBUOlECA DE FUNCIONES GRAHCAS V GRAFlCAMON PWEDRAL

UNIVERSIDAD AUTONOMA MmROWLTTANA "UTAPAIAPA"

Caa*dti BIBUOTECA DE FUNCJONES GWCAS Y GRAFICACJON PWEDRAL

.4 mis padres y hermanos. A los profesores: Fernándo Vallejo, Guillermo Oaxaca, Hans Fetter, Eduardo Rico, y en especial a

Miguel Angel Pizaña López quien con su dedicación hizo posible la realización de éste proyecto. A mis amigos Eloy, Everardo, Hector, Alejandro, Hidolfo, Liliana Awedondo, Gaby y hermana,

Beatriz Polo, Alicia y Joel, Laura y Pedro, Miguel Paredes, Javier Herrera, Poncho y Chino, Hugo y primas, Alejandra y hermana, Moisés y Beatriz, Rosy y Selene, los cuales de una u otra manera influyeron en mí para culminar mi carrera de licenciatura.

Osvaldo.

, . . . . . . . . ._

UNIVERSIDAD AUTONOMA METROPOLITANA ‘IITAPAIAPA”

A DIOS por darme la vida, salud y la oportunidad de culminar mi licenciatura. A mis padres Graciela y Eloy. A mis hermanos Lilián, Oscar y Lupita A mi prima Marianela, a todos mis.familiares y amigos. A Elva por su apoyo y comprensión durante toda mi carrera; a todos mis profesores; a mis amigos y

compañeros de la universidad; y a todos aquellos que de forma directa ó indirecta me ayudaron a culminar mi licenciatura; especialmente a mi asesor Miguel Angel Pizaña López que siempre estuvo dispuesto a ayudarme en la realización de este proyecto; a Bernardo Guerrero por el apoyo proporcionado para poder editar e imprimir este trabajo.

Eloy.

UNIVERSIDAD AUTONOMA METROPOLITANA 'ITTAPALAPA"

Caadbmdtam BIBLIOTECA DE FUNcIDNES 6RMCA.S Y 6RMCABON POUEDRAl

Primero que nada agradezco a Dios por permitirme vivir estos momentos y poder lograr una de mis principales metas en la vida.

Dedico este trabajo a :

A mi madre Maria Henández, por todo el apoyo que me ha brindado durante toda mi vida, por su amor y comprensión, ya que igual que mis hermanas Angélica, Verónica y Rocío han sido una de las principales motivaciones para que pudiera terminar mz carrera.

A toda mi familia, principalmente a mis abuelos Ignacio Hernández y Angélica Ortíz ya que sin ellos no hubiera podido llegar a ser lo que soy y lograr lo que tengo.

A Edith por haber sido parte importante de este logro, por todo su cariño, apoyo y comprensidn en esta etapa tan importante de mi vida.

A la familia Enrlquez Ovando por su amistad apoyo y motivación, sobretodo a Araceli por su gran amistad y todo el apoyo brindado en momentos dificiles no sólo de la carrera.

Everardo Misael

UNIVERSIDAD AUTONOMA M~ROFOLITANA "VTAPALAPA"

1

INDICE GENERAL Pag.

PROYECTO DE INWSTIGACI~N “Biblioteca de funciones gráficas para Turbo C y graficación poliedral Objetivo general Objetivos particulares Justificación Requisitos

4 5 6 6 7 8 8 8 9 9 so 10 10 10 10 11 11

PARTE 2 6 6 ~ ~ ~ ~ ~ ~ ~ ó ~ DE LAS FUNCIONES GRÁHCAS DE LA BIBLIOTECA GVESA256” 13 Libreria de funciones gráficas GvESA256 14

Introducción 14 El ambiente para la programación 14 Requerimientos 14

Descripción de las funciones 15 bar() 15 circle() 16 cleardevice() 57 clearviewport() 17

UNMRSIDAD AUTONOMA MElROPOLITANA ‘VTAPAMPA”

11

BIBUOlEeA DE FUNAEIONES GRAHGAS Y GRARGAAEION PWEDRAL

drawPoly0 ellipse() fillellipse() fillPOlY0 flodfill() getgraphmode0 getmaxcolor() getmaxx() getmaxyo getpixel() getxo getyo - Hline() initgraph() line() linerel() lineto() ... . . .

moverel() .;Y.

- Vline()

PARTE 3 "DESCRIPCI~N DE LAS FUNCIONES PARA LA GRAFICACI~N POLIEDRAL"

Técnicas de despliegue tridimensional Proyección en paralelo Proyección en perspectiva draw_3d()

drawP3d() proyectaquntos() trasladar() rotar() cornparaglanos()

Manual técnico

19 20 21 22 23 25 26 26 26 27 27 27 27 28 28 28 29 30 30 30 30 31 31 32 32 32 32 32

33 34 34 34 34 35 35 35 36 36 37

UNlVLRSlDAD AUTONOMA METROPOLITANA 'UTAPALAPA"

m 111 ...

PROYECTO DE INMSllGAClON Caalb*tldtm

BIBLIOTECA DE FUNClONES GRAFICAS Y GRAFICACION PWEDRAL

PARTE 4 “ELEMENTOS DE COMPILADORES PARA IMPLEMENTAR LA FUNCIÓN EVALUADORA DE PUNTOS” 38 Descripción de las funciones para generación de puntos a gráficar 39 Análisis del programa fuente 40

Análisis Léxico 40 Análisis sintáctico 41

Análisis Léxico 42 Función del analizador léxico 43

Análisis Sintáctico 44 Función del analizador sintáctico 45

APENDICE B “EL CODIGO FUENTE DE LA LIBRERIA GRÁFICA GVESAXV vesa_getinfo() vesa_getmodeinfo() initgraph() busca-font-bios() ini-tabla-sin-cos() get_graphmode() setgraphmode() restorecrtmode() rectangle() moveto() moverel() lineto() linerelo line() - Vline()

47 48 48 49 49 50 51 52 52 53 53 54 54

56 59 59 60 61 61 61 62 62 62 62 62 63 63 63 65

UNIVERSIDAD AUTONOMA METROPOLNANA ‘IZTAPAIAPA“

iv Cgadimdlsrm

BIBLIOTECA DE FUNCJONES GRALlCAS Y GRAFICACJON POUEDRAL

APENDICE C "EL CODIGO FUENTE PARA LA GRAFICACION POLIEDRAL" definiciones de macros, variables globales y estructuras de datos utilizadas definición del punto de observación prototipos de las funciones de análisis vectorial drawP3d() cornparaglanos() transformagtos-nvo-sistema() proyectaguntos() resta-vector() suma-vector() producto-cruz() productogunto() divide-vector() normaliza-vector() magnitud()

66 67 67 68 69 70 70 70 71 72 72 73 74 75 75 75 75 76 76 77 77 78 78 78 80 80 80 80 80 80

81 82 83 83 83 85 86 87 87 87 87 88 88 88 88

U N M R S I D A D AUTONOMA MElROPOLITANA "KTAPAIAPA"

V

C a a d i m d l i BlBUOlEEA DE NNWONES GRAFIEAS V GRAFIEACION PWEDRAL

transformaciones-interactivaso getkey0 trasladar() moverglanogroyección() rotar()

89 90 90 92 92

APENDICE D "EL CODIGO FUENTE PARA LA EVALUACION Y GENERACION DE PUNTOS DE LAS FUNCIONES A GRAFICAR " 95 declaración de la estructura que contiene los tokens y su inicialización 96 prototipos de las funciones utilizadas 96 max-min() 97 busca() 98 evalua() 98

BIB1

101 102 1 04 110 110 112

113.

UNMRSIDAD AUTONOMA METROPOLlTANA "IITAPAIAPA"

PROVECTO DE INVESTIGAUON csSaabsr$dllmm

BIBUOTECA UE FUNUONES GRAFICAS Y GRAFlCA,l\aON PWIEURAI

PROYECTO DE INVESTIGACI~N

" BIBLIOTECA DE FUNClONES GRÁFICAS PARA TURBO C Y

GRAFlCACIdN POLIEDRAL "

Objetivo General:

Elaboración dc una libreria de funciones grAikas y de graficación poliedral para el estandard SVGA (VESA), con funciones altamcnte optimizadas en tiempo.

P

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

PROVECTO DE INVESTIGACION h*dlkIW

RIRUOTECA DE FUNCIONES GRAFICAS V GRAFICACJON POLIEURAL

Justificación:

- El Turbo C para DOS no cucnta con ta l librería de funcioncs . - El proyecto es altamcnte fonnati\,o. - El producto final scrá útil cn el desarrollo dc futuros proyectos de investigación relacionados con la graficación por computadora.

S

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

2

PROYECTO DE INMSTIGACION caaaimalt i i

BIBUOECA DE FUNUONES GRAFICAY Y GRAFICACION POLIEDRAL

S Requisitos:

- Serán necesarios conocimientos profundos de programación en “C“ y ensanblador. así como el manejo de interrupciones

- También será necesario usar intcnsivamente herramientas de álgebra lincal y análisis vectorial

- Para el desarrollode dicho proyecto. serán necesarias computadoras -186 o superior . con tarjeta de video SVGA y monitor SVGA, cornpatiblcs con el cstandard VESA.

S

S

UNIVERSIDAD AUTONOMA METROPOLITANA “ITTAPAIAPA”

i

S

PROVECTO DE INVESTIGACXON RIBUOTECA DE FUNUONES GRAFICAS Y GRAFKACION POUEDRAL

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPALAPA"

4

PROYECTO DE INWESTIGAUON CSnaMdtmpo

BIRLIOTEGA U€ NNCIONES GRAFICAS Y GRAFlGAClON PWEDRAL

Breve historia

Cerca de los SOs la grafcación solo cubría algunos de los campos especializados, ya que el hardware era muy costoso y las apliccaciones eran pocas. Entonces las computadoras personales con "rasters grafkos" integrados, como Macintosh y el IBM PC, popularizaron el uso de mapeo de bits. Un mapeo de bits es una representación de "ceros" y "unos" de un arreglo de puntos llamados pixeles sobre la pantalla. Esto dló lugar a que las aplicaciones pronto progresaran. Ello permitió a millones de usuarios un control simple, bajo costo en los programas de aplicación, tales como hoja de cálculo, procesadores de palabras y programas de grafcación.

El concepto de "dessktop" vino a mejorar la organización del espacio en la pantalla con ayuda del mouse. Hoy en día todos los programas interactivos permiten interfaces de este tipo para visualizar y manipular la aplicación especifica. Esta manera de comunicación gráfka usada viene revolucionado la interfaz de las computadoras modernas y probablemente es la mas grande contribución de los gráfkos por computadora y será por

UNNERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

S 5

PROVECTO DE INMSTIGACION 5

RlBLlOTEGA DE FUNClONES GRAFKAS Y GRAFICACION POLIEDRAL

INTRODUCCI~N A LOS GRÁFICOS POR COMPUTADORA

Los gráfkos por computadora es uno de los campos mas interesantes y que crece mas rapidamente dentro de la computación. Algunos de los sistemas de computación mas complejos que se usan hoy en día estan diseñados para la generación de despliegues gráiicos. Se conoce el valor de una figura como eficaz medio de comunicación, y la capacidad de conversar en forma grái3ca con una computadora está revolucionando la forma en que las computadoras se están utilizando en todas las áreas.

Las gráfkas están seguramente cerca del tope de la lista de ventajas de la revolución de las computadoras. Cada una de sus aplicaciones es muy útil y estas ayudan a justificar el costo de la computadora. Es claro que los gráfícos tienen que desarrollarse mucho mas ya que el futuro es alentador. Nuestros ojos son nuestra ventana a dispositivos y día con día muchos usuarios conocen lo fantástico de las grM1cas. Los gráfkos son lo más disfrutable y muy cerca de ser uno de los mas importantes aspectos de las computadoras.

En su corto tiepo de vida las gráfkas tienen atraidas a las personas creativas del mundo. Estas personas

Los diseñadores de automóviles, aviones, naves espaciales y barcos, utilizan técnicas CAD en el diseño de varios ti6os de vehículos. Los trazos con estructuras de alambre, se utilizan para modelar componentes individuales y planear perfiles de Superficies de automoviles, aviones, naves espaciales y barcos. Las secciones de superficies y componentes de vehículos pueden diseñarse por separado y conjuntarse para exhibir el objeto en su totalidad. A menudo se corren simulaciones de la operación de un vehículo para probar su rendmiento. Producciones realistas permiten al diseñador observar como será el producto terminado.

Los diseños de edificios también se crean con sistemas de grafkación , los arquitectos diseñan ineractivamente planos de pisos o plantas, dispocisiones de puertos y ventanas y la construcción integral de un edificio. Trabajando a partir del despliegue visual del proyecto de un edificio, el diseñador electric0 puede

UNIVERSIDAD AUTONOMA METROPOLITANA " I A A P A U P A "

6

PROVECTO DE INYESTIGACJON [ a a h d l m

RlBLlOTECA UE FUNClONES GRAflCAS Y GRAflCAClON PWEDRAL

experimentar dispocisiones del cableado. torna de corrientes de electricidad y sistemas de prevención de incendios. La utilkación del cspacio cn la oficina o en la fábrica se planea utilizando paquetes de gráficas especialmente diseñados. Los diseños de edificios en tres dimensiones. permiten a los arquitectos estudiar el aspecto de un solo edificio o de un grupo de ellos como una universidad o bien un complejo industrial. Mediante paquctes de gráficos complcjos, los disefiadores pueden realizar un recorrido simulado atravéz de las habitaciones o por los exteriores de edificios para apreciar mejor cl efecto integral de un diseño particular.

Gráficas diagramas y modelos.-

Muchas aplicaiones de graficación de datos de ocupan de la graficación de alg6n tipo de información geográfica. Con frecucncia tales graficas se usan para exhibir diferentes tipos dc estadísticas regionales o globalcs. corno la graficación de datos sobre ventas en \,arios distritos. Los programas disefiados para producir mapas clin~atológicos pueden tomar datos de estaciones de observación individuales para originar grhficas. Se disponc de programas cartogrhficos para generar mapas de algunas Areas geogrhficas o del mundo entero. Algunos de cstos programas permiten sombrear o colorear las dhcrsas áreas geográficamente que clcgirA cl usuario y algunos pcrmiten separar secciones para destacarlas.

S

UNNERSIDAD AUTONOMA METROPOLITANA "ITTAPAMPA"

7

PROVECTO DE IMXTlGAClON Cara&rhdiimp,

RlRLlOTECA UE FUNCIONES GRAFKXS Y GRAFIMCION POUEURAL

Arte por Computadora.-

d as aplicaciones creativas y comerciales del arte hacen uso intenso de las gráfícas de computadora. La exhibition abstacta se crea grafcando una serie de funciones matematicas en Varios Colores. LOS programas de pincel permiten a los artistas crear pinturas en la pantalla de un monitor de video.

En realidad el artista podría hacer una pintura en una "Tableta de Gráficas" usando un estilo de entrada. Tambien se usó un programa de pincel para crear caricaturas, también se utilizan para producir la clase de arte que se aprecig en muchas partes.

El arte generado por computadora se usa ampliamente en aplicaciones comerciales. Los logotipos y dlseños publicitarios de TV ahora se producen comúnmente con sistemas de gráficas. Además los programas de gráficas se han elaborado para aplicaciones de procesamiento de publicaciones y palabras, que permiten combinar operaciones de grafcación y edición de texto.

En algunas aplicaciones de capacitación, se diseñan sistemas especiales. Algunos ejemplos de estos sistemasgspecializados.son.10~ -simuladryes para ,capacita a capitanes ~e.t>arcos-pilot~ p de aviones. Un tipo de simulador de vuelo, .m,uGtra algun+.escen@que.&eden 'presentarse .*a un pitoto qu&.opeTa un avión. Otro tipo de simulador es el d6 'conducción 'de automovil, ' este s e 'emplea para investiwr reacciones 'de los conductores en situaciones críticas. Dichos resultados se utilizan despues como base de optimización del diseño del vehiculo con el objeto de maximizar la seguridad en el transito.

. . .. . . .. .;, . :: .

Interfaces con el Usuario de Gráficas (GUI).-

Las opciones de entrada a muchos programas de computadora se diseñan como un conjunto de íconos, simbolos gráficos que se @wen a la opción de procesamiento que deben representar. Los usuarios seleccionan opciones de procesamiento señalando el ícono adecuado. La ventaja de estos sistemas es que los íconos pueden ocupar menos espacio en la pantalla que la descripcion textual correspondiente de las funciones y pueden entenderse más rápidamente si están bien diseñados. En estos programas, el proceso de aííadlr un elemento a un archivo, gaveta de archivo o carpeta de archivo. La supresión de un archivo puede representarse con un icono de bote de basura. Una señal de alto puede representar una operación de salida y un dibujo de regla puede utilizarse para ajustar márgenes de un texto. Los íconos son útiles en muchas aplicaciones.

UNNERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

S

8

PROVECTO DE INMSTIGAUUN Ihecaatadlierpo

BIBLIOTECA DE FUNCIONES GRAFICAS V GRAFICACAUN PWEDRAL

Gráficas para uso doméstico.-

Un uso importante de las gráficas de computadora en aplicaciones del hogar es en los juegos de video. Todos estos juegos emplean métodos de gráticas en una forma u otra. Algunos sistemas despliegan g r á f k ~ ~ en pantallqntegradas, pero muchos están diseñados para conectarse a un aparato de TV.

Con la creciente popularidad de las computadoras personales y las capacidades de grafkación cada vez mayores de estos sistemas , las aplicaiones de las grS1cas en el hogar se han ido extendiendo constantemente. Las computadoras personales permiten al usuario doméstico generar gráiicas financieras, de conteo de calorias o bien para crear diseños, tarjetas de felicitación sobres de cartas fabricados, etc.

Procesamiento de imágenes.-

Los rastreadores de medicina nuclear recogen datos digtales de la redioacción emitida por radionúclidos ingeridos e imágenes gráfkas codificadas en color. Los métodos ordinarios también se usan en aplicaciones médicas para modelar y estudiar funciones físicas y en diseño de extremidades artificiales.

Muchos otros campos hacen uso de técnicas de creación de imágenes, para generar dibujos y analizar datos reunidos, por ejemplo grafkación de datos llamados solares, se reconstruyen galaxias a partir de observaciones

S

UNIVERSIDAD AUTONOMA METROPOLITANA “IAAPAUPA”

9

PROVECTO DE INMSTIGAUON capaatrwdt~

BIBLIOTE(.A DE FUNCJONER GRAFICAS Y GRAFlCAClON POLIEDRAL

astronómicas colectadas y dispuestas en grandes bases de datos. Sería posible continuar con la lista de aplicaciones, pero esto1 ejemplos son suficientes para indicar la gran amplitud de aplicaciones prácticas.

En resumen , la generación y el control de imágenes requieren conocimientos en muchos campos de computación, desde el detallado conocimeinto de Hardware especial, la presentación y programación orientada a objetos. El propósito escencial de la graficación es generar y manipular imagenes graficas.

Niveles de Interactividad

En un sistema gráiico existen tres niveles de interactividad, los cuales son:

* Nivel funcional * Nivel procedimental * Nivel dispositivos

. . . . . . . . . . . . . Nivel funcional.- .................... . . . . .,:,..,.

. . .< . . I .... ..... ,.......:. .......... :.... .. . . . . . . . . . . . . . .:... . ... ....... ....... -;,. . . . . .......... . . ....... ....: . . . .. .:. '. ..yv.. .:: . % ... . . . . .

.. .... . . . .....;y.'.<... :.':.~ .:..><::

El nivel mas alto es $l'#&l funciond:ii;;Es este l&j~am8;idos son:,$x@~ados en terminos de requisitos gráficos. Informalmente, estcjs+qu#lstos pue&&i:.ier especi@c$&$..:,éq. ter@.&&mo: "Dibuja una figura de los

'..' ' % '. . .

.. .... .::;.:. ......... ......... ................. % ... :. .. .II\, ,: . . . . .

..,:,:..::+::. , ............. -: 'X ..

. . . . . . . . . . . . \ ! .

; ..,..., . .

El nivel más bajo es el nivel de dispositivo.. Este es el nivel donde las escenas actuales son generadas. Dsposltwos gráfífic.0~ (seg9idci s e ,refie;'$. al"li+dwar$)'son .$aturataente 6jasifí~dos:fi dwgrUpos, de entrada y de salida, donde el puntii'de .re€&re$cia.e+, la Foniputidot;ti.Ei dispo$itivb.,&&ntrada provee datos a la computadora mientras que los de salida generan imágenes gráficas de los datos almacenados o generados por la computadora,

. . . . ~ ;.

Dispositivos de entrada- Este tipo de dispositivos se reducen a dos clases: Aquellos que son manipulados por el usuario por ejemplo, mouse, lápiz electrónico, touch screen (tabla sensitiva montada sobre la pantalla) la interacción no requiere de conocimiento de programación solo un poco de conocimiento en el manejo del dispositivo, el usuario da la opción requerida solo seleccionando los botones del menú o los íconos. El otro tipo de dispositivo de entrada son aquellos que convierten imágenes reales en datos digitales, por ejemplo video cámaras y scanners ópticos.

Dispositivos de salida- Los dispositivos de salida también pueden se clasificados en dos tipos un tipo es usado interactivamente y es referido a los dispositivos de despliegue tales como monitores, el otro tipo produce copias de salida e incluyen dispositivos como plotters, impresoras laser y de matriz. Aunque la atención debe ser enfocada sobre los tipos interactivos de dispositivos de salida, el uso efectivo de los dispositivos que produce copias es tambien un importante aspecto de la computación gráfka.

S

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

10

PROY TO DE INVESTlGAClW y: BIBLIOTECA DE FUNCIONES GRAFICAS Y GRAFICIClON POLIEDRAL

El mapeo de bits en un tubo de rayos catódicos monocromático,contiene un bit por pixel y el mapeo de bits completo para una pantalla de este tipo con una resolución de 1024 x 1024 pixeles es de solo 220 bits o cerca de 128 Kb. Algunos sistemas contienen 8 bits por pixel permitiendo 256 colores simultaneamente, sistemas mas costosos tienen 24 bits por pixel permitiendo opciones de 16 M de colores, otras computadoras ofrecen 32 bits por pixel y resolución de 1280 x 1024 pixels de los cuales 24 bits son usados para representar color y 8 para propósito de control. Un sistema de color típico de 1280 x 1024 pixels con 24 bits por pixel requiere 3.75 Mb de RAM.

Hace 50 años se requerían bastantes recursos para producir figuras monocromaticas. Ahora con solo unos $2 O00 dls, podemos dibujar sólidos de 256 colores (o más) en muy poco tiempo.

Los dispositivos gráfkos de hoy son altamente complejos y pueden los mismos contener software de complejo multiprocesamiento, largos sistemas de memoria y procesadores paralelos o pipeline. A causa de la naturaleza de la interacción (tiempo real) la velocidad de procesamiento es una importante consideración para los diseñadores de software y esta velocidad es muy influenciada por la utlización de facilidades del nivel de dispositivos. Esto es muy dificil para discutir en terminos generales, ya que la gran variedad de funcionalidad encontrada en el nivel dispositivo es diferente en cada sistema.

. . . ... .:I,. ;, . .,-. . ....... . . . . . . . . . . : , ::.,: :::.;., . . . . . . . . . . .................... Nivel pr8cedimental.- . . . . . . . . . . . , ..I . , . . , :.: . . ..... .., ........ . . . <:..: < . .

......................... ..... ... :.: . , . . . . . . . . . . . . . . . . ;. .~ :::::. .: . . . . . I

~. . < . . :. . j . .. . . . .... ... . . . . . . . .

Este nivel incluye:;::&$idfitk6s especlaies que eficientemente y procediqq$w::q& incluyen est& algorit juega un papel i m p o r t a n t ~ ~ ~ i t ; ~ ~ ~ ~ ~ ~ e n ~ ~ ~ . de nuevos algol creación de nuevos alg?r@x?.&.+ alt&&l. Otro importa estructura de la base:.::&:.:datds grSi$q'::t@pbién influye. ........ :.:<:: .. '>. ...... ;...: .... ~., . . complejidad de procei@WUijs gr~~lcor&~~:~;:.::"..

, ::;>::: 2'.' '. '

..... :,,.:>:,:.~

.%.% ,:.,. :: c 'I

....... :';,~::.:%

. . . . . . . . . . . . . . . . . . . . . . . . . I . . . . . . . .

En resúmen los tres niveles de un sistema gráfko, la base de datos así como el sistema operativo de la computadora juegan un papel muy importante en la comunicacion de los elementos del sistema y el usuario.

Ventajas de gráficos interactivos

Los gráfkos proveen uno de los mas naturales conocimientos de comunicación con computadora, esta es capaz de procesar los datos rápida y eficientemente.

En muchos diseños, implementaciones y construcción , la información que puede proporcionar es virtualmente omportante. La visualización científica es muy importante, cuando científicos e ingenieros realizan lo que ellos no podrían interpretar de las cantidades enormes de datos que producen las supercomputadoras.

S

Las gráficas son el más importante conocimiento de producir imágenes, desde la invención de la fotografía y la televisión. Estas tienen una ventaja adicional , que con las computadoras podemos hacer imágenes reales de objetos, y además cosas abstractas y de datos que no tienen geométria inherente.

Con movimiento los objetos pueden ser colocados con respecto a un observador estacionario. Los objetos pueden ser también estacionarios y el observador puede moverse alrededor de ellos, seleccionar una porcion de ellos para observarlos, ver al objeto con mayor o menor detalle, o mover al objeto con determinada velocidad y

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

11

PROVECTO DE INMPTIGACAON BIBLIOTECA DE FUNCIONES GRAFUAS Y GRAFICAUON POLIEDRAL

observar sus reacciones. En muchos casos el objeto y el observador se mueven simultaneamente, por ejemplo en un simulador de vuelo, el cual combina el movimiento del avión, con los movimientos de los objetos que se encuentran debajo de el.

Con la actualización dinámica se logra el actual cambio de las figuras, el color y otras propiedades del objeto, tales como sombra, etc conforme al movimiento que éste tiene , o a los diferentes cambios que hay en su alrededor.

La grafcación interactiva permite un alto grado de interacciones, las cuales desarrollan aún mas nuestra habilidad de comprender aún mas datos y visualizar imágenes reales, abstractas o imaginarias de objetos.

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPAMPA"

12

PROVECTO DE INMSTlGAClON IhsSeMdlWl

BIBLIOTECA DE FUNClONES GRAFICAS Y GRAflCAClON POLIEDRAL

DESCRIPCION

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

13

PROVECTO DE INVESTlGAC'JON I h ~ a l t ~

BIBLIOTECA DE FUNCIONES GRAFICAS V GRAFICACION POLIEDRAL

LIBRERIA DE FUNCIONES GRÁFICAS GVESA256

Para programadores de Turbo C/C++ Abril de 1995.

La Video Electronics Standar Association (VESA) a desarrollado un conjunto de extensiones BIOS el cual estandarizo el ambiente gráiico Super VGA (SVGA). La libreria gráfka GVESA256 proporciona a los programadores de Turbo C/C++ las herramientas necesarias para manejar un adaptador de video corriendo con el estandar VESA Ver. 2.1.

El nombre "GVESA256" refleja el hecho de que esta libreria fue realizada fundamentalmente para soportar estandar

EL AMBIENTE PARA LA PROGRAMACI~N

definidos en el

Requerimentos de Hardware para el ambiente WSA:

La libreria gráfka GVESA256 trabaja con cualquier computadora IBM PC, XT, AT o compatible equipada con un adaptador de video Super VGA y un monitor con capacidades similares a 256 colores y un adecuado driver para las extensiones de la BIOS VESA. Un coprocesador matemático no es requerido; sin embargo si lo tiene , esta libreria sacará provecho de él.

Incluir el archivo de cabecera:

a UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPALAPA"

14

PROVECTO DE INVESTlGAClON cssSs3ertaallerp3

RIBLIOTECA DE FUNUONES GRAFICAS Y GRAflCAUON POLIEDRAL

El archivo GVESA256.H es usado como un archivo de inclusión (Include File) durante el desarrollo de cada programa; ya que este archivo incluye todos los prototipos de las funciones y este define los parámetros gráfkos gobales que describen el adaptador de video especifico instalado en la PC.

Los parámetros gráfkos globales son inicializados por la función initgraph( ), por lo que debe asegurarse de llamarla en primer lugar para que puedan utilizarse correctamente las demás funciones.

Nota:

cuando usa el IDE de Turbo C), ya que es una o la otra, no ambas. incluir esta libreria y su programa, debe deshabilitar la libreria gr%ica de Turbo c graph1cs.h (esto

DESCRIPCION DE LAS FUNCIONES

void bar(lefl,top,right, bottom)

entrada: int left,top,right,bottom regresa: Nada descripcion: La función bar0 dibuja una barra rectángular, cuya esquina superior izquierda

está definida por Zejttop y la esquina inferior derecha está definida por right, bottom La barra se rellena con el color de relleno actual especificado por setfillcolor(). No se traza el contorno.

ejemplo:

S Este ejemplo dibuja un tablero de barritas de diferentes colores

UNIVERSIDAD AUTONOMA METROPOLITANA “LZTAPAIAPA”

15

PROVECTO DE INVESTlGAClON cSre&3UdIlsrm

BIBLIOTECA UE FUNCIWES GRAFICAS Y GRAFICACION POCIEURAL

#include <gvesa256.h> #include <stdlib.h>

main0 { int i j ;

clrscro; initgraph(Ox103);

rectangle(O,O,getmaxxO,getmaxyO); rectangle(3,3,getmaxx()-3,20);

void circle(x,y,r) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . entradi: . .,, ;. .i int.3 9 r: i'' '.'. " . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , . . . .

:I.

, . . I

. . . . . . . . . . . . . . . ~ : ' '. ' . . . . . .

. . . : . . . . . . . . . % . 3 , . , . . . . . . . . . . . . . . . . . .

. x . . . . . . . Nada." .: . . . . . . .. ' " ' . . . . . . . . . .. . . . ~ . regresa: '

descripción: La función circle0 dibuja un circulo con centro en x,y de radio r (en pixeles)

I

con el color de dibujo actual.

ejemplo:

Este ejemplo dibuja circulos concentricos de dlferentes colores.

#include <gvesa256.h> #include <conio.h>

main0 g

{ int i;

I clrscro; initgraph(Oxl05);/* poner modo grafico de 1024~768x256 */

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

16

S

PROVECTO DE INMSTIGAUON CS?ddiE#Jdtsnpo

BIBLIOTECA nE FUNCIONES GRAFMAAS v GRAFIC~UON POLIEORAL

rectangle(O,O,getmaxxO,getmaxyO); rectangle(3,3,getmaxx0-3,20);

for(i=O;i<=getmaxy0/2-25;i++) { setcolor(i); circle(getmaxx0/2,getmaxy0/2,i);

f

outtextxy((getmaxx0/2)-120,9,"CUALQUIER TECLA PARA TERMINAR..."); getcho;

1

va la

void clearviewport(void)

descripción: La función clearviewport0 limpia la ventana gráfka activa (el viewport) y la desaparece, restableciendo como nueva ventana grafica a la pantalla completa.

ejemplo: Este ejemplo muestra el uso de las funciones cleardevice() y clearviewport(), así como

setviewport(). Dibuja puntos en toda la pantalla crea un setviewport0 en el centro escribe texto luego limpia el viewportc(clearviewport()) a continuación limpia la pantalla completa (cleardevice()).

#include <gvesa256. h> #include <stdlib. h> #include <time.h>

I { main()

UNIVERSIDAD AUTONOMA METROPOLITANA " I ~ A P A I A P A "

17

PROVECTO DE INMSTIGACION CsssUtiWbdtlsrm

BIBLIOTECA DE FUNCIONES GRAFICAS V GRAFIGICION P W W R A L

int i,x,y,c=O; int figura[20];

clrscr(); initgraph(Ox103);/*modo 800x600~256 */

randomize();

cleardevice(); rectangle(O,O,getmaxx(),getmaxy()); rectangle(3,3,getmaxx()-3,20);

outtextxy(getmaxx()/12,9,"Ejemplo drawpoly()"); outtext~y((getmaxx()/2)-60,9,"CUALQUIER TECLA PARA CONTINUAR.. .");

outtextxy(25,100,"Cualquier <<tecla>> para activar"); outtextxy(25,120,"cleardevice() 'borra la pantalla'"); outtextxy(25,140,"y terminar.");

getch0; cleardevice(); delay(2500);

. . . . . . . . . . . . . . . . . . . . . . . . ... . . . I . . . . . , . . . . . . . . . . . . . . . '. I

. I

... : < . . . . . . . . . . . . . . . . . . . . . . . : . .

. . . . . . . . . . . . . . . . 1 . . . . . . . : > '.

UNIVERSIDAD AUTONOMA METROPOLITANA "IZTAPALAPA"

18

PROVECTO DE INMSTIGACNMI k3SstrtadtW

BIBLIOTECA DE FUNCIONES GRAflCAS Y GRAFICNION POLIEDUAL

void drawpoly(num,vertices)

entrada: int num, int *vertices. regresa: Nada. descripción: La función drawpolyo dibuja una polilínea de num vertices donde cada vertice

de la pollínea está especificado en el arreglo de vertices vertices, el tamaño del arreglo vertices debe ser de por lo menos 2xnum.

La polilínea se dibuja con el color de dibujo actual.

Sjemplo: Este ejemplo dibuja polilíneas aleatorias de 10 segmentos con colores diferentes cada vez.

Yinclude <gvesa256. h> Yinclude <stdlib. h> &include <time.h>

main() ............ . . . . . . . . . . . . : : ,; ~, . . . . . { . .j ...... \: . . . . . . . . . , I . . I.:::: .:.: Y;.:.. .

. . ' . . ..,.... . . ' . .

int i,x,y; int figura[20];

........................ . . . . . . '.,;..:%:%:., ............ : , ...... \. . . . . . . , ....... . ' . ' . . . . .:.::.,:, ..,.'' . %.... . . . . . . . . . . . . . . . . . . .................. . :, . .~ .. :. . . . . . . . . . . . . . . . . . . . . . . . . ,, ., , . < ~ .>

..:. ....... i. .... .,:.,;,;.:::: :.

outtextxy(getmaxx()/12,9,"Ejemplo drawpoly()"); outtextxy((getmax~()/2)-60,9,"CUALQLJ€ER TECLA PARA,CONTINUAR.,,"); . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . S

. . . . . . , .

. . . . . . . . . . . . . . . . . . . . , : I . .

' . . . . : . . . . . . . . . . . . . . . . . . . . . . . . . . . .: . . . f o r ( ~ ~ o ; ~ < l ( j ; ~ + ~ ) ~ . . ~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

: > . .: . . . . . . . . . . .

x = random(getmaxx()- I O); y = random(getmaxy()- 1 O);

1f(x<3 1 1 y<25){ x+=8; y+=25;

I figura[2*i] =x; figura[2*i+ 11 =y;

setcolor(random(getmaxcolor())); drawpoly( 10,figura); delay(2500);

}while(!kbhit());

1

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

S 19

cssaatntadtisrm BIBLIOTECA DE FUNCIONES GRAFICAS Y GRAFICACION PWEDRAI

- #incl #incl

void ellipse(x,y, ini,jin,rx,ry)

S

entrada: int x,y,ini,fin,rx,ry. regresa: Nada. descripción: La función ellipse() dibuja una elipse centrada en x,y desde el úngulo ini hasta

el úngulofin de radio rx para el eje x y de rado ry para el eje y.La elipse se dibuja con el color de dibujo actual.

comentario: La sección de la elipse que se dibuja está detreminada por los ángulos ini y fin,por ejemplo para dbujar una elipse completa centrada en (1 00,100) ,de radio horizontal 100 y de radio vertical 70, introducir ini=0 y fín=360.

O Ahora para dibujar una sección de elipse (la cuarta parte de la elipse en el

primer cuadrante) introducir ini=0 y fín=90.

#include <time. h>

main() { int x,y,c;

. . . . . . . < . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ ..:

. % . :. . . . . . . . . . . . . . . . . . . . . . . . .. ;. 1 . , , . .

. . . . . ... . . . . ' . . . . . . . . . . . . . . . :

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :. ...

. . . . . . . . . . . . .

.. ,

. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. .

clrscr(); initgraph(Ox103);

randomize();

rectangle(O,O,getmaxx(),getmaxy()); rectangle(3,3,getmaxx()-3,20);

outtextxy(getmaxx()/12,9,"Ejemplo: ellipse()"); outtextxy((getmaxx()/2)-60,9,"CUALQUIERTECLA PARA CONTINUAR...");

for(x=3,y=2,c=0;x<260;x+=20,y+=1O,c+=25)

setcolor(0); /* color negro de dibujo */ ellipse(getmaxx()/2,getmaxy()/2+220-c,0,36O,x,y);

getch0; S

...

UNIVERSIDAD AUTONOM METROPOLITANA "ITTAPAMPA"

20

PROVECTO DE INVESTIGACION 818LIOTECA DE FUNCIONES GRAFICAS V GRAFICACION POLIEDRAL

for(x=3,y=2,c=0;x<260;x+=20,y+=1O,c+=25) ellipse(getmaxx()/2,getmaxy()/2+220-c,0,36O,x,y);

setcolor(5); for(x=3,y=2,c=0;x<260;x+=20,y+=lO,c+=lO)

ellipse(getmaxx()/2,getmaxy()/2+ 1 OO-c,0,36O,x,y);

void Jillellipse(x,y,rx,ry)

#include <gvesa256.h> #include <stdlib. hi. '. . . % . . . . ..

#include <math.h> .. .; . ., . ., .. ii .: . . . . . . . I . . . . , . . . .

. .

main() { int i,c=O; float x,y;

clrscr(); initgraph(Ox105);

rectangle(O,O,getmaxx(),getmaxy()); rectangle(3,3,getmaxx()-3,20); outtextxy(getmaxx()/12,9,"Ejemplo: fillellipse()"); for(isO;i<760;i+=20){

setcolorEíll(c++); x = R*cos(i*M-PIASO) + (getmaxx()/2); y = R*sin(i*M_PI/lSO) + (getmaxy()/2);

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPALAPA"

21

PRO CTO DE INVESTIGAUON 5 BIBLIOTECA DE FUNCIONES GRAFlCAS Y GRAFICAUON POLIEDRAL

fillellipse(x,y,100,50); setcolor(c+ 1); outtextxy(x-25.y,"HOLA"); delay(600);

1

fillellipse(x,y,100,50); setcolor(0); outtextxy(x-45,y,"! ! ADIOS ! ! 'I); setcolor(5); outtextxy((getmaxx()/2)-60,9,"CUALQUIER TECLA PARA CONTINUAR.. . "); getch0;

I cada el

Este ejemplo dibuja poligonos aleatorios y los rellena cada vez con colores diferentes

#define N 20

main(void) { int i,x,y,c=l; int figura[N];

clrscr(); initgraph(0x 103);

P

randomize(); do{ cleardevice(); setcolor(l5); /* color de dibujo blanco */

UNIVERSIDAD AUTONOMA METROPOLITANA "ILTAPAIAPA"

22

U

PROVECTO DE INVESTIGACION CaCedlWbdlWtl

BIBLIOTECA DE FUNCIONES GRAFICAS V GRAFICACION POCIEDRAL

rectangle(O,O,getmaxx(),getmaxy()); rectangle(3,3,getmaxx()-3,20);

outtextxy(getmaxx()/12,9,"Ejemplo fillpoly()"); outtextxy((getmaxx()/2)-60,9,"CUALQUIER TECLA PARA TERMIN m...( ESC)");

for(i=O;i<N;i++){ x = random(620); y = random(470); if(x<3 1 1 y<25){

x+=3; y+=25;

1 fígura[2*i] = x;

u fígura[2*i+l] = y;

entrada: int x,y,borde. regresa: Nada. descripción: La funciónfloodfll0 rellena un objeto con el color de reelleno actual,

dadas las coordenadas de cualquier punto interior al objeto especificadas por x,y U y el color de su borde (el color de las líneas o arcos que forman el contorno del objeto).

comentario: Es necesario asegurarse que el objeto sea completamente cerrado, porque de lo contrario producirá resultados inesperados(tal vez el área exterior también se rellene). El color de relleno se puede cambiar mediante setfillcolor().

ejemplo: Este ejmplo dibuja un paisaje de noche "El mar, la montaña, la luna.. ......

#include <math.h> #include <stdlib.h> #include <conio.h>

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

23

PROVECTO DE INVESTlGAClON BIBLIOTECA DE FUNCIINES GRAFICAS Y GRAFICACJON POLIEDRAL

#include <time.h> #include <gvesa256.h>

#define MAXSIZE 1000

const int MAXLEVEL = 6; const int WATER = 1; const int SUN = 2; const int SKY = 31:

double frctl[MAXSIZE];

subdivide(int p1,int p2,double std,double ratio) { int midpnt; double stdmid;

S

. . . . . . . . . . ;.. . . . . . . ' . . \ ... >',' ..... ...... . . . . . . .

frctl[midpnt] = (frctl[pl] +.,fr$d(pg stdmid = std*ratio; subdivide(pl,midpnt,stdm$x&i& .,, <,;: .s... '::

subdivide(midpnt,p2,st1&.iiQ&ii);

:.:;." . , . , . ........... .. .,.\ ll

... <...: . . . :.::::,. ,%

. . . . . . . . \ .....

a . . . . ;;.: ,+<:..,:.. ..:.. '' :x<;,:;., i.. ;.::;;:

c int first,last; double ratio,std; . . . . . % . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

first =O; . , " . .; . . : . : ' . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . ... . . . . ..... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , .I ' :; 1. I

. . . . . . . . . . . . . . .:

. . . . . . . . .~ . . .: . % . . . . . . . . . . . . . : ~ .:. . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . \ .

S last = (int)pow(2.O,(double)maxlevel); frctl[first]=yl; frctl[last]=y2;

ratio = 1.0 I pow(2.0,h); std = scale * ratio; subdivide(first,last,std,ratio); }

draw-fractal() { int i,x,xinc,l;

1 = (int)pow(2,O,(double)MA xinc = getmaxx() / 1*3 / 2;

XLEVEL);

UNIVERSIDAD AUTONOMA METROPOLITANA "IflAPAMPA"

24 S

PROVECTO DE INMSTlGAClUN c a p a ~ d l ~

BIBLIOTECA DE FUNClONES GRAFICAS V GRAFICAClON POLIEDRAL

moveto(0,lOO); for(i=O,x=O;i<l;i++,x+=xinc) lineto(x,(int)frctl[i]);

1

main() { c

initgraph(0x 1 O 1); randomize(): setcolor( 1); rectangle(O,O,getmaxx(),getmaxyO);

int getgraphmode(void)

entrada: Nada. regresa: int modo vesa. descripción: La función getgraphmode0 devuelve el modo de video VESA actual.

Solo funciona después de haber llamado ainitgrapho.

comentario: El valor devuelto corresponde al que asocia la BIOS con ese modo de video (el valor devuelto es un número hexadecimal, por ejemplo, 0x101 ,Ox 103,etc). El valor devuelto puede ser uno de los siguientes, definidos en GVESA256.H:

S UNIVERSIDAD AUTONOMA METROPOLITANA "1AAPALAPA"

25

PROYECTO DE INVESTIGACION DlRLlOTECA DE FUNCIONES GRAFICAS Y GRAINAClON POLIEDRAL

S

MODO GRFICO VALOR RESOLUCION

VESA OX100 640X400X256 VESALO 0x101 640X480X256 VESAME OX103 800X600X256 VESAHI ox105 1024X768X256 VESAPLUS OX107 1280X1024X256

NOTA: Una tarjeta de video puede soportar cierto modo de vido, pero el monitor no y viceversa, por lo que hay que verificar tales datos en la documentación respectiva del monitor y la tarjeta de video. Aunque esta situación la detecta la función initgraph().

int getmaxcolor(void)

entrada: Nada. .regresa: . . . . int.maxX . . . . . . . .: . .:: . . . . . . . . . . . . . . . . . . . . . . . .

:[email protected]ón.:,: La’funclon get&() &vuel&;el may& VSor v&ltdo:&$la coordenada “x” en

. . . . . . . . . .; : I ’.’ . . , :. % .

. . . . . . . . . . . . . . . . . . . .~ . . I .er .mod’o ~slco’vEs.A~ actual, : . . . . . . . . . . ,

int getmaxy(v0id)

entrada: Nada. regresa: int maxY. descripción: La función getmayo devuelve el mayor valor válido para la coordenada ‘y’ en

el modo gráfko VESA actual.

S

UNIVERSIDAD AUTONOMA METROPOLITANA “IAAPALAPA”

26

PROYECTO DE INMHTlGAClON cssS%N8-hdtSrm

BIBLIOTECA UE FUNCIONES GRAFICAS Y GRAFICAClON POLIEORAL

entrada: int x,y. regresa: unsigned valor-de-color. descripción: La función gelpixel0 devuelve el valor del color del pixel situado en la

coordenada especificad en x,y.

comentario: La posición es con respecto a la ventana gráfica actual.

int g&(void)

void _Hlineflt$,right,high)

c

entrada: int left, right, high. regresa: Nada. descripción: La función-HlineO dibuja una línea horizontal definida por [@,high

y right,high. La línea es dibujada con el color de dibujo actual (ver setcolor()).Para dibujar líneas horizontales esta función es mucho más rápida que usar la función line()

UNIVERSIDAD AUTONOMA METROWLlTANA "IZTAPALAPA"

27

S

PROVECTO DE INVESTlGAClON k a s r t a d t m

BIBUOTELA DE FUNCIONES GRAFICAS V GRAFICAClUN POUWRAL

int initgraph(mod0)

entrada: int modo. regresa: int badera. descripción: La función initgraph0 inicializa el sistema de grafkos para el estandar VESA

con el modo de la BIOS VESA especificado en modo (en hexadecimal), inicializa los parámetros y variables globales que son necesarios para que las diferentes funciones de la biblioteca gráfka trabajen correctamente.

comentario: Esta función es vital, ya que de ella dependen todas las demás funciones de la librería, por lo que debe asegurarse que siempre que quiera trabajar en modo gráfko, sea la primer función en ser llamada.

El parámetro modo debe ser un número hexadecimal y solo puede tener uno de los siguientes valores que corresponden con los valores de los modos de video de la BIOS que son las siguientes macros definidas en GVESA256.H:

void lini(lefi;top,right,bottom)., . . . . . ,I.. .:: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ......... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : . . : . . . . . . . . . . . . .

':

. . . I

I . ' . ' . ' . . . . . .

. . . . . . . . . . . . . . . . . . . \' ~ . . . . . . .. entrad&: . . . : . . . . . . . . . . . . . . . . . .~ , .

. . . . . . . .

regresa: Nada. descripción: La función line0 dibuja una línea con el color de dibujo actual desde left,top

hasta right,bottom. La posición actual (CP) del cursor no cambia.

ejemplo:

P

void linerel(deltaX,deltav

entrada: int deltaX,deltaY. regresa: Nada. descripción: La función llinerelo dibuja una línea desde la CP hasta la posición que queda a

deltaX unidades en la dirección "x" y a deltaY unidades en la dirección "y". El CP se mueve a la nueva posición (o sea CPx=CPx + d e l t a y Cpy = Cpy + deltaY).

UNIVERSIDAD AUTONOMA METROPOLITANA "ITIAPAUPA"

28

PROVECTO DE INVESTIGACION BIHLIOTECA DE FUNCIONES GRAFIUS Y GRAFICACION POLIEDRAL

void lineto(x,y)

entrada: int x,y. regresa: Nada. descripción: La función linetoo dibuja una línea con el color de dibujo actual desde la

ción actual (CP) del cursor hasta x,y. La posición actual (CP) del cursor cambia a x,y.

ejemplo: Este ejemplo muestra la función lineto()

#include <gvesa256. h> #include <stdlib. h> #include <time. h>

S

main() {

randomize();

m o v e t o ( x a = g e t ~ a x x ( ~ / ~ , ~ ~ = ~ ~ ~ m ~ y ~ ) ~ ) ; .. ci :,: ....... : : . : : setcolor(2); . .:: '. .; ..:: . , . ' , '

fillellipse(getmaxx()/2,getmaxy()/2,3,3); do{

. . . . . . . . . . . . . . '. ' ' . > . . ' . . . . . . . . . . . . . . :. : . . . . . . .

. . . . . . . . . . . . . . . . . . .

S

x = random(getmaxx()- 1 O); y = random(getmaxy()- 1 O); setcolor(random(getmaxcolor()));

if(x<3 1 1 y<25){ x+=g y+=25 ;

1

fillellipse(x,y,3,3); x a = x ; lineto(x,y); ya = y;

moveto(xa,ya);

UNIVERSIDAD AUTONOMA METROPOLITANA "IZTAPAIAPA"

29

PROYECTO DE INVESTIGACJW C a a m m d i i

BIIILIOTECA I)E FUNCIONES GRAFICAS Y GRAFICACIDN POLIEORAL

}while(getch()!=27);

1

yoid moverel(deltaX, delta y)

entrada: int deltaX,deltaY. regresa: Nada. descripción: La función moverelo desplaza la posición actual (CP) del cursor sobre la

pantalla de gráfkos a deltaX unidades en la dirección "x" y deltaY unidades en la dirección ''y".

void o,uttext(cad)

descripción: La función outtext() muestra una cadena de texto cad en la posición actual de la pantalla en modo gráiico usando los valores por defecto de la BIOS 8x16 y el color

dibujo actual. El (CP) se incrementa en la longtud de la cadena para la dirección X. En modos gráfkos no hay cursor visible, pero la posición actual (CP) en pantalla se iene como si fuera un cursor invisible.

void outtexixy(x,y,cad)

entrada: int x,y; char *cad; regresa: nada descripción: La función outtexfxy() es igual a outtext( ) excepto en que muestra la cadena

a partir de la posición que especifica x,y.

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

S

30

PROVECTO DE INVESTlGAClON CaraXMEdllfipl

BIBLIOTECA UE FUNCIONES GRAFICAS Y GRAFICAUON POLIEDRAL

void putpixel (x,y,color)

entrada: int x,y,color regresa: nada

S descripción: La función putpixel0 dibuja un pixelel color especificado por color en la posición x,y.

ejemplo: Este ejemplo dibuja puntos aleatorios de diferentes colores en toda la pantalla hasta que se pulsa

una tecla.

#include <gvesa256.h> #include <conio.h> #include <stdlib.h> main() I

setcolor(c);

}while(!kbhit@); : pufpixel(x,y,c); . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ........... . . .: . . . . . . . . . . . . . - .

i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

getcho; . . . . . . . . . . . . . . . . . . . . . . % . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . .

void rectangle @efl,top,right,bottom)

entrada: int left,top,rigth,bottom regresa: nada descripción: La función rectangle() dlbuja un rectangulo con el color de dibujo actual

definido por las coordenadas de la esquina superior izquierda (lefitop) y la esquina inferior derecha (right,bottom).

S

UNIVERSIDAD AUTONOMA METROPOLITANA "IflAPALAPA"

31

csSaW#Jdllsmr BIBLIOTECA DE FUNOONES GRAFICAS Y GRAFICACJW PUUEURAI

w i d rectangle-to(x,y)

entrada: int x,y regresa: nada descripción: La función rectangle-to() es similar a rectangle( ) sólo que aquí el rectángulo

está definido por una esquina puesta en (CP) y la otra en x,y.

void

void

D

void

restorecrtmode(void)

entrada: nada regresa: nada descripción : La función restorecrtmode() restaura la pantalla al modo de video en que se

encontraba anteriormente de la llamada a initgraph.

regresa: nada descripción: La función sercolorfill0, establece el color de relleno actual al color que se

especifica en colorfill, el valor de colorfrll puede ser desde O hasta 255.

void - Vline(column,top, bottom)

c

entrada: int column,top,bottom regresa: nada descripción: La función- VlineO dibuja una línea vertical desde column, top hasta column,

bottom con el color de dibujo actual.

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPAIAPA"

32

PROV&TO DE INWSTIGACION capa*itrtadllma

BIBLIOTECA DE FUNCIONES GRAFIUS V GRAFlCACAON POLIEDRAL

DESCRIPCION

. .

. . .

UNWERSIDAD AUTONOMA METRDPOLITANA ''ITTAPAMPA"

33

PROVECTO DE INMSTIGACION Caw~dl isrm

RIRLIOTECA DE FUNCIONES GRAFICAS Y GRAFICACJON PULIEORAL

Técnicas de despliegue tridimensional

Las representaciones de un objeto sólido en una superficie de visión por lo general contienen información de profundidad para que un observador pueda identificar con facilidad, para una visión seleccionada dada, cuales son las partes anterior y posterior del objeto. Existen varias técnicas que pueden utilizarse para incluir informaciónde profunddad en la representación bidimensional de objetos sólidos, la elección de la técnica de despliegue depende de los requisitos de la aplicación.

Proyección en paralelo.-

Función draw-3d para el manual de usuario.

P draw_3d(struct PLANOS Plan [N*M], int proygersp):

Esta función se encarga de dibujar un objeto definido en la matriz de planos. Sólo requiere como parámetros uns estructura de planos del tipo que se menciona. La opción de

proygersp, se refiere al tipo de proyección que se desea, ya sea ortogonal ó perspectiva. En caso que se desee proyección perspectiva deberá contener PERSPECTIVA, definida al inicio; en caso contrario ORTOGONAL será el valor que espere dicha función.

UNIVERSIDAD AUTONOMA METROPOLITANA "ILTAPAIAPA"

34

PROVECTO DE INMSTIGACJON caSaabertadlmp3

RIRLIOTE(X DE FUNCIONES GR4FICAS V GRAFICACION POLIEORAL

Manual Técnico

draw_3d(itruct PLANOS Plan[N*MJ, in2 Roy-Persp):

La primera función que es llamada dentro de la función drawV3d(), se compone de dos partes, la primera de ellas se refiere a la opción de proyección ortogonal, la otra parte se refiere a proyección perspectiva. El ciclo: for(i=O;i<N*M;i++), se ejecutará N*M veces, ya que éste es el tamaño de la matriz de planos.

La línea siguiente: for(k=O;k<( ( (struct PLANOS *) Plan + i ) -> nogtos)*2;k+2), y en particular la condicióq, se refiere a que entrará en este ciclo (nogtos*2) veces, es decir si tenemos un plano con 4 puntos, tendremos que serán 8 veces las cuales se repetirá este ciclo, pero como k se incrementa en2, relamente serán 4 veces.

Las operaciones:

punt0.x = (punto.x)*D/punto.z punt0.y = (punto.y)*D/punto.z punt0.z = (punto.z)*D

corresponden a la siguiente figura:

UNIVERSIDAD AUTONOMA METROPOLITANA “ITTAPAMPA”

35 o

PROVECTO DE INVESTlGAClON Caalbataal lnpo

RIRLIOTECA DE FUNCIONES GRAFICAS V GRAFICACION POLIELIRAL

plano de proyección

i.

I I

D Z

I z I

Si observamos los triángulos rectangulos que se forman facilmente podemos decir que:

entonces:

La cual es la

De la misma

En el caso en que la coordenada z sea cero, tenemos que el valor de cada uno de las coordenadas X y Y aumentará, lo cual provoca que la imagen se vea mas grande, lo cual es lo esperado. . .

Trasladar(itruct PLANOS P/N*MJ,int eje, int direc):

Esta función traslada al objeto sobre el eje seleccionado.

El parámetro "direc" se refiere a la dirección en la cual se llevará a cabo la traslación sobre dicho "eje". Si el eje seleccionado es X, a cada coordenada X de los puntos del plano le es sumado el valor dX (en este caso para la traslación en X), el cual corresponde al incremento en la traslación.

Rotar(struct PLANOS P[N*MJ, int eje, int direc):

Esta función rota al objeto sobre el eje seleccionado.

El parámetro "direc" se refiere a la dirección en la cual se llevará a cabo la rotación sobre el "eje" seleccionado.

z

UNIVERSIDAD AUTONOMA METROWLITANA "IZTAPALAPA"

36

PROVECTO DE INVESTIGACWN Caa*artadtm

RIRLIOTECA DE FUNCIONES GRAFICAS Y GRAFICACION PWEDRAL

Para lograr una rotación en cualquiera de los ejes, lo que hacemos es multiplicar, la matriz de rotación correspondiente respecto al cual rotaremos al objeto por cada punto del plano de la matriz de planos, esto es:

t

Para el eje X,Y, Z respectivamente , tenemos:

O 1 X X

Y - - ycos @, + zsen @

Z -ysen @+zcos @,

ángulo-X es el ángulo al que se encuentra rotado el objeto con respecto al eje X. En las líneas posteriores se cambian los valores de los puntos de toda la matriz de planos. Para los ejes Y y Z son efectuadas operaciones similares.

comparaglanos(void *PLANOl,void *PLAN02):

Esta función es la encargada de regresar al qsort(), dados dos planos, cual de ellos se encuentra más cerca del observador, esto es:

Si el elemento1 es menor que el elemento 2 deberá regresar (-1) Si el elemento1 es mayor que el elemento 2 deberá regresar (1) Si ambostelementos son iguales la función cornparaglanos(), regresará (O)

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPALAPA''

37

PROVECTO DE INMSTIGACION kabrrtadtBTC0

BIBLIOTECA DE FUNCAONES GRAFICAS V GRAFlCAClON POLIELIRAL

ELEMENTOS

DE PUNTOS

UNIVERSIDAD AUTONOMA METROPOLITANA “IZTAPAIAPA”

38

S

PROVECTO DE INMSTIGAUON IhSa&dtYG

RIBLIOTECA DE RINUONEE GRAFICAR Y GRAFI(M!JON POLIEDRAL

DESCRIPCION DE LAS FUNCIONES PARA GENERACION DE PUNTOS A GRAFICAR

Uno de los aspectos más importantes en lo que se refiere a la grafcación de funciones, es precisamente el reconocer y evaluar estas funciones para obtener los datos necesarios que requiere nuestra función de grafkación, estos datos los obtenemos al analizar y evaluar las expresiones que son introducidas como parámetros por los usuarios de nuestra función de graficación, la cual acepta todo tipo de funciones matématicas.

En la función de graficación se requieren como parámetros, la función a evaluar, que debe constar como máximo con dos variables, así como los rangos entre los cuales se van a evaluar estas variables dentro de la función. Para poder calcular los valores de la función a evaluar lo primero que se requiere es analizar la función de la misma manera como lo hace un compilador en sus etapas iniciales que son el análisis lexico y el análisis sintáctico, esto es para que no existan errores en la escritura de la función y en su lógica, para esto recordamos estos dos análisis tan importantes y que vimos en nuestro curso de compiladores.

Nuestro conocimiento sobre cómo organizar y escribir compiladores ha aumentado mucho desde que comenzaron a aparecer los primeros compiladores a principios de los años cincuenta. Es dificil dar una fecha exacta de la aparición del primer compilador, porque en un principio gran parte del trabajo de experimentación y aplicación se realizó de manera independiente por varios grupos. Gran parte de los primeros trabajos de compilación estaba relacionada con la traducción de fórmulas aritméticas a códlgo de máquina.

S

En la década de 1950, se consideró a los compiladores como programas notablemente dificiles de escribir. El primer compilador de FORTRAN, por ejemplo, necesitó para su implantación 18 años de trabajo en grupo (Backus y otros [1975] ). Desde entonces, se han descubierto técnicas sistemáticas para manejar muchas de las importantes tareas que surgen en la compilación. También se han desarrollado buenos lenguajes de implantación, entornos de programación y herramientas de soffware. Con estos avances, puede hacerse un compilador real incluso como proyecto de estudio en un curso de un semestre sobre diseño de compiladores.

UNIVERSIDAD AUTONOMA METROPOLITANA ''ITTAPAMPA"

39

PROVECTO DE INMSTIGACAON

ANALISIS DEL PROGRAMA FUENTE

En la compilación, el análisis consta de tres fases:

1. -Análisis lineal, en el que la cadena de caracteres que constituye el programa fuente se lee de izquierda a derecha y se agrupa en componentes léxicos, que son secuencias de caracteres que tienen un significado colectivo.

estructuradel programa fuente preprocesador programa fuente compilador programa objeto en lenguaje ensamblador ensamblador código de máquina relocalizable e&tor de carga y enlace biblioteca,

En este documento sólo revisaremos lo que es el ana1izador.léxico y el analizador sintáctico que son los que utilihmos en .la funcjón grai3cadora.j .. ’.. :j ;; ’ .. : ’.

. . . . . . . . . . . . . . . . . . . . . . . . . . . ;.. I : ’. ,

. . . . . . . . . . . . . . . . ::

: > . . . . . . .

. j . . . . . . . . . . . . . . . . . . .,.’ . . . . . . . . . . . . . . : . , . . . . .

. . . . . . . I . .

. . . . . . . . . . . . .

. . . . . . . . . . . . . . . I . . . . . . . . . . . .: . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . .

Análisis léxico

En un compilador, el análisis lineal se llama análisis léxico o exploración. Por ejemplo, en el análisis léxico los caracteres de la proposición de asignación

posición := inicial + velocidad * 60

se agruparian en los componentes léxicos siguientes:

1.- El identificador posición. 2.- El símbolo de asignación 3.- El identificador inicial. 4.- El signo de suma. 5 .- El identificador velocidad. 6.- El signo de multiplicación.

UNIVERSIDAD AUTONOMA METROPOLITANA “ITTAPAIAPA”

c 40

PROVECTO DE INMSTIGAUON kSaartsdl&XIlLC

RIRLIOTECA DE FUNCIONES GRAFICAS V GRAFICAWON POLIEDRAL

UNIVERSIDAD AUTONOMA METROPOLITANA “ITTAPAIAPA”

PROVECTO DE INVESTIGA(I0N camdkladtiarpo

RIRLIOTECA DE FUNCIONES GRARCAS V GRAFICAAWON POLIEDRAL

análisis léxico.

Análisis sintáctico

El análisis jerárquico se denomina análisis sintáctico. Este implica agrupar los componentes léxicos del programa fuente en frases gramáticales que el compilador utiliza para sintetizar la salida. Por lo general, las frases gramaticales del programa fuente se representan medante un árbol de análisis sintáctico como el que se ilustra en la siguiente figura.

proposición de asignación

identifícador número

Arbol deranálisis sintáctico para posición := inicial + velocidad*60.

En la expresión inicial + velocidad * 60, la frase velocidad * 60 es una unidad lógica, porque las convenciones usuales de las expresiones aritméticas indican que la multiplicación se hace antes que la suma. F'uesto que la expresión inicial + velocidad va seguida de un *, no se agrupa en una sola frase independiente.

La estructura jerárquica de un programa normalmente se expresa utilizando reglas recursivas. Por ejemplo, se pueden dar las siguientes reglas como parte de la definición de expresiones:

1 .- Cualquier identiJcador es una expresión. 2.- Cualquier número es una expresión. 3.- Si expresión1 y expresión2 son expresiones, entonces también l o son

expresión 1 + expresión2 expresiónl * expresión2 ( expresión1 )

UNIVERSIDAD AUTONOMA METROPOLITANA ''IZIAPALAPA"

41

PROYECTO DE INMSTIGACION habitrtadtlsm,

BIBLIOTECA DE FUNCIONES GRAFICAS Y GRAFICACION POLIEURAL

Las reglas (1) y (2) son reglas básicas (no recursivas), en tanto que la regla (3) define expresiones en función de operadores aplicados a otras expresiones. h i , por la regia (l), inicial y velocidad son expresiones. Por la regla (2), 60 es una expresión, mientras que por la regla (3), primero podemos inferir que velocidad * 60 es una expresion, y finalmente, que inicial + velocidad * 60 también es una expresión.

De manera similar, muchos lenguajes definen recursivamente las proposiciones mediante reglas como:

1.- Si identificadorl es un identificador y expresión2 es una expresión, entonces

identificador 1 := expresión2

es una proposición.

ANALISIS LEXICO

Una forma sencilla de crear un analizador léxico consiste en la construcción de un diagrama que ilustre la estructura de los componentes léxicos del lenguaje fuente, y después hacer la traducción "a mano" del diagrama a

UNIVERSIDAD AUTONOMA METROPOLlTANA "IAAPALIZPA"

42

k ~ d l m BIBLIOTECA DE FUNCIONES GRAFICAN Y GRAFICACION POCIEDRAL

un programa para encontrar los componentes léxicos. De esta forma, se pueden producir analizadores léxicos eficientes;

cas técnicas utilizadas para construir analizadores léxicos también se pueden aplicar a otras áreas, como, por ejemplo, a lenguajes de consulta y sistemas de recuperación de información. En cada aplicación, el problema de fondo es la especificación y diseño de programas que ejecuten las acciones activadas por patrones dentro de las cadenas. Como la programación dirigtda por patrones es de mucha utilidad, se introduce un lenguaje de patrón- acción, llamado LEX, para especificar los analizadores léxicos. En este lenguaje, los patrones se especifican por medio de expresiones regulares, y un compilador de LEX puede generar un reconocedor de las expresiones regulares mediante un autómata finito eficiente.

Otros lenguajes utilizan expresiones regulares para describir patrones. Por ejemplo, el lenguaje analizador de patrones AWK utiliza expresiones regulares para seleccionar las líneas de la entrada que se han de procesar, y el shell del sistema UNIX permite al usuario referirse a un conjunto de nombres de archivo mediante la escritura de una expresión regular. La instrucción rm *.o de UNIX, por ejemplo, borra todos los archivos cuyos nombres terminen en ".o"'.

El analizador léxico es la primera fase de un compilador. Su principal función consiste en leer los caracteres de entrada .y% elaborar como .salida. una. .secuencia. de .:com.pnenter; .léxic,os.\ que. utiliza el analizador sintáctico para hacer,el.a&ilisis. :Esta ipter&&un.'&ele aplicarse~c6nvirt&&j 'al an&isa&i l&co en una subrutina O corrutina del analizador -síritactico. Recibida .la 0rdd"obten "el sig&nte compoi&&. lexica" del analizador sintáctico, el analizador léxico lee los caracteres de entrada hasta que pueda identificar el siguiente componente léxico.

Como el analizador léxico es la parte del compilador que lee el texto fuente, tanibién puede realizar ciertas funciones secundarias en la interfaz del usuario, como eliminar del programa fuente comentarios y espacios en blanco en forma de caracteres de espacio en blanco caracteres TAB y de línea nueva. Otra función es relacionar los mensajes de error del compilador con el programa fuente. Por ejemplo, el analizador léxico puede tener localizado el número de caracteres de nueva línea detectados, de modo que se pueda asociar un número de línea con un mensaje de error. En algunos compiladores, el analizador léxico se encarga de hacer una copia del programa fuente en el que están marcados los mensajes de error. Si el lenguaje fuente es la base de algunas funciones de preprocesamiento de macros, entonces esas funciones del preprocesador también se pueden aplicar al hacer el análisis léxico.

En algunas ocasiones los analizadores léxicos se dwiden en una cascada de dos fases; la primera, llamada "examen", y la segunda, "análisis léxico". El examinador se encarga de realizar tareas sencillas, mientras que el

UNWERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

43

PROVECTO DE INVESTIGACION csSa*dlm

HIBLIOTECA DE FUNOWES GRAFICAS V GRAFICACION POLIEDRAL

analizador léxico es el que realiza las operaciones más complejas. Por ejemplo, un compilador de FORTRAN puede utilizar un examinador para eliminar espacios en blanco de la entrada.

Aspectos del análisis léxico

Hay varias razones para dividir la fase de análisis de la compilación en análisis léxico y análisis SintaCtiCO.

1.- Un diseño sencillo es quizá la consideración más importante. Separar el análisis léxico del análisis sintáctico a menudo permite simplificar una u otra de dichas fases. Por ejemplo, un analizador sintáctico que incluya las convenciones de los comentarios y espacios en blanco es bastante más complejo que uno que pueda comprobar si los comentarios y espacios en blanco ya han sido eliminados por el analizador léxico. Si se está diseñando un lenguaje nuevo, la separación de las convenciones léxicas de las sintácticas puede dar origen a un diseño del lenguaje más claro.

2.- Se mejora la eficiencia del compilador. Un analizador léxico independiente permite construir un procesador especializado y potencialmente más eficiente para esta función. Gran parte de tiempo se consume en leer el programa fuente y dividirlo en componentes léxicos. Con técnicas especializadas de manejo de buffers para la

Todo lenguaje de programación tiene reglas que prescriben la estructura sintáctica de programas bien formados. En Pascal, por ejemplo, un programa se compone de bloques, un bloque de proposiciones, una proposición de expresiones, una expresión de componentes léxicos, y así sucesivamente. Se puede describir la sintaxis de las construcciones de los lenguajes de programación por medio de gramáticas independientes del contexto o notación BNF (forma de Backus-Naur). Las gramáticas ofrecen ventajas significativas a los diseñadores de lenguajes y a los escritores de compiladores.

* Una gramática da una especificación sintáctica precisa y fácil de entender de un lenguaje de programación.

* A partir de algunas clases de gramáticas se puede construir automáticamente un analizador sintáctico eficiente que determine si un programa fuente está sintácticamente bien formado. Otra ventaja es que el proceso de construcción del analizador sintáctico puede revelar ambigüedades sintácticas y otras construcciones difíciles de analizar que de otro modo podrían pasar sin detectar en la fase inicial de diseño de un lenguaje y de su compilador.

UNIVERSIDAD AUTONOMA METROPOLITANA “IAAPAUPA”

44

PROVECTO DE INMSTIGACION cspdabatadliem,

BIBLIOTECA I)€ FUNUWES GRAFICAS V GRAFICACION PULIEURAL

* Una gramática diseñada adecuadamente imparte una estructura a un lenguaje de programación útil para la traducción de programas fuente a código objeto correcto y para la detección de errores. Existen herramientas para convertir descripciones de traducciones basadas en gramáticas en programas operativos.

* Los lenguajes evolucionan con el tiempo, adquiriendo nuevas construcciones y realizando tareas adicionales. Estas nuevas construcciones se pueden añadir con más facilidad a un lenguaje cuando existe una aplicación basada en una descripción gramatical del lenguaje.

Función del Análizador Sintáctico

En el resto de esta sección, se considera la naturaleza de los errores sintácticos y las estrategias generales para su recuperación. Dos de estas estrategias, llamadas recuperación en modo de pánico y a nivel de frase, se estudian 'Eon más detalle junt con los métodos de análisis sintáctico individuales. La implantación de cada estrategia depende del criterio del que escribe el compílador.

Después de esto podemos entender de manera más facíl que el proceso de grafkación requiere de varias etapas y que el análisis de una expresión es una parte primordial de la gráfkación, por lo tanto podemos decir que los análisis antes explicados, se efectuan en la función llamada Analiza( ), es aqui donde se checa que la función que se quiere gráfkar este escrita de manera correcta tanto lexicamente como sintácticamente.

Después de que se verifica que la expresión que representa la función que se desea gráfkar esta escrita correctamente se pasa a la segunda etapa, que es la de evaluación de la función en con los valores que se reciben

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPALAPA"

45

PROVECTO DE INVESTIGAC’AW BIBLIOTECA DE FUNCIONES GRAFICAS Y GRAACA(1ON POLIE1)RAL

para cada una de las variables; para esto primero se tiene que utilizar otra función que sustituye en la expresión las variables por su valor numérico para poder ser evaluada.

Todo esto es controlado por una función llamada generaguntos( ), que es donde se realizan todas las operaciones mencionadas anteriormente y es aqui donde se almacenan los valores entregados por la función evalua en una estructura para que después, estos puntos se pasen a la función de grafkación que es la que se encarga directamente de proyectar los resultados en pantalla; en esta función se controla el ciclo para que la función se evalue en todo el rango que se le da a cada una de las variables contenidas en la función a evaluar.

UNWERSIDAD AUTONOMA METROPOLITANA “IZTAPALAPA”

46

PROVECTO DE INVESTIGACION CSparaetadtSrm

BIOLIOTECA DE FUNCIONES GRAFICAS Y GRAFlCAClON POLIEDRAL

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

47

PROVECTO DE INMSTIGAUON BIBLIOTECA DE NNCWNEE GRAFICAS Y GRAFI(3UON POLIEORAL

Las funciones del estándar VESA

En total son seis las diferentes funciones del estáindar VESA, y se llaman comno subfunciones de la función 4Fh, que se enlazan con el driver VESA (por ejemplo una BIOS capaz de VESA) en la interrupción de la BIOS 10h.

Resumen de las funciones del estándar VESA:

Función

OOh Olh 02h 03 h 04W00h 04hI01h 04hI02h 05W00h 05WOlh

I Descripción EGANGA I

Los siguie,ntes modos gráfkos se soportan mediante las diferentes funciones VESA:

MODO TAMAÑO RESOLUCION I I

lOOh lOlh 102h 103h 104h 105h 106h 107h 6Ah

256 KBytes 5 12 KBytes 256 KBytes 5 12 KBytes 5 12 KBytes 1 MBytes 1 MBytes 1.25 MBytes 256 KBytes

Los modos gráficos de la BIOS VESA.

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

48

CarassectadtSrm PROVECTO DE INMSTIGACION BIBLIOTECA DE FUNCIONES GRAFICAS V GRAFICAUON POLIEI)RAL

Descripchn de lasfunciones:

Interrupción IOh, Función 4Fh, Subfunción OOh VESA Obtener caracterísrtica de la tarieta SuDer-VGA

Con ayuda de esta función se pueden averiguar las características de la tarjeta Super-VGA instalada, y se deja determinar sí se soportan las funciones VESA.

Entrada AH = 4Fh AL= OOh ES:DI = Puntero FAR al buffer de información

Salida AL = 4FH y AH = OOh : Se soportan funciones VESA

Versión VESA, número de versión menor

Puntero FAR sobre cadena ASCII.Z-.$on.el nqmbre del .; fabricante de.la:tarjpta . . . :. i’. ...... : . : .. . . . . .

Flag, que indica las capacidades de la tarjeta. De momento no se utiliza, por ello OOOOh

. . . . . . . . . . . . . . . . . . . . : . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . , . .

Puntero FAR, a la lista con los números de código de los modos de video soportados.

1 BYTE

. . . 1 .D.WORD .

.:. , . . . . . . . . . . , : . , . . . . . . . % . . . . . . .

1 DWORD

1 DWORD

bytes. Si la

Estructura del buffer de infornación.

La lista con los números de código de los modos de video soportados, que se pisan en el último campo del buffer, sekompone de diferentes palabras (words), que indican los respectivos códigos de los modos de video según la tabla anterior. Esta lista, cuya longitud depende de las tarjetas, se termina con una palabra con el valor OFFFFh.

UNIVERSIDAD AUTONOMA METROPOLITANA ‘‘IZlAPAUPA”

49

PROVECTO DE INMSTIGACION BIBLIOTECA DE FUNCIONES GRAFICAS V GRAFIMClON POLIEDRAL

Interrupción IOh, Función 4Fh, Subfunción O l h VESA Obtener los datos identificativos de un modo VESA

Esta función suministra información sobre un modo VESA, pero no lo activa.

Entrada AH = 4Fh A L = Olh

ES:DI = Puntero FAR a buffer de información cx = Número, de código del modo VESA deseado

Salida AL = 4FH y A H = OOh: La función se ejecutó adecuadamente

L

Banderas para la segunda ventana de acceso

Granuladdad .en KBytes,,.con la.que..se pueden .., .:

'desplazar l&,d& ventan&.d$ac6esoi ... ::. .. .::

Tamaño de las dos ventanas de acceso en KBytes

Dirección de segmento de la la ventana de acceso

Dirección de segmento de la 2" ventana de acceso

Puntero F A R a rutina para ajustar la zona visible en la dos ventanas de acceso

Número de bytes, que ocupa cada línea de puntos en la RAM de video

'. I :

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ,. . ,

. . . . . .

. .

1 BYTE

.,I .WORD. . . . . . . . . . . . . . . . . . . . . . . . . > . . . . . . . . . . . . . . . . . . .

1 WORD

1 WORD

1 WORD

1 DWORD

1 WORD

bytes. Si la función vuelve

UNIVERSIDAD AUTONOMA METROPOLITANA ' IAAPAIAPA"

50

PROVECTO DE INMSTlGAClON carS&3-bdt~

BIBLIOTECA DE FUNCIONES GRAFIUS V GRAFICAUON POLIEDRAL

Informaciones opcionales, ver bandera de modo

- 12h 14h 16h 17h 18h 19h

1B h 1Ch

Resolución X en puntoskaracter Resolución U en puntoshracter Anchura de la matriz de caracteres en puntos Altura de la matriz de caracteres en puntos Número de Bit-Planes Número de bits por punto de pantalla Número de bloques de memoria Modelo de memoria Tamaño de los bloques de memoria en KBytes

1 WORD 1 WORD 1 BYTE 1 BYTE 1 BYTE 1 BYTE 1 BYTE 1 BYTE 1 BYTE

Estructura del buffer de información.

La bandera de modo (Offset OOh) nos indica si los campos opcionales del buffer de información han sido rellenados por la función VESA y además suministra informaciones importantes con respecto al modo deseado.

modo

Nro.

OOh Olh 02h 03 h 04h 05h ..

¡Oh-FFh '

Q6h-OFh:

~~ ~~ ~

Códigos válidos para la descripción del modelo de memoria. ~~

Interrupción IOh, Función 4Fh, Subfunción 0 2 h VESA Conectar modo VESA

Con esta función se puede conectar un modo VESA

Entrada AH = 4 Fh A L = 02h BX = Número de código del modo deseado

Salida AL = 4Fh y

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

51

PROVECTO DE INMSTIGAC'ION csSa&Wdllsrm

BIBLIOTECA DE FUNCIONES GRAFICAS V GRAFICAC'ION POLIEORAL

AH = OOh : La función se ejecutó adecuadamente P

* Esta función sólo se debería llamar después de haber ejecutado con éxito la subfunción OOh, con lo cual se demuestra la existencia de un driver VESA. Además, sólo se pueden inicializar modos, que se especifican en la lista de modos de la función OOh.

* En el regstro BX, el número de código del modo de video, se puede poner a uno el bit 15, si la RAM de video no se debe borrar durante la inicialización del modo de video.

b

Interrupción IOh, Función 4Fh, Subfunción 0 3 h VESA Obtener modo actual

Esta función desvuelve el número de código del modo de video actual y también tiene en cuenta los rnocios

demostrado con ello la existencia de un driver VESA

I Interrupción IOh, Función 4Fh, Subfunción 04h Obtener el tamaño del buffer de seguridad

con éxito, y se haya

Para la llamada subsiguiente de la subfunción 04h/01h, se puede obtener con ayuda de esta función el tamaño del buffer de seguridad necesario.

Entrada AH = 4Fh A L = 04h DL = OOh cx = componentes a guardar del estado de video

Salida AL = 4FH y A H = OOh : La función se ejecutó adecuadamente, en este caso

P BX = Número de los bloques de 64 Bytes contiguos, que se necesitan como buffer de seguridad

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

52

PROVECTO DE INMYTlGAClON

* Esta función se ha de llamar antes de la subfunción 04h/01h, para averiguar el tamafio del buffer de seguridad, que se ha de poner a disposición de la subfunción 04W01h.

S

* Los diferentes bits del regstro CX indican durante la llamada de función, qué componentes del estado de video se ha de guardar. Sólo se ocupa el byte bajo del registro CX, en el que los siguientes bits tienen significado.

Interrupción IOh, Función 4Fh, Subfunción 04h/01h VESA Guardar estado de video de la tarjeta Super-VGA

Después de una llamada anterior de la subfunción 04h/00h seguardan las informaciones deseadas sobre los diferentes componentes del estado de video mediante esta función, en el buffer del invocador.

Entrada AH = 4F h

je la subfunción 04W00h

, '..:.tp$. &imponentes del estado de , .. ,

.I .:. . ;. , .. , , .

video deben ser guardadas, véase para ella la subfunción 04h / OOh.

Interrupción IOh, Función 4Fh, Subfunción 04h/02h VESA Restaurar estado de video de la tarjeta Super-VGA

Después de guardar el estado de video con ayuda de la subfunción 04h/01h, este estado puede volver a restaurarse de nuevo mediante llamada de esta función

Entrada AH = 4Fh A L = 04h DL = Olh cx = componentes a restaurar del estado de video ES:BX = Puntero FAR a la dirección de segmento del buffer de seguridad S

Salida AL = 4FH y AH = OOh : función se ejecutó adecuadamente

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

5 3

S

PROYECTO DE INVESTIGAUON BIBLIOTECA DE FUNCIONES GRAFICAS Y GRAFICAUON POLIEDRAL

* El buffer pasado ha de ser cargado anteriormente mediante una llamada a la subfunción 04W01h con las informaciones sobre el estado de video. * Los diferentes bits en el registro CX muestran durante la llamada de función, qué componentes del estado de video deben ser restaurados.

Interrupción IOh, Función 4F’h, Subfunción 05h/00h VESA Determinar ventanas de acceso a la RAM de video

Esta función se emplea, para visualizar una parte determinada de la RAM de video en una de las ventanas de acceso VESA, y hacerla direccionable para un programa.

I Interrupción 10h, Función 4Fh, Subfunción 05h/01h VESA Obtener ventana de acceso a la RAM de video I

Con esta función se puede obtener la posición de la ventana de acceso con respecto a la RAM de video de la tarjeta,Super-VGA.

Entrada AH = 4Fh A L = 05 h BH = Olh BL = Ventana de acceso (O o 1)

Salida AL = 4FH y A H = OOh : La función se ejecutó adecuadamente, en este caso DX = Dirección inicial

UNIVERSIDAD AUTONOMA METROPOLITANA “IZTAPAIAPA”

54

PROVECTO DE INVESTIGAUON BIBLIOTECA UE FUNUONES GRAFICAS Y GRAFICACION POLlmRAL

* La dirección deinicio del registro DX se ha de ver en referencia a la granularidad de la ventana, que se puede averiguar mediante llamada de la subfunción Olh.

U

U

UNNERSIDAD AUTONOMA METROPOLITANA "IAAPALAPA"

55 U

PROVECTO DE INVEITIGAUON BlBLlOTErA DE FUNCIONES GRAFICAS Y GRAFlCAClON PDLIEDRAI

. . . .... . ., . , ’.’ ’ ...._

‘.:I

. . . . .

. . . . .

UNIVERSIDAD AUTONOMA METROPOLITANA “IZlAPAIAPA”

56

PROVWTO DE INMSTIGACION ! h ~ d l s c y O

BIRUOTECA DE FUNCIONES GRAFICAS Y GRAFICAUON POLlEDRAl

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /* ******** ESTE ES EL ARCHIVO QUE CONTIENE EL CODIGO FUENTE DE *********** */

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /* * . . . . . . . . . . . . . . . . . . . . . . . . . . LA LIBREMA G W I C A . . . . . . . . . . . . . . . . . . . . . . . . . * */

#ifndef GRAPH-VESA #define GRAPH-VESA

#include <dos.h> #include <math.h> #include <float. h> #include <conio. h> #include <stdio.h>

I* macros */

/* las siguientes definiciones son para la funcion floodfll */ #define StackTop 100

struct TASK {

>; struct T B K Pila[StackTop]; struct TASK NullTask={ O,O,O,O}; int TFO; /* hasta aqui definiciones para floodf~ll *I

int xl,x2,y,dir;

/* definiciones para las funciones de paletas */ struct RGB {char r,g,b;}; struct RGB -Paleta[256];

UNIVERSIDAD AUTONOMA METROPOLITANA "VTAPAIAPA"

57

PROYLCTO DE INVESTIGACION EIELIOTECA DE FUNUONES GRAFICAS Y GRAFICACION PWLDRAL

int -cosLFTOSxCURVA],-senLFTOSxCURVA];/*para almacenar valores se senos y cosenos */

char far *PtrBiosFont8x16;

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ I* declaración de variables globales *I

char far * busca-font-bios(unsigned . . char array[],int largo,char letra);

int left,top,right,bottom; int clip; >;

struct WA-viewporttype COORD;

struct VESA-INFO { char firma[4]; char Version; char version; char far * fabricante; long flag; int far *modos; char resto[238];

UNIVERSIDAD AUTONOMA METROPOLITANA “ITTAPAIAPA”

58

RlRLlOTECA DE FUNCIONES GRAFMAS Y GRAFICACION PWEURAL PROVECTO DE INMSTlGAClON

struct VESAMODE-INFO { int ban-modo; char ban-vent-1; char ban-vent-2; int granularidad; int tamano; unsigned seg-vent- 1 ; unsigned seg-vent-2; void (far *ajustevent)(); b t xlong; int resx; int resy; char x-car; char y-car; char bitqlanes; char bits-xgto; char num-bloques; char mem-modelo; , : ' " ' ' . ' : .,, :.>,;'...' ~'..

char tambloques; , <:;.:l.., , ::; ~, . :~ . .~~ . ,~ . ' : , ' ~~~ ,~ . ; : ,~~~

. . ... . . .\.:... . . . .I ,.. i . . ~ . . : . . ~ . \ ' : !,

.. -.:.>.:~..'~'.: . ',.., 1:: . I

1;

int vesa.

intr(OxlO,&r); if(r.r-ax=Ox004f)return( 1);

vesa_getmodeinfo(int modo,struct VESA-MODE-INFO far * id){ struct REGPACK r; r. r_ax=Ox4FO 1 ; r . r-cx=modo; r.r-es=FP-SEG(inf); r.r-di=FP-OFF(inf); intr(OxlO,&r); if(r.r-ax=Ox004F)return( 1); return(0);

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

S 59

C a r a z i m d i i PROVECTO DE INMSTlGAClON BIBLIOTECA DE FUNCIONES GRAFIWS V GRAFl(ACION POLIEIJRAL

int initgr@ph(int mode) {

struct VESAMODE-INFO mi ; /* para obtener las caracteristicas del modo elegido*/ struct VESA-INFO vi; union REGS r;

/* codificacion para la letra ‘A’ de 8x 16 */ unsigned char A[]={ OxOO,OxOO,Ox1O,Ox38,Ox6c,Oxc6,Oxc6,Oxfe,

Oxc6,Oxc6,Oxc6,Oxc6,OxOO,OxOO,OxOO,OxOO);

clrscr(); if(!vesa-getinfo((void far *)&vi))

{ printf(” Tarjeta super VGA sujeta a estandar VESA no instalada h”): exit(0);

- Mode = mode; /* para saber en todo momento en que modo estamos */

setgraphmode(mode); /! fijar modo .vESA. */ ..:. . .:: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. ’.. ’ ;,

: . I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : . . . . . . . . :: , ’ . j : . .. :, , . .:

. . . . . . . . . . . . . . . . . . . . , . . ~~ . . \ . . .

. . . . . . . . . .

i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 . :

PtrBiosFontSx 16 = busca-font-bios(A, 16,’A’); /* caja de Sx 16 */

/* caracteristicas del modo VESA fijado */ - Resx = mi.resx; - Resy = mi. resy; - Xmax = -Resx - 1 ; - Y max = -Resy- 1 ; - TAMWINDOW = ((long)mi.tamano<<lO); - GRAN = ((long)mi.granularidad<<lO); - CambioWindow = TAMWINDOW / -GRAN;

COORD.left = O; COORD.bottom = -Ymax; COORD.right = -Xmax;

COOb. top = o;

UNIVERSIDAD AUTONOMA METROPOLITANA “IAAPAIAPA”

60

S PROVECTO DE INVESTIGACION RIRLIOTECA DE FUNClONES GRAFICAS V GRAFIUCION PWEDRAI

- MaxColor = mi.bits-xgto; /* es el logaritmo de el no. de colores */

ini-tabla-sin-cos();

char far * busca-font-bios(unsigned char array[],int largo,char letra) {

char huge *ap-bios; int k;

for(ap-bios=(char huge *)OxC0000000;ap~bios<(char huge *)OxFFFftIOOO;ap-bios++){ for(k=O;k<largo;k++){

if(*(ap-bios+k)!=array[k])break;

initabla-sin-cos() { . . register int i=O; . . . . . ~ . . . . . . . . . . . . . . . . . . . . . . . . .

double t = 6.283:185307-; :; :

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~

, . . I . . . . . I : . '. .: . . ' .,.I . . . I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ... ... . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . , . . . . . . . . . . . . . . . . . . .

. .

. . . .<: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : > . . I

. . . . .

: . . . . . . . . . . . . . . . . . . j . . . > . . .

for(i=O;i < -PT'OSxCURVA;i++){ - cos[i] = (double)cos(i*t/_PTOSxCURVA) * -ex;

sen[i] = (double)sin(i*t/-PTOSxCURVA) * -ex; 1

-

1

getgraphmode0 /* para obtener el modo de video actual */ { S

union REGS r; r.h.ah = OxOF; int86(OxlO,&r,&r);

return(r.h.al); /* ah = ## de colores */ /* al = # de modo de video */

}

UNIVERSIDAD AUTONOMA METROPOLITANA "WTAPALAPA"

61

PROYLCTO DE INMSTlGAClON HIRUOTECA DE FUNCJONEE GRAFICAS Y GRAFlCACION POUEDRAL

setgraphmode(int modo) f union REGS r;

r.h.ah=Ox4F; r.h.al=Ox02; r.x.bx=modo; intSb(OxlO,&r,&r);

if(r.x.bx != modo) {

printf(”ERR0R: Modo %Xh no soportado por el sistema! ! “,modo); exit(0);

1 1

restorecrfmode() 1

union REGS r;

- Vline(right,top,bottom); - Hline(left,right,bottom); - Vline(left,top,bottom$; . . . . . . . . . . . . . . . . . . . . . ...: . . . . . .: . . . . . . . . . . . . . . . . . . . . . .

. . . . \ . . . . . . . .: ’.:{, ,. \. : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

‘ : j . . . . . . . . . . . . . .

. , : . , . . . . . . . .

%

. . . . . . . ~ . .

} . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . .: . . . . .

:. % .. :

moverel(int delta)<, int deltaY) { - LastX = -LastX + d e l t a ; - LastY = Las tY + deltaY; }

UNIVERSIDAD AUTONOMA METROPOLITANA “IAAPAIAPA”

62

PROVECTO DE INVEBTIGACJON Caaasehadllarm

BIBLIOTECA DE FUNCJONES GRAFlCAS Y GRAFWACION PWEDRAL

lineto(int x,int y) {

if(x > CXmax+20) 11 y > -Ymm 1 1 x < O 11 y < O)return(l); lineCLastX,-LastY,x,y); - LastX=x; - Lastwy;

1

linerel(int deltaX,int deltaY) {

lineCLastX,-Lasty,-LastX + delM,-LastY + deltaY);

- LastY = -Lasty + deltaY; - LastX = "LastX + deltax;

>

incx=l ; if(right < left) incx-1; incy=l; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . ,~ . . %. . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . .: : I

.. I .

. . . . . .

. . . . . . . . . . . .

. . . . . . . $(bottom < top) &+.t.; .: : . . . . . . . : .. . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .

.. . . . . . . . , .

. . . . . % . . .

x=left; flop;

if(Dx > Dy) { pix = (long)-Resx * y + x; nvi = (pix / -GRAN);

if( (nvi >= -CurrWindow) && (nvi <= -CurrWindow + CCambioWindow - 2)) )

else

setwindow(0,nvi); 1 off = (pix - CCurrWindow * -GRAN) )% TAMWINDOW;

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

63

PROVECTO DE INMSTIGAUON

*CVideo + off) = -CurrColor;

constl=2*(Dy-Dx): const2=2*(Dy); ~(2*Dy)-Dx;

tor(i=O;i<Dx;i++) {

if(p>=O) { y += incy; p += const 1 ;

f else p +=const2;

off = (pix - CCurrWindow * -GRAN) )% -TAMWINDOW; *CVi,deo + off) = -CurrColor;

else { pix = (long)-Resx * y + x;

nvi = (pix / -.GRAN);

if( (nvi >= -CurrWindow) && (nvi <= -CurrWindow + CCambioWindow - 2)) )

else {

setwindow(0,nvi); 1

off = (pix - CCurrWindow * -GRAN) )% -TAMWINDOW; *(-Video + o@ = -CurrColor:

constl=2*(Dx-Dy); const2=2*(Dx); ~(2*Dx)-Dy;

a

UNIVERSIDAD AUTONOMA METROPOLITANA “ITTAPALAPA”

64

PROVECTO DE INV€STIGACI(MI

for(i=O;i<Dy;i++)

if(p>=O) { x += incx; p += const 1 ; I

else p +=const2; y += incy; ’ pix = (long)-Resx * y + x;

nvi = (pix / -GRAN); if( (nvi >= -CurrWindow) && (nvi <= -CurrWindow + CCambioWindow - 2)) )

else

setwindow(0,nvi);

{ register int i; . . ,

int temp,nvi; . . J.* le& = right. -* I.... .. ..: . . . . .;,... :: . : . . . . . . . . . . . . . . . . . . . .

long int p,oE, :,

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . : . . . . . . . . : : ’. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : % ’ . . . , .’ ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. I . . . . . . . . . . . . . ’ . . . .

. . . . . , .

if(top > bottom) {

} intercambia(top,bottom); -

- calcula-vent-off(top,column);

if(nvi != -CurrWindow) setwindow(0,nvi);

for(i=O;i < (bottom - top)$++) {

if(off > -TAMWINDOW)

off = off % -TAMWINDOW; nvi += -CambioWindow;

UNIVERSIDAD AUTONOMA METAOPOLITANA “IiTAPALAPA”

’ 65

PROYECTO DE INMSTIGACION CSe*alteryO

BIBLIOTECA DE FUNCIONES GRAFlCAS Y GRAFlCACJON PWEDRAL

setwindow(0,nvi); 1

*(-Video + off++) = -CurrColor; "OR,

off = (long) off + -Resx; 1

f S

- Hline(int left,int right,int high) /* coordenada x1,x2 y altura (y) */ { int temp; register int i; static int nvi,nv2; long int p,p2,0ff,oE2; unsigned long Solidfill;

if(-CurrWindow != nvi) setwindow(0,nvj); . .

for( ;0ft%4;) - NVNW8putpixel(off++,~CurrColor):

for(;off < om-2; off++) *( (long far *)(-Video + off))=Solidfll;

/*-NVNW32putpixel(off,Solidfill);*/

for(;off<=om;)

} else /* cuando los puntos extremos estan en ventanas diferentes */ {

- NVNW8putpixel(off++,-CurrColor);

for(;oP?4;) - NVNW8putpixel(off++,-CurrColor);

S

UNIVERSIDAD AUTONOMA METROPOLITANA " I A A P A U P A "

66

PROVECTO DE INMSTIGACIUN BIBLIOTEC4 DE FUNWUNES GRAFlCdS Y GRAFlCAClON POLIEDRAL

for(;off < -TAMWINDOW; off++) *( (long far *)(-Video + off))=Solidfill;

/* - ~ 3 2 p u t p i x e l ( o f f , ~ o l i d f i l l ) ; */

setwindow(O,nv2); for(of+O;off < om-2; Off+=4)

*( (long far *)CVideo + off))=Solidfill; /*~NVNW32putpixel(off,Solidfdl);*/

for(;off<=of€2;) - NVNWSputpixel(off++,-CurrColor);

............... . . . . . . . . . - PushTask(struct TASK T){ ..:' " ' ' ' . .

: ,.: ; * <'. ' 'y . , , .,,.y j : ; if(TP>=StackTop)return@); .......;............,....;: ,,:,:I ::,;;\.,\',';>,>.'. ...

... Pila[TPt+]=T; : ;:; :i. ::,

. . ~ . . ,

............ . . . . . .

. .

int colortemp; xl=T.xl;x2=T.x2;y=T.y;dir=T.dir;

colortemp = -CurrColor; /* salvando el color actual de dibujo solo*/ - CurrColor = -CurrColorFill;/*solo se hace en las funciones de relleno*/

while( 1){ line(x 1 ,y,x2,y); x l=x 1 ;x2=x2; if(y<=O && dir=; l)return( 1); if(y>=getmaxy() && dir=l)return( 1); y+=dir; for(;x 1 >O && getpixel(x 1 ,y)!=borde;x 1 --); while(getpixel(x 1 ,y)==borde && x lix2)x 1++;

while(getpixel(x2,y)rde && x l<x2)~2--; if(xl"x2){

8 for(;x2<getmaxx() && getpixel(x2,y)!=borde;x2++);

UNlVERSiDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

67

PROVECTO DE IMSTlGAClON RIRLIOTECA DE FUNCIONES GRAFICAS Y GRAFlCAC2ON POLIEDRAL

if(getpixel(x 1 .y)! =borde)putpixel(x 1 ,y,getcolorO); return( 1);

I if(xl<Xl-l)(

flag=O;yO-y-dir; for(x=xl;x<Xl;x++)(

if(getpixel(x,yO)!=borde){ flwl; break;

I } if(flag){

T.xl=xl;T.x2=Xl-l;T.y=y;T.di~-dir; - PushTask(T);

I z if(x2>X2+1){ . . . . . .

. . . . flag=O;yO==-dir; . ..... ..:. . . .<:., ,.. . . for(x+Xz+ 1 :x<=&;&+

, ,

I x . 3 1;

.. . Y . . . . . fdr~x~l;x<x2&,&jgetpi~el(~,~j!=bor’de;x+’;);-..‘:. . . . . . . . . . . j /. . . . . :. . :

*hile(x<xz)( ,: .... : . ’ . . . . . . . . .;:.y . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ... . . . . . . . . . . ; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . % .

. . ... . . . .

. . . . . . . . > . . . . . . . . . . . . . . . . . . . . . . . .

i f ( x ~ 2 ) b r e a k ; ’ T.xl=xl;T.x2=x-l;T.y=y;T.di~dir; - PushTaskp); for(x l=x;x Kx2 && getpixel(x 1 ,y)===borde;x 1++);

> >

- CurrColor = colortemp;/*restaurando el color actual de dibujo*/

floodflll(kt x,int y,int borde){ int x1,x2; struct TASK T; if(getpixel(x,y)===borde)return( 1); for(x 1 =x;x 1 >=O && getpixel(x 1 ,y)! =borde;x 1 --);x 1++;/* produce resultados inesperadoscuando se manda

for(x2=x;x2<=getmaxx() && getpixel(x2,y)!=borde;x2++);~2--;/*borde != de la fig. a rellenar*/ un */

UNIVERSIDAD AUTONOMA MElROPOLmANA “IZTAPALAPA”

68

S

PROVECTO DE INMSTIGACION cssadiwtddlm

BIBLIOTECA DE NNUONES GRARWS Y GRAFICAUON POLIEURAL

T.xl=xl;T.x2=x2,T.y=y;T.dirl:

T.dir=-1; while(T.dir!=O){

- PushTask(T);

llena(T,borde); T=-PopTask();

} >

circle(int x,int y,int r) { register int i;

long int p,off, int Xc,Yc,xa,nvi,inc;

if(r<O)return( 1); pif(!r) rl;

for(i=- {

if(Yc >= p e s y 1 1 Yc < O)

if(Xc>=-Resx 1 ) Xc<O ) /* columna fuera de la pantalla */

else

S - calculavent-off(Yc,Xc); if(nvi != -CurrWindow)

setwindow(0,nvi); - NVNWSputpixel(off,-CurrColor); 1 if(xa >= -Resx I( xa < O )

else { - calculavent-off(Yc,xa);

UNIVERSIDAD AUTONOhlA METROPOLITANA "IAAPALAPA"

69

PROVECTO DE INMSTIGACION RIBLIOTECA DE FUNCIONES GRAFIWS Y GRAFlCAUON PMIEDRAI

if( nvi ! = -CurrWindow) setwindow(0,nvi);

- NVNWSputpixel(off,-CurrColor);

I I

f I

fíllellipse(int x,int yjnt rx,int ry) { register int i; int Xe,ve,ya,xa,colortemp;

colortemp = -CurrColor; - CurrColor = -CurrColorFill;

- CurrColor = colortemp;

{ register4nt i;

int Xe,Ye,nvij;

long int p,off,

if(ini < O) /* angulos negativos */ ini = (ini % 360) + 360;

else /* angulos positivos */ ini = ini '70 360;

if(fín < O> fin = (fin '70 360) + 360;

else fin = fin % 360;

if(ini >= fin)

UNIVERSIDAD AUTONOMA METftOPOLITANA "IAAPAIAPA"

70

PROVECTO UE INVESTIGACION

fin += 360;

in1 = (long)ini*-P"OSxCURVA/360: fin = (long)fin*-PTOSxCURVA/360;

j = abs(fin-ini); for(i=O ; i<=j ; i++)

f ini %= -lTOSxCURVA.

* Xe = x + (((1ong)m * -cos[ini]) >> IO); Ye = y - (((1ong)ry * -sen[ini]) >> 10);

++ini:

if(Xe>=-Resx 1 1 Xe<O 1 1 Ye>=-Resy 1 1 Ye<O) : /* coordenadas fuera de la pantalla*/

else . . . . . . .

bar(int leftjnt top,int rightjnt bottom)

if(lefi > right)

- intercambia(top,bottom); 1

colortemp = -CurrColor;

For(i=top+ l;i<bottom;++i)

- CurrColor = colortemp;

CurrColor = -CurrColorFill;

- Hline(left+ 1,right- 1 ,i);

UNIVERSIDAD AUTONOMA METROPOLITANA "IAAPAIAPA"

71

drawpoly(int num,int vertices[]) /* solo funciona de tres puntos en adelante */ { register int j=O;

for(j=Oj<2*num-2;)( j+=3; line(*(vertices+j),*(vertices+(j--)),*(vertices+~--)),*(vertices+(i--))); j+=2;

I

I

- comparaguntos(int *x,int *y){ /* utilizada por qsort() en fillpoly() */

1 return((*x)-(*y));

{ int i,ymax,ymin,~m,l1,12,y;~.:,~:~~::~.~.:.:~~:,~~. int xl,x,lj,ml; ..

int lista[ lo]; .................. ...... >.'\'.::: ...:. . < . :::r::,. ..<.'. ......... ,. int colortemp;

.,..)~:<;.;,..'<': .............. : ,,.:.:,>.,;',,'..; .;,: ........ .......

.:::~~,::i:.j.:,'":: <.:..S

... ... n=n*2; ...... ..............

.."...............,......

m=O; .....

'. I. .:.: . :-. . . . ..>, . :I, ....... .......... ..,~:..:;~i:;;:.'~:;

::!:.y:;?. ,~ ,_.;

....................... : .: :.., ~..:. ....,.....y; .................. ........... . :.:...

................

.._,: .:..:. , ......... .................. ..... : ..,.. ' , 5 ... :;. . . . .,... ..... ....... . .... . . . . I ............... , ..... ...\ ~ :',. ...., >;.. > .................... ......................... .....

ymin=vertices[l]; ymax=vertices[ 13;

ymin=vertices[i]; else { if(vertices[i]>ymax) ymax=vertices[i];

I 1 /* calcula el min y el max de las y's */

for(y=ymin;y<=ymax;y++) { for(k=l;k<n;k+=2) { if(0r"yertices[kl> && ((long)(y-vertices[(k-2+n)%n])*(long)O.-vertices[(k+2)%n])<O))continue; if((long)(y-vertices[kl)*(long)O.-vertices[(k+2)%n])<=O && vertices[k]!=vertices[(k+2)%n])

{

UNlVERSlDAD AUTONOMA METROPOLITANA 'IZTAPAIAPA"

72

Caalb*bdlarm ElEUOlECA DE FUNCIONES GRAFICAS V GRAFlCACION PWEDRAL

x=(2*(long)(vertices[(k+l)%n]-vertices[k-l])*(long)(y-vertices[k])+1)/(2*(vertices[(k+2)%n]- vertices[k]))+vertices[k-11;

lista[m]=x; m++;

3 1 qsort(lista,m,2,~comparaguntos); colortemp=_CurrColor;/*para rellenar con el color de relleno actual*/ - CurrColor=_CurrColorFill; for(ml=0;ml<m;ml+=2)

m=O; - CurrColomolortemp;

- Hline(lista[ml],lista[ml+l],y);

1 colortemF-CurrColor; - CurrColor=_CurrColorFill; drawpoly(n,vertices);

if( COORD.clip = 1 ){ if((xl>COORD.right)~~(yl>COORD.bottom)~~(xl<COORD.le~)~~(yl~COORD.top))

1 return( 1); /*la salida se recorta en el borde de ventana actual */

> if( xl>=-Resx 1 1 x1<0 1 1 yl>=-Resy 1 1 y1<0 )

return( 1); /* coordenada fuera de la pantalla completa */

/* validacion para las ventanas de acceso VESA */ pix = (long)-Resx * y1 + x l ; nvi = (pix / -GRAN);

UNIVERSIDAD AUTONOMA MnROPOLTTAN.4 'UTAPAIAPA"

73

PROVECTO DE INMSl lGAUON Caalbamdtm

BlBUOlECA DE FUNUONES GRAFICAS Y GRAFICAUON POUEDRAL

if( (nvi >= -CurrWindow) && (nvi <= -CurrWindow + CCambioWindow - 2)) )

else { setwindow(0,nvi); 1 off = (pix - CCurrWindow * -GRAN) )% -TAMWINDOW;

int getpixel(int x,int y) { int colorp; long int pix; static int nvi; . . . . .

/* validacion para la salida d&&.ventana &alj&i&fu

. . . . . . . . . . . ..:, ............ . :.: ......... ..: . .........................

... .% .....

m=-

pix = (long)-Resx * y + x: nvi = (pix / -GRAN);

if( (nvi >= -CurrWindow) && (nvi <= -CurrWindow + CCambioWindow - 2)) )

else { setwindow(0,nvi); 1

colorp = (int)*CVideo +- pix); return(co1orp);

UNWRSIDAD AUTONOMA METROPOLITANA 'UTAPAIAPA"

74

PROYECTO DE INMSTIGAGlON BIBLIOTECA DE FUNGlONES GRAFICAS Y GRAFICAGlON POUEDRAL

int getmaxx() {

f return CXmax);

int getmaxy() {

1 return CYmax);

int getwindowacces() I* ya no se llama a esta funcion *I

union REGS r;

r.x.ax = Ox4F05; . . . . . . . . . .

r.x.bx = 0x0100; 'I 1

......... ......... . . . ...

......

r.x.ax = Ox4F05; r.x.bx = -NumWindow; r.x.dx = -Di.rWind,&,, . .; . ' . : .': :; .,,, :.: .,? :: . . '.

. . . . , . . . . . . . . .: ..................... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , . . . . . . . . . . . . . . . . . . . . . . .;; :;,. :;;. ': . . . . . . . . . . . . . . . . . . . .... . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . %

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : . , :. I . . . . . . . . . . . . . . . . . . . . . . . . . .: . _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ . . , . . . . . . :. \ '. . . . . . . . . . intSb(0x 1 O;&r,&r);

. .

- CurrWindow = -DirWindow:

setviewport(int left,int top,int rightjnt bottom& clip) { int temp;

if(1eft > right) { - intercambia(left,right);

> {

}

if(top > bottom)

intercambia(top,bottom); -

UNIVERSIDAD AUTONOMA METROPOLITANA "VTAPALAPA"

C.alb*bdl i i BIBUOTECA DE NNClONES GRAFICAS Y GRAFlCAClON POUEDRAL

COORD.top = top; COORD.lefi = left; COORD.httom = bottom; COORD.right = right; COORD.clip = clip;

I* limpia la pantalla completa (ventana grafka por default) *I cleardevice() { register unsigned int OR, int nvi,nv; long int p;

I* limpia la ventana grafka activa y la desaparece *I I* la nueva ventana activa es la pantalla completa *I

clearviewport() { regster int ij,k; static int nvi; long int p,oR,

- calcula-vent-off(COORD.top,COORD.left)

j 0.

UNMRSIDAD AUTONOMA METROPOLITANA "ETAPALAPA"

76

PROVECTO DE ImsncaaoN BIBLIOTECA DE NNClONES GRAFICAS Y GRMCACION POUEDRAL

setwindow(0,nvi) ;

do{ for(i=O;(i <= ((COORD.right) - (COORD.left)) );i++) {

if( off > -TAMWINDOW - 1 ) { off = (1ong)off % CTAMWINDOW - 1); Off";

nvi += -CambioWindow; setwindow(0,nvi);

for(k=i;( k<= ((COORD.right) - (COORD.left)) );k++) {

I i = k,

*(-Video + off++) = O;

COORD.bottom = -Ymax; COORD. right = -Xmax; COORD.clip . '= 'O; . . . . . . . . . . . . . . . . . . ... :...: ................. .... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . \ : . : . . . . . . . . . . . . . i.: : ! . . . . . . . . ...... .............. . . . . . . . .... . . . . . . . . ,_ .,- '' ; :-..

~

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . .. . . . . . . . . . . . . . . . . . . .

1 . . . . . . . . . . . . . : . . . . .

.,.-: :::. ':

. . . . . . : ' . .".

. . . . . . . . . . . . .: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - -. . . . . . . . . . . . . . . . . . . . . . . . . . , . . . . . . . . . . . ; \ , ..:, ~ I: ; ;

setcolor(int coloractual) {

I - CurrColor = coloractual;

setcolorfill(int color-fill)

- CurrColorFill = color-fill; }

UNIVERSIDAD AUTONOMA METROPOLITANA "IZTAPALAPA"

77

C . a l t * b d i i BlBUOlECA DE NNClONES 6RAHCA.S Y 6RAFlCAUON PWEDRAL

outtext(char *cad) {

ifCLastX < O 1 1 -LastY < O ){ /* valida coordenadas fuera de la ventana */

movet<LastX + strlen(cad)*S,-LastY); return( 1);

1 - outtext(cad);

1

outtextxy(int x,int y,char *cad)

- LastX = x; - LastY = y;

- outtext(char *cad) { /* OxC7210016 en las del centro de computo*/ char far *ap; .I' ' '. . _.. , . , . , . . ...... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....... . . . . . . . . . . . . .

long offaux,off,om,P;:j ..: I: ..:: :

int nvi; . . . . . . . I . . . . . . . . . . . ..... .. . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . .: ;. . . . . . . . . . . . . I ... :. :. . . . . . . . . . . . . .

' .,:; ' . . . . . . . . . . . . . I , .:

: . . . . . . ...... . . . . . .: >..

I . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .:.. :;,. ' , '< ' ' : : .; . . . . I .' .

I

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I ~

. . . . . . . . . . . .

int ij,avanza-car,largo-caja; char C ;

ap = PtrBiosFontSx 16; largo-caja = 16;

p = (long) -Resx * -LastY + -LastX: off = p % -GRAN;

om = off + -Resx * largo-caja; /* para saber si las ventanas son traslapables*/ if(ofT2 < TAMWINDOW){ /* la salida de la cadena de texto cabe en una sola ventana */

nvi = p/-GRAN; setwindow(0,nvi);

offaux = oE,

UNMRSIDAD AUTONOMA METROPOLlTANA "ETAPALAPA"

78

PROVEGlO DE INMSTIGAUON C r a h d l i

BIBLIOTECA DE NNUONES GRAFICAS V GRMCAUON PWEDRAL

avanza-car = O;

while(*cad) { C = *cad++; off = offaux + avanza-car; avanza-car += 8;

f

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPAIAPA"

79

PROVECTO DE INMSTIGAClON b & & d d l m

BIBLIOTECA DE NNClONES GRAflEAS Y GRAflCACJON PWEDRAI

int gety(void) {

1 returnCLastY);

int getx(void) {

f returnCLastX);

int getcolor() { returnCCurrColor);

r.h.al=OxlO; r.x.bx=k; r.h.ch=gieen;. . , . . . . . . . . . ~ . . . . . . . . . . . . ..:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . r.h.cl=blue; .: r: : .. :. .~ . . . . . . . . . . . . . . . I : . . . . . ...... . . . . . . . . . . .....

: , . . . . '. :..; : . . . . . . . . . . . . . . " . . . . . . . . . . : . . . . . . . . . . . . . . . " . .

r. : c.' .... ,: . . . . . . . . . :: ..:. . .: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . .

.. ~

int86(0x 1 O,&r,&r);

set-cambiabloque(int ini,int tam,struct RGB far *Dac) { struct REGPACK r;

r.r-ax=Ox1012; r.r-bxini; r. r-cx=tam; r. r-dx=FP-OFFpac); r.r-es=FP-SEG(Dac);

intr(OxlO,&r); f /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

#endif GRWH-VESA

UNIVERSIDAD AUTONOM MfTROPDLlTANA 'IZlAPAIAPA"

80

PROYECTO DE INMSPGAUON

. . . . . . . . . . .

. . . . . . . . .

. . . . . . . . . . . , : . . . . . . . . . . . . . . . . .

UNWERSIDAD AUTONOMA METROWLITANA "IZTAPALAPA"

81

I* ARCHIVO "3D.H' *I

I* ARCHIVO QUE CONTIENE LAS FUNCIONES NECESARIAS PARA REALIZAR GRAFICACION */ /* POLIEDRAL , FUNCIONES DE ROTACION, TRASLACION, ESCALACION *I #include <alloc.h> #include <ctype.h> #include <math.h> #include <stdlib.h> #include <time. h> #include <gvesa256.h> I* archivo que contiene nuestra libreria *I

#define SALIR 13

#define TECLA-NO-UTIL 14

/* banderas para identificar la posicion de los planos respecto al OBS */ #define mismos 1 #define opuestos - 1

#define apvert l ((struct PLANOS *)PLANOl) #define ap-vert2 ((struct PLANOS *)PLAN02)

UNIVERSIDAD AUTONOMA METROPOLITANA 'IZTAPAMPA"

82

PROVECZO DE INMSllGAUON BlBUOTEeA DE FUNUONES GRAflCAS V GRAfleAUON POUEDRAL

typedef struct {

}PUNTO; double x,y,z;

struct PLANOS { int nogtos; PUNTO *p; 1;

/* parametros del observador */ PUNTO OBS = {0,0,700 }; /* punto de observacion */

PUNTO Al={ l,O,O}, A2=(0,1,0f, A3={0,0,1}; /* vectores para los ejes del nuevo sistema de coordenadas */

double offsx,offsy,offsz; /* para el desplazamiento del nuevo origen */ double D=700; /* distancia del &servador.d.plwc$e.,

int comparaglanos(); PUNTO r e s t a - v e c t o r ( P U N T D ~ , ~ ~ ~ ~ ~ O v 2 ) ~ ~ ~ 3 ~

,;, .,,: 'j.,'::',:';.:., ......................... '..:.% ., . - s . \ ,,.. ::. . .; ..,...,. ....... .....................

PUNTO producto cruz(P~j$J, j?UNTO v2j$;,:' .............. ...a ................... ..!, ................

PUNTO divide-v&tor(PW~.~:$;dou~le num);;:. .. ... ,,.,,.

... ... ....... ....... ... .............. . ...:..: :.

PUNTO normaliza-vectoi@BRQ vt j;:;., . . :; .~~.~,~~..:..,.~,~:,', ..: ?'..

........ ...,,: ~ ..:. ;. ...' double productoqunto(F~O~v1, I

;c.;:::

. . . ....................... ~ .. .._: ............ ........ ..... \ . I>.-._. .... ~ ..... >,. ;,' ....... .. .... .. ... ... ~.:...:: ...: .::.::.::.\ ....,.. ..,:.;:::. ..;....... ...<. ........... ....... :_ , .... ...............

... . : .;/, ::-:::': .....................

i . . . ........ ............

<...::..: ........ . ... :.....;..:.!..

_, ..; .,., . .... ; .. ............... ............ ..........

PUNTO transformagtos-nvo-sistema(doub1e xw,double yw,double zw); PUNTO proyectaguntos(PUNT0 pto);

. . . .

int dX = 5, dY = 5, dz= 5, dD = 30, drawmode = ORTOGONAL;

double rotsen,rotcos; double angulo~x=lO,angulo~=lO,angulo~z=lO;

draw-3d(struct PLANOS Plan[],int NumPlanos,int Proy-Persp) { int ij,k,ban=O; int cad[30];

UNIVERSIDAD AUTONOMA METROPOLITANA 'UTAPAIAPA"

83

C p a k k b d l i BIBUOlECA DE FUNUONES GRAHCAS Y GRAHCAUON POUEDRAL

PUNTO Proyectado; static int OPCION; OPCION = Roy-Persp;

setviewport( 1,2 1 ,getmaxx()- 1 O 1 ,getmaxy()-2 1,l); /* sobre esta ventana salen*/ /* los objetos */

qsort(Plan,NumPlanos,sizeof(struct PLANOS),comparaglanos); setcolor( 15);

if(OPCI0N = ORTOGONAL){ /* dibujar el objeto solo con proyeccion ortogonal */ for(i=O;i<NumPlanos;i++){

for(k=O;k< ( ((struct PLANOS *) Plan + i)->nogtos)*2;k+=2){ cad[k] = ((struct PLANOS *) Plan + i)->p[M2].x+320;

cad[k+l] = ((struct PLANOS *) Plan + i)->p[W2].~+240;

cad[k] = Proyectado.x+320; cad[k+l] = Proyectado.y+240; if(((struct PLANOS *) Plan+i)->p[k/2].~<=5)ban=l;

1

if(ban=O){ setcolorfíll(2); fillpoly(Plan[i].nogtos,cad);

1 ban=0;

1

UNlVERSlDAD AUTONOMA METROPOLITANA "IZTAPAIAPA"

84

comparaplanos(void *PLANO 1 ,void *PLAN02) { double zlmin,zlmax,z2min,z2max,Zaux; register int k; PUNTO a,b,c,n; double punto=0.0,punto2[10],condpto2[ lo]; int surna=O,esta-sglano=O;

zlmin = zlmax = ((struct PLANOS *)PLANOl)->p[O].z; for(b0;k < ((struct PLANOS *)PLANOl)->nogtos;k++)(

Zaux = ((struct PLANOS *)PLANOl)->p[k].z; z 1 max=Zaux > z 1 max?Zaux: z 1 max; if(Zaux < zlmin)

z 1 min = Zaux; 1

/* aqui implementar el segundo metodo por vectores */

else{ a = resta~vector(ap~vertl->p[O],ap~vertl->p[l]); b = resta-vector(ap-vertl->p[2],ap-vertl->p[1]);

n = producto-cruz(a,b);

c = resta-vector(OBS,ap-vertl->p[l]);

punto = productogunto(n,c);

for(k=O;k < ap_vert2->nogtos;k++){ punto2[k] = productogunto(n,resta~vector(ap~vert2-~p[k],ap~vertl-~p[ 11));

UNIVERSIDAD AUTONOMA MITROPOLITANA "ITTAPAMPA"

85

PROYECTO DE INMSTIGAGION

if(punto2[k] > O)

else if(punto2[k] < O)

condgto2[k] = mismos;

condgto2[k] = opuestos;

else { condgto2[k] = O; esta-sglanot+:

suma = suma + condgto2[k];

/* esta funcion es la que transforma los puntos del mundo real al sistema */ I* de coordenadas del observador */ PUNTO transformagtos-nvo-sistema(doub1e xw,double yw,double zw) { PUNTO Ptransf; /* D es la distancia del obs. al plano de proyeccion */

Ptransf.x = (xw * A1.x + yw * A1.y + zw * A1.z ); Ptransf.y = (xw * A2.x + yw * A2.y + zw * A2.z ); Ptransf.z = (xw * A3.x + yw * A3.y + zw * A3.z );

return (Ptransf); }

UNIVERSIDAD AUTONOMA MElROPOLllANA "ITTAPAMPA"

86

Craatkbdtam BIBUOTECA DE FUNCJONES GRAFICAS Y GRAFIWCJW POUEDRAL

PUNTO proyectaguntos(PUNT0 pto) { PUNTO pt;

if( pt0.z != O ){ pt.x = (pto.x)*D/pto.z; pt.y = (pto.y)*D/pto.z;

pt.z = pt0.z;

else{ pt.x = (pto.x)*D; pt.y = (pto.y)*D; pt.z = pt0.z;

f

return pt:

. . . . . . . . . . . . f ........................ . . .

return d; . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :: :' : :

. . ': ., '. . . . . . . . " . . : . , :. .. , . : . . . . :. :

: .': .: . . . . . . . . . . . . . . . . . . . . . . . ......... . . . . . ........ ~ . _ :. z . . ....

. . :. . . . . . . . . .

. ., I . I .. ,

. . . . : . . . . .: : : : , .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ........... . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . :. > '.

PUNTO surna-vector(PUNT0 VI ,PUNTO ~ 2 ) t PUNTO d;

d.x = v1.x + v2.x; d.y = VI .y + v2.y; d.z = v1.z + v2.z;

return d; 1

PUNTO producto-cruz(PUNT0 v1,PuNTO v2) { PUNTO c;

c.x = (v1.y * v2.z) - (v1.z * v2.y); c.y = (v1.z * v2.x) - (v1.x * v2.z); c.z = (v1.x * v2.y) - (v1.y * v2.x);

UNIVERSIDAD AUTONOMA METROPOLITANA "ITTAPAMPA"

Caalt*bdlisrm BIBUOTECA DE FUNCJONES GRAACAS Y GRAACACJON PWEDRAI

return c; }

double productoqunto(PUNT0 v1,PUNTO v2) /* vlúv2 */ { return( (v1.x * v2.x) + (v1.y * v2.y) + (v1.z * v2.z) ); 1

if(d=O) return vl ;

v1.z =vl.z / d;

return v 1 ; }

double magnitud(PUNT0 vl) {

t return (sqrt(vl.x*vl.x + v1.y * vl.y+ v1.z * v1.z));

UNMRSIDAD AUTONOMA METROPOLITANA “ITTAPAUPA”

88

I* codigo para hacer transformaciones interactivas *I

transformaciones-interactivas(struct PLANOS P[],int NumPlanos)

int tecla.

rotsen=O; rotcos=l;

case ORTOGONAL: .. drawpode = ORT.QG.QN,&;. .. I: ..... .I ....... ~, . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~ . . . . . % . . . . . . . . cl(imlev$y I., .. :.: ..;; i . ,: :: . . . . . . . . . . . . . . ~ .............. c.. :: . . . . . .

. ..: ... , < ..... ~ ' d r & w - ~ ~ p ~ ~ u m P 1 ~ o ~ , ~ ~ o d e ~ i : * . , . . . ' : . : . . : ' . y :. :: . . . . . . . . . . . . . . . . . . :

. . . . . . . . . . . . . . .

: , . I . . ,

. . . . . . : . : . . . . . . . . . . . . . . . . . . : . . : . , :. I .. , , . y: ;.

break; case PERSPECT1VA:drawmode =PERSPECTIVA;

clearviewport(); dra~-3d(P,NumPlanos,drawmode); break;

break;

break;

case W P M : moverqlanogroyeccion(P,NumPlanos,NEG);

case AV-PAG: moverglanogroyeccion(P,NumPlanos,POSIT);

case TECLA-NO-UT1L:break; case SALIR: exit( 1);

default: break; }

} }

UNMRSIDAD AUTONOMA METROPOLITANA 'UTAPALAPA"

89

PROYEClO DE INMSTIGAUON Cpadhdlarm

BIBUOTEC.4 DE NNUONES GRAFlCAS Y GRALlCAUON POUEDRAI

int getkey() { int TECLA; int tecla;

tecla = getch();

I* tipo de proyeccion con O o P *I case 79: I* o *I case 1 1 1 : TECLA = 0RTOGONAL;break. case 80: I* p *I case 112: TECLA = PERSPECT1VA;break; case 27: TECLA = SALIR;

break, default : TECLA = TECLA-NO-UTIL;

break;

1 return(TECLA);

}

trasladar(struct PLANOS P[],int NumPlanos,int eje,int direc)

UNlVERSlDAD AUTONOMA METROPOLITANA "UTAPALAPA"

90

Cgadiabdlinm BIBUOl€CA DE FUNElONES GRAFlCAS Y GRAFICAEION PWEDRAL

{ register i j ; int delta; PUNTO ptoro,point,trasl;

clearviewport(); if(eje = ejex>{

if(direc = NEG) delta = -dX;

else delta = d X ;

tras1.x = delta; tras1.y = O; tras1.z = O; for(i=O;i<NumPlanos;i++){

tras1.x = O; tras1.y = delta; tras1.z = O;

for(i=O;i<NumPlanos;i++){ P[i].p[O].y += tras1.y; P[i].p[l].y += tras1.y; P[i].p[2].y += tras1.y; P[i].p[3].y += tras1.y;

I 1 else if(eje = ejeZ){

if(direc = NEG)

else delta = - d Z ;

delta = d Z ;

UNIVERSIDAD AUTONOMA METROPOLITANA 'IAAPAIAPA"

91

Caalb*bdli PROYECTO DE Iruwsnwxw BIBUOTECA DE FUNCIONES GRAHCAS Y GRAACACION POUEDRAL

tras1.x = O; tras1.y = O; tras1.z = delta;

for(i=O;i<NumPlanos;i++){ P[i].p[O].z += tras1.z; P[i].p[l].z += tras1.z; P[i].p[2].z += tras1.z; P[i].p[3].z += tras1.z;

1 1

rotar(struct PLANOS . . . . . . . . . . P[],i.nt NumPlanos,lnt ejejnt di,rec) { register int i j ; ........ .:, .<: ..... : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : .: . .'! :.: <; ,, :.; ,,: :; . , ' . . . . . . . . . . ... . . . . . . ... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I . . \ . : i

.;; :;,. :,.:. ' : ~ I

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : . . . . . . . . . . . . . . . . . . . . . _ . . . . . . . . . . . . . . . . . . _ .

. . . , . . . . . . .

:. . '.

double temp;

if(eje ==ejeX){

rotsen=sin(angulo_x*M-PI/lSO); rotcos=cos(angulo-x*MPI/l S O ) ;

for(i=O;i<NumPlanos;i++){ temp= P[i].p[O].y * rotcos +(&rec)*P[i].p[O].z*rotsen; P[il.p[Ol.z = -(direc)*P[i].p[O].y * rotsen + P[i].p[O].z*rotcos; P[i].p[O].y=temp;

temp= P[i].p[l].y * rotcos + (direc)*P[i].p[l].z*rotsen; P[i].p[l].z =-(direc)*P[i].p[l].y * rotsen + P[i].p[l].z*rotcos; P[i].p[l].y=temp;

UNWRSIDAD AUTONOMA METROPOLITANA "IZTAPALAPA"

92

PROYECTO DE IwsnaaoN C.a&k-bdIam

BlBUOlEM DE FUNCIONES GRAFIMS Y GRAnMCION PWEDRAL

temp = P[i].p[2].y * rotcos + (&rec)*P[i].p[2].z*rotsen; P[i].p[2].z = -(direc)*P[i].p[2].y * rotsen + P[i].p[2].z*rotcos; P[i].p[2].y= temp;

temp = P[il.p[3].y * rotcos + (&rec)*P[i].p[3].z*rotsen; P[i].p[3].z = -(direc)*P[i].p[3].y * rotsen + P[i].p[3].z*rotcos; P[i].p[3].y = temp;

f f

if(eje ====ejeY){

rotsen=sin(angulo_y*M-P1/180); rotcos=cos(angulo_y*M_P1/180);

for(i=O;i<NumPlanos;i++){

temp = P[i].p[3].x * rotcos + (direc)*P[i].p[3].z*rotsen; P[il.p[3l.z = ~(d~rec>*P~i].p~3].x.*.~oisen,~,P[i].;~~~].z.*.rotc,os; . . . . . . . . . . . ;:,. . . . . . . .I . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

P[i].p[?].x,~ temp,, ... :; ::'.:, . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....... . . . . . . . . . . . . . . . . . . ..... _. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

. . . . . . I - . ,. . '..' .

I . ::;,

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . ~. .; ' . , :

I

. . . . . . . . . . . . . . . . . . . . . . : . . . . . . . . . . . . . . . . . . ~

. . .. \ . . .

f

if(eje ==ejeZ){

rotsen=sin(angulo-z*M PI/l80); rotcos=cos(angulo_z*M~P1/180);

for(i=O;i<NumPlanos;i++){

temp = P[il.p[Ol.x * rotcos + (direc)*P[i].p[O].y*rotsen; P[il.~[Ol.y = -(direc)*P[il.p[O].x * rotsen + P[i].p[~].y*rotcos;

P[i].p[O].x =temp;

temp = P[i].p[l].x * rotcos + (direc)*P[i].p[l].y*rotsen; P[i].p[l].y = (direc)*P[i].p[l].x * rotsen + P[i].p[l].y*rotcos;

P[i].p[l].x =temp;

UNIVERSIDAD AUTONOMA METROPOLITANA "IITAPALAPA"

93

temp = P[i].p[2].x * rotcos + (direc)*P[i].p[2].y*rotsen; P[i].p[2].y = -(direc)*P[i].p[2].x * rotsen + P[i].p[2].y*rotcos;

P[i].p[2].x =temp;

temp = P[i].p[3].x * rotcos + (direc)*P[i].p[3].y*rotsen; P[i].p[3].y = -(direc)*P[i].p[3].x * rotsen + P[i].p[3].y*rotcos;

P[i].p[3].x =temp; }

>

clearviewport(); dra~-3d(P,NumPlanos,drawmode);

UNWRSIDAD AUTONOMA METROPOLITANA "ITTAPAMPA"

94

C.a&illtudlsrm BlBUOlEC.4 DE NNUONES 6RMC.4S Y 6RAFlCi4UON PWEDRAI

NI . . , H . ?,

. . .

7 $t . . . . . . . . . . . . . . . . .

: \ . . . . . . . . . . . . . . . . . . . . . . . . . . . :. ... . . . . . . . . . . . . . . . . . . . . . . . . ......

. . % .

. . .

UNIVERSIDAD AUTONOW METROPOLITANA "IZTAPALAPA"

95

#include <3D.h> /* 3D.h contiene las operciones necesarias para realizar la graficacion poliedral*/ #define N 20 #define M 20

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ I* FUNCIONES A EVALUAR *I /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

struct oper{ char nom[l4]; int clave; >;

struct oper nombres[ ]=

"kO",O, 7 1, "+"

I1 I, - , 2, 2 3,

"I", 4, > 5,

"SIN",6, "COS",7, "TAN",S, "ASIN",9, "ACOS", 1 O, "ATAN", 1 1, "ABS",12,

I1 * I t

IIAII

. . . .

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . *f

/* declaración de las funciones usadas en este programa *I

float opera(char *oper, float operl, float oped); max-min(char *cadl,char *cad2,char *xmin,char *xmax,char *ymin,char *ymax); int busca(char *S); float evalua(char s[50]); analiza(char *s,char *oper,char *opl,char *op2); sustituye(char *s,char *sl); asigna-mem(struct PLANOS Planes[N*M],int nJ); generaqtos(char *expl,char *cadl, char *cad2);

/* Función que se encarga de reconocer los límites que el usuario introduce */ /* como parametro para conocer los rangos de evalución de las variables. */

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

UNMRSIDAD AUTONOMA METROPOLITANA 'UTAPALAPA"

96

max-min(char *cadl,char *cad2,char *xmin,char *xmax,char *ymin,char *wax) { int i,kj,l; int banl,ban2,ban3;

banl=ban2=0; i=j=kO.

I* para la x *I

for(i=O;cadl [i];i++) { if(cadl[i]!='=' && cadl[i]!='<' && banl!=l)

{ xminu]=cadl[i]; j++; I

else

I* para la y *I

UNIVERSIDAD AUTONOMA METROPOLiTANA 'IZTAPAIAPA"

97

BlBUOlXC4 DE FUNGlONES 6RAFlCAS V GRAFIGIACION POUEDRAL

}/*end for*/ yminlj]='luO'; ymax[k]='kO';

f

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ I* Función que se encarga de buscar en una lista predefinida, las operaciones que *I /* pueden ser reconocidas y evaluadas por el programa */ /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ int busca(char *S) { int p; for(p=O;p<=12;p++) {

if(strcmp(nombres[p].nom,s)==O) return(nombres[p].clave);

int k,i=O; char s1[150]; int finparjnicpar;' . . . . . . . . . . . . . ........ ~ ................ :. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

float resul,operj,opei2i. '.:. :,,, ... :; 1.-..:. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ?. . . . . char op1[85],o~~,[.853,fijperI~0]';fopl[Obj;.: .' '.:.:: :: . :..' . . . . . . . . . . . . . . . . . . . . ......... , ;. . . . , : '.

char oper[ 151; int ban=O; int l,par,parent=O; int letra=O; char cad[ 1501; int borra = O;

. . . . . . . . . . . . . . . . : .: ,': :: i / , , :.:.,:. :; . :. . .: .,. :;~. .; : .,; .I,:' . . . . . . . . . . . . . . . . . . . . . . . . . . . .

k 0 ; cad[O]='kO': l=strlen(s);

for(i=O;s[i];i++) { if((~[i]='+'(~s[i]='-'~~s[i]='*'~~s[i]='~)&&(s[i+~]='+'~~s[i+~]='-'~~~[i+~]='*'J~~[i+~]='/'~~ { puts("ERR0R: Tiene 2 o mas operandos juntos");

UNlVLRSlDAD AUTONOMA METROWLITANA ''IITAPALAPA"

98

BlBUOTEeA DE FUNCIONES G R M W S Y GRAFleACION PWEDRAL

getch0; exit( 1): 1 1 if(l=l) resul=atof(s);

else { for(i=O;i<l;i++) { p-o; if(s[i]!='+' && s[i]!='-' && s[i]!='/' && s[i]!='*') { if(s[i]='(') {

inicpar=i; do { if(s[i]='(') f

if(s[i]='\xO' && par!=O) {

1 else 1";

1 else {

if(isalpha(s[i])) letra= 1 ;

else f if(s[i]!=' ') { cad[k]=s[i]; k++; cad[k]='\xO'; 1

UNIVERSIDAD AUTONOMA METROPOLITANA "IITAPALAPA"

99

PROYECTO DE INMSTIGAClON BlBUOlECA DE FUNClONES GRAflCAS Y GRAflCACJON PWEDRAL

1 1 } else ban= 1 ;

} /* end for */

if(s[O]='(' && s[l-1]=')') f if ( p a r e n e o 1 1 (inicpa-O && finpa-l-1)) { s[O]=' ': s[l-l]='\xO'; borra = 1; 1

1

if(ban=O && letra=O && paren-0) resul=atof(cad);

else { analiza(s,oper,opl,op2); operl=evalua(opl); oper2=evalua(op2); resul=opera(oper,oper 1 ,oper2); }

return(resu1); I

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /* Función que se encarga de realizar la operación que le sea pedida por la */

UNlVLRSlDAD AUTONOMA METROPOLITANA "IZTAPALAPA"

1 O0

PROVECTO DE INvEsnauoN BIBLIOTECA DE FUNGlONES GRAFlCAS V GRAHCACION PWEDRAL

/* función que la llama, siempre y cuando esta operación este aceptada por */ /* el programa, regresa el resultado de la operación realizada */ /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ float opera(char *oper,float oper1,float oped){ float resul 1 ; char op[5]; int x;

x=busca(oper);

switch (x){

case 1 : { resul l=operl+oper2; return(resul1); 1

return(resul1); }

case 5 : { resul l=pow(oper l,oper2); return(resul1);

I

case 6 : { resull=sin(operl); return(resul1); }

case 7 :

UNIVERSIDAD AUTONOMA METROPOLITANA "IITAPAIAPA"

101

PROVECTO DE INMSTIGAClON BlBUOTEEA DE NNClONES GRAFICAS Y GRAFlEAClON PWEDRAL

{ resul l=cos(oper 1); return(resul1); }

case 8 : { resull=tan(operl); return(resul1); 1

case 9 : { resull=asin(operl); return(resul1); 1

case 10:

case 12: { resull=abs(operl.); , . . : return(resu1l);: .: .:. :. : .I : .: .... . ....... ....... .... . . . . . . . . . . . . . . .

I

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ..;,. . . . . . .:.. :;,. :,.; . . . . . . . . . . . .

. .;,. . , ' . . . . . . . . i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . _ . . . . . . . . . . . . . . . . I :. :. I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : . , .:. I

. . . . . . _ . _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. .

. . . . . . . . . ,

. . . .

case O: { return(oper1); }

1 f

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /* Función que se encarga de analizar la expresión introducida por el usuario */ /* esto es que revisa que no existan errores lexicos ni sintacticos, para así poder*/ /* proceder a evaluarla. */

analiza(s,oper,op 1 ,op2) char s[l50],oper[5],opl[85],op2[85];

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

UNWRSIDAD AUTONOMA Y ~ R O P O L I T A M "IITAPALAPA"

102

BIBLIOTECA DE NNWONES GRAflCAS Y GRAFlEACION POUEDRAL

int p ~ 0 ; int i,l,t,prec=O; int j=O,k=O; char opers[20]; int mas,menos,por,divi,psm,posmm,posd,posp,exp; mas=menos=pom&vi=posm=posmm=posd=posp=exp=O;

opers[O]='kO'; oper[O]='\xO'; opl [O]='\xO'; 0p2[o]='\xo';

for(i=O;s[i] != '\xO';i++) f

switch (s[i]){

case '+' : {

opersu]='+';

case {

menos= 1 ; posmm=posmm+ I ;

'break; } .:. - , ' .. : .: -:.: :.: < .,,, :.: ,,: :: . , '. . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . ~ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

:: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

I . .:.. :;,. :;:. ': : :' . ' . . . . . . . . . . . . . : . . .

..... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . t . . . . . : . . . . . .l. .: . . . ..... :: . .

. . . . , . . . , . . :

case I*' : {

operslj]='*'; j++; opersfi]='\xO'; pOl=l; posP==sP+1; break;

1

case 'P : {

opersu]='/'; j++; opersfi]='\xO'; divi= 1 ;

UNIVERSIDAD AUTONOMA M~ROPOLITANA "WTAPALAPA"

103

C r a l t * b d l i i BIBLIOTECA DE FUNUONES GRMCAS Y GRMCAUON PWEDRAL

posd=posd+ 1 ; break;

1

case I A ' : {

exp= 1 ; break;

case '(' : { do{

if(s[i]="(')

else p a q a r + 1 ;

exit( 1); 1 1"; . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . :'break; 1 , :. :; :. : . . . . . . . . . . . ............ . . . . ,: 1

. . . I . :. :. . . I . . . .... . . . . . . . . . . ......... .... . . ... . ......... ... . . % .

. . . . . . . . . . . . . . . . . . .: :L.:. : : .I. :' . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . : i

... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . _ . t . - . . . . . . . . . . . . . . . . I . .

. . . . . . . . _ . :

. -.

} /*end switch*/ }/*end for*/

if(opers[O]!='\xO') { if(mas=l 1 1 menos=l) /* esto es solo para tomar el mas o el menos*/ { prec= 1 ;

j=O; posm=posm+posmm;

1=0;

for(i=O;l!=posm;i++)

UNIVERSIDAD AUTONOMA METROPOLITANA "IZTAPALAPA"

104

BIBLIOTECA DE NNClONES GRAFlCAS Y GRAFlCAClON PWEDRAL

if(s[i]='(') 1 P-o; do( if(s[i]='(') par=par+ 1 ; else { if(s[i]=')') paFpar- 1;

} oplu]=s[i];

j++; opl U]='\XO'; i++;

UNlVERSlDAD AUTONOMA METROPOLITANd 'UTAPAIAPA"

105

Caalbirtldtarm BIBUOlECA DE NNCJONES GRMCAS Y GRAHCACION PWEDRAL

}/*end else*/ }/* end for *I

k=O;

while(s[i]) f op2[k]=s[i++]; op2[k+ I]='\xol; k++ ; } /*end while*/

}/* end if mas=l 1 1 menos=l */

/* Para el signo * y el sigo / *I

{ if(s[i]='(')

else par=par+ 1 ;

{ if(s[i]=')') pa-ar- 1 ;

} oplb]=s[i]; j+t; opl fi]='\XOl;

i++; }while(par!=O && s[i]!='\xo');

if(s[i]='\xO' && par!=O) {

UNIVERSIDAD AUTONOMA METROPOLITANA "ETAPALAPA"

106

PROVECTO DE INMSTIGAUON BlBUOTEeA DE FUNUONES GRAFWAS Y GRAflCAUON PWEDRAL

puts("Error : falto cerrar un parentesis"); getch0; exit( 1);

I

)/*end iP /

if((s[i]='*'II s[i]='/') && 1-==spl) { oper[O]=s[i]; 1++; oper[ l]='\xO'; } else { if((s[i]='*' 1 1 s[i]='/') && { I++; .. . . . ...

l<=posp 1)

}/*end else*/ }/* end for *I

while(s[i]) { op2[k]=s[i++]; op2[k+l]='\xO'; k++; } /*end while*/

}/* end if po-1 1 1 divi=l && proced */

} /*end if opers[i]!='\xO'*/

UNIVERSIDAD AUTONOMA METROPOLITANA "IZTAPAIAPA"

107

if(mas=O && menos=O && por-O && divi=O) {

k=j=O; if(exp-1) { for(i=O;s[i]!='" && s[i];i++) { opl[k]=s[i]; k++; opl[k]='\xO'; I &O; if(s[i]='"') f

oper[O]='"; oper[ l]='\xO'; i++;

if(s[i]!=' ') { opl u]=s[i]; j++; opl U]='\XO';

I I

UNIVERSIDAD AUTONOMA METROWLITANA "ETAPALAPA"

108

op2[0]=0; op2[ l]='\xO'; }/*end for*/ }/*end else*/

}/*end if mas=O,menos=O,etc;*/ 1

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

/* Se encarga de sustituir en la expresión ha gráfkar una variable por su valor */ /* numerico, de acuerdo a el rango dado como parametro para cada una de estas */

sustituye(char *s,char *sl) { int i,kJ,l; char aux[40]; char r[80]; char auxl[80]; i=j=kI=O.

I++; aux[l]='\xO';

&O; for(i=O;s[i];i++) i

if(s[i]=sl[O]) f for(j=O;auxfi] ;if+) { r[k]=auxfi]; k++; 1

else { r[k]=s[i]; k++;

i

UNMRSIDAD AUTONOMA METROPOLITANA WTAPAIAPA"

109

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ /* Función que reserva memoria para guardar los puntos que se van generando */ /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ asigna-mem(struct PLANOS Planes[N*M],int n q ) 1 register int i j ;

for(i=O;i<N;i++){ for(j=O$Mj++){

Planes[M*i+j].nogtos=ng;

I* Función principal que llama a todas las funciones anteriores y cuyo objetivo es *I /* obtener los puntos que a grS1car de la expresión dada como parámetro */ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . *,! generaJtos(ch+ *expljjchar *cad1 .char *c+QF.: :i' j ..; : :.

{ char umin[20],umax[20],vmin[20],vmax[20]; char expre[ 1501; double Du,Dv,a,b,c,d,e; char varu[40],varv[40],u1[20],v1[20]; int i j ; double um,umm,vm,vmm;

. . . . . . . . . . . . . ... _\ . : . . . . . . . . . . . . . . ..:. ..... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .:; :;,. ;,.<. ': . . . , . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .......:..... . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . \ . . . . . . . . . : . . I . . . . . . . . . . . . . . . . . . . . . . . : i . . . . . . . . . . . . . . . . . . . . . . . . . . . . : . . . . . .

. . I

.-: . . . . . \ .

a=(). +O. c=O. 3 3 ,

max~min(cad1,cad2,umin,umax,vmin,vmax); um=atoi(umax); umm=atoi(umin); vm=atoi(vmax); vmm=atoi(vmin); Du=(um-umm)/M; Dv=vm-vmm)/N; strcpy(expre,expl);

UNlVERSlDAD AUTONOMA METROPOLITANA "UTAPAIAPA"

110

asigna-mem(Planes,4); a=umm; for(i=O;i<=M;i++) { h m m ; for(j=Oj<=Nj++) f

strcpy(exp1,expre); gcvt(a, 10,varu); gcvt(b, 10,varv); strcpy(vl,"v=="); strcpy(ul,"u=("); strcat(u 1 .varu); strcat(u1,")"); sustituye(exp1,ul); strcat(v1,varv); strcat(v1 ,")I*);

Planes[N*(i%M)+(j+(N- l))%N] .p[ 11 .z=c;

Planes[N*((i+(M-l))%M)+j%N].p[3].x=a, Planes[N*((i+(M-l))%M)+j%NI.p[3].y=b; Planes[N*((i+(M-l))%M)+j%NI.p[3].z=c; b=b+Dv;

1 a=a+Du;

I }

UNIVERSIDAD AUTONOMA METROPOLITANA "UTAPAIAPA"

111

BIBLIOTECA DE NNClONES GRAFICAS Y GRAFlCAClON PWEDRAL

/* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

/* FUNCIóN PRINCIPAL, esta es la función a la cual el usuario de la */ /* biblioteca va a llamar en su programa, para realizar la grafkación */ /* poliedral. */ /* . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */ grafca-3D(char *expresion,char *rangox,char *rangoy) {

inicializa_grafcos(); generaqtos(expresion,rangox,rangoy); draw_3d(Planes,N*M,ORTOGONAL); transformaciones-interactivas(Planes,N*M);

1

.,, .,.. ... .... .. .. . . . .. , . . . .. .. . .. . .

. . .' .'. .. . . : . . . .

UNIVERSIDAD AUTONOW METROPOLITANA 'ITTAPAMPA"

112

PROYECTO DE rmsnwaw BIBUOTECA DE FUNClONES GRAFICAS Y GRAFICACJON POUEDRAL

BIBLIOGRAFIA:

* Power graphics programming Michael Abrash Ed. QUE 1989.

* Introduction to computer graphics James D. Foley, Andries Van Dam Ed. Addison Wesley 1994.

* Interactive computer graphics: functional, procedural and device-level methods Gillies, Duncan

* Computer graphics Edward Angel Addison Wesley 1990.

*

* Gráficas por computadora

Prenice, Hall ..:

Donakl 5e.qn.y M., Pauline'Baker, . , ..:. , ,. . . . . . . . ...;, . . . . . . . . . . . . . . :: ..... . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .:

.. . . , . . I . , < . :. . .:.:. .... ..,,< : ..: ..:: '. .... . . . . . . I

.. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .: . . . . . . . . . . .. . . . . \ . . . . . : <

.:..: :.. : : ~

. . : .. " . . . . . . . . . . . . . . . . . . . . . . : " . -. . . . . . . . - : .. , .: : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .... . . . . . . . . . . . . . . . .

. .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

UNlVERSlDAD AUTONOMA METROPOLITANA VTAPAIAPA"

113