unidad iztapalapa 12>1

113
di ~IBlIOT~~~ UNIVERSIDAD AUTÓNOMA METROPOLITANA UNIDAD IZTAPALAPA yc 12>1 ~PIJCACIONES DE GEOMETM EA PROYECTIVA ASESOR : Octavio Arzate AUTORES: / Gabriela Ramos Vargas Alberto Israel Santiago Soto. 2 146516

Upload: others

Post on 02-Jul-2022

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: UNIDAD IZTAPALAPA 12>1

di ~ I B l I O T ~ ~ ~ UNIVERSIDAD AUTÓNOMA METROPOLITANA

UNIDAD IZTAPALAPA

y c 12>1

~PIJCACIONES DE GEOMETM EA

PROYECTIVA

ASESOR : Octavio Arzate

AUTORES:

/ Gabriela Ramos Vargas

Alberto Israel Santiago Soto. 2

1 4 6 5 1 6

Page 2: UNIDAD IZTAPALAPA 12>1

PRIlMERA PARTE

Page 3: UNIDAD IZTAPALAPA 12>1

INTRODUCCION

LA HISTORIA DEL DIBUJO DE PERSPECTIVA SE 2IERDE EN EL TIEMPO LIGADA A LA REPRESENTACION REALISTA POR MEDIO 3E LA PINTURA Y EL DIBUJO. LOS GRANDES PINTORES NOS HAN DEJADO MTJCHOS EJEMPLOS DE USO HABIL DE LOS CONOCIMIENTOS DE LA PERSPECTIVA.

ALGUNOS DE ESTOS PINTORES DEJARON NO'IM MANUSCRITAS Y PUBLICARON LIBROS DONDE PRETENDIERON EXPLICAR A SUS DISCIPULOS Y A LOS NO INICIADOS LAS REGLAS UTILES PARA DIBUJAR EN PERSPECTIVA, LEONARD0 DA VINCI ES UN EJEMPLO. OTROS SON DURERO, WENNER Y MAUROLICO. LA UNIVERSIDAD ?B MEXICO EDITO RECIENTEMENTE LA TRADUCCION AL ESPAÑOL DE UN( DE LOS LIBROS DE ALBERTO DURERO PUBLICADO EN LATIN EN PARIS EN 1635 (11, DONDE ESTE PINTOR EXPLICA EN FORMA SENCILLA DIVERSAS TECNICAS PARA DIBUJAR Y EN PARTICULAR ENSEÑA LA PERSPECTIVA CON AYUDA DE UN MARCO DE MADERA DONDE SE SEÑALAN LAS COORDENADAS DE LA INTERSECCION DEL PLANO DEL DIBUJO CON UN CORDEL QUE SE TENSA ENTRE EL PUNTO A DIBUJAR Y EL PUNTO DE OBSERVACION. EL DIBUJO SE MUEVE, SIN MOVER EL MARCO DE MADERA, PARA DEJAR PASO AL CORDEL.

LA TEORIA MATEMATICA DE LA PERSPECTIVA TIENE TAMBIEN UNA LARGA HISTORIA CUYOS PRIMEROS TRABAJOS CONOCIDOS PRINCIPIAN CON DESARGUES ( 1639 ) Y LAPLACE ( 1640 ) , SEGUIQOS POR LOS ALUMNOS DE DESARGUES, ABRAHAM BOSS ( 1648 ) Y PHILIPPE DE LA HIRE ( 1673 Y 1685 1.

EL TEMA SE REDESCUBRE Y SE ENRIQUECE CGI LOS TRABAJOS DE MONGE ( 1799 Y 1822 ) , BRIANCHON ( 1806 ) , PONCELET (1822) Y CHARLES (1852). LA ESCUELA FRANCESA COMPARTE HONORES EN ESTA LABOR CON J.STF,INER (1832) Y K.VON STAUDE (1847,1856 Y 1860). PARA CONOCER LA HISTORIA MAS COMPLETA Y DETALLADA DE LA GEOMETRIA PROYECTIVA VEASE P.E. EL LIBRO DE COLLET (2).

EL INCREMENTO PRODIGIOSOS DE LA COMPüTACldN HA HECHO QUE SE DESARROLLE LA TECNICA DEL DIBUJO CON AYUDA DEL GRAN PODER DE CALCULO Y LA MAYOR PRESICION QUE SE OBTIENE CADA DIA EN EL CONTROL DE LA PANTALLA, LAS IMPRESORAS Y LOS GRAFICADORES. VEASE P.E. EL ARTICULO DE F. PEREDO Y J.11. CORDOBA EN LA REVISTA CONTACTOS ( 3 ) , LAS REFERENCIAS INCLUIDAS EN DICHO TRABAJO.

EN LA ACTUALIDAD MUCHAS PERSONAS DISPONEN DE COMPUTADORAS PERSONALES DONDE ES FACTIBLE REPRESENTAR EN PANTALLA DIBUJOS DE PERSPECTIVA CON DIFERENTES APLICACIONES UTILES. LA POSIBILIDAD DE COPIAR LA PANTALLA CON UNA IMPRESORA AUMENTA EL NUMERO DE USOS DE UN DIBUJO.

EL GRAFICA2OR ES UN ELEMENTO QUE PERMITE UN DIBUJO DE MAYOR CALIDAD Y PF.ESICION, Y ESPERAMOS SU GENERALIZACION Y ABARATAMIENTO.

Page 4: UNIDAD IZTAPALAPA 12>1

ESTE TRABAJO PRETENDE POPULARIZAR LAS YECNICAS PARA EL DIBUJO DE PERSPkXTIVA CON AYUDA DE COORDENADAS. SE UTILIZAN LOS CONOCIMIENTOS ELEMENTALES DE GEOMETRIA ANALITICA CON VECTORES, CONOCIDA Y DOMINADA POR INGENIEROS, ARQUITECTOS, QUIMICOS, FISICOS, MATEMATICOS, ETC.

EL ARTICULO QUE SIGUE VA INCREMENTANDO PAULATINAMENTE EN DIFICULTAD SIN REQUERIR NUNCA CONOCIMIENTOS AVANZADOS. EL LECTOR CONTINUARA EN TANTO EL INTERES Y LA NECESIDAD SE LO ACONSEJEN SIN QUE DEBA DETENERSE POR RAZONES DE COMPLEJIDAD.

NO SE PRETENDE COMPETIR CON LOS PAQUETES COMERCIALES DE COMPUTACION QUE GENERALMENTE SON MAS GRANDES .Y COSTOSOS , DERROCHAN TIEMPO DE COMPUTACION Y COMPILACION Y ES DIFICIL ADAPTARSE A LOS PROPOSITOS VARIABLES EN E1 TIEMPO DE MUCHOS USUARIOS.

POR OTRA PARTE CUALQUIER DIBUJO HECHG CON COMPUTADORA PODRA SER PERFECCIONADO EN LAS MANOS DE UN DIBWANTE EXPERTO. VEASE COMO EJEMPLO LA PROYECCION ESFEROGRAFICA QUE PINTO ARNOLD BELKIN EN EL MURAL DEL TEATRO DEL FTJEGO NUEVO DE LA UNIVERSIDAD AUTONOMA METROPOLITANA,IZTAPALAPA EN LA CIUDAD DE MEXICO.

ANTES DE PRINCIPIAR A DIBUJAR, EL LECTOR DEBERA APRENDER ALGUNAS POSIBILIDADES DE GRAFICACION DE SU PROPIA COMPUTADORA. APARTE DEL USO DE VARIOS COLORES Y GRADOS DE OSCURIDAD, DEBE APRENDER A COLOCARSE EN MODO GRAFICO, Y A SEÑALAR EL GRADO DE PRECISION DEL DIBUJO SI LA MAQUINA LO EXIGE' ( MAYOR PRECISION EQUIVALE A MAS MEMORIA UTILIZADA ) . SE DEBE TAMBIEN APRENDER AL LIMPIAR LA PANTALLA.

LAS INSTRUCCIONES BASICAS DEL DIBUJO CONSISTEN EN: 1. ELEGIR UN COLOR O TOMAR UNA PLUMA. ESTA INSTRUCCION ES

INDISPENSABLE PARA ALGUNOS GRAFICADORES Y PUEDE NO TENER SENTIDO SI SE DIBUJA EN BLANCO Y NEGRO.

2. EL DIBUJO DE UN PUNTO POR DOS COORDENADAS QUE SITUAN AL PUNTO.

3. EL DIBUJO DE UN SEGMENTO QUE CONECTA DOS PUNTOS, EL PRIMERO DE LOS CUALES PUEDE SER EL ULTIMO PUNTO DIBUJADO.

4 . EL LEVANTAR LA PLUMA. INSTRUCCION PARA QUE LA MAQUINA DEJE DE DIBUJAR. ESTA INSTRUCCION ES IMPORTANTE EN ALGUNOS GRAFICADORES .

APARTE DA ESTAS INSTRUCCIONES BASICAS HAY INSTRUCCIONES MENOS GENERALES QUE SON NECESARIAS PARA DIBUJAR EN PERSPECTIVA COMO AQUELLAS QUE PERMITEN DIBUJAR UN ARCO DE CIRCULO. RECOMIENDO NUEVAMENTE EL ARTICULO DE F. PEREDO Y J.L. CORDOBA ( 3 ) PARA UNA DESCRIPCION MAS AMPLIA DE ESTAS FUNCIONES BASICAS.

Page 5: UNIDAD IZTAPALAPA 12>1

DIBUJO DE PERSPECTIVA

SE DESEA LIIBUJAR EN UN PLANO F A UN OBJETO EN EL ESPACIO VISTO DESDE LA POSICION DE UN OBSERVADOR M. EL OBSERVADOR MIRA PERPENDICULARMENTE AL PLANO F EN LA DIRECCiON DEL ORIGEN DE COORDENADAS O f DEL PLANO Y EN LA DIRECCION TAMBIEN DEL ORIGEN DE COORDENADAS O DEL ESPACIO. UN PUNTO O f EN EL DIBUJO SE LE LLAMA PUNTO PRINCIPAL.

LLAMARE d A LA DISTANCIA DEL OBSERVADOR Y AL PLANO F Y R A LA DISTANCIA DXL OBSERVADOR M AL ORIGEN DE LOORDENADAS EN EL ESPACIO.

EN LA FIGURA 1 HE REPRESENTADO LA VISTA DE CANTO DEL PLANO F QUE CONTIENE XL EJE O f Y f Y SE HAN DIBUJADO TAMBIEN LOS EJES COORDENADOS AUXILIARES EN LAS DIRECCIONES OzIY O y ' .

1

FIGURA 1

Page 6: UNIDAD IZTAPALAPA 12>1

POR COMODIDAD ELEGIMOS UN SISTEMA DE COORDENADAS AUXILIAR ( PRIMO ) QUE TENGA AL EJE OzIEN LA DIRECCION DEL ORIGEN O AL OBSERVADOR M.

EN ESTE SISTEMA COORDENADO EL OBSERVADOR TIENE COORDENADAS M' DADAS POR:

Y EL PLANO F DONDE SE FABRICA EL DIBUJO TIENE POR ECUACION A:

CONSIDEREMOS CUALQUIER PUNTO P' DEL OBJETO QUE SE QUIERE DIBUJAR ( O PRGYECTAR ) SOBRE EL PLANO F Y QUE TIENE LAS COORDENADAS :

ESTE PUNTO DETERMINA EN EL PLANO F A OTRO PUNTO QUE ES LA INTERSECCION CON LA RECTA QUE UNE A DICHO PUNTO PI CON EL OBSERVADOR M. ESTE PUNTO DE INTERSECCION ES LA IMAGEN DE P' EN EL PLANO F, SUS COORDENADAS SERAN DESIGNADAS POR X f Y Y f . EN LA FIGURA 2 SE ML'ECSTRA LA VISTA DE LA FIGURA A"T'$RIOR DONDE SE HAN AGREGADO EL PUWTO P' CON DOS COORDENADAS VISIBLES yIY zISU PROYECCION EN EL PLANO F DEL DIBUJO, CON UNA COORDENADA VISIBLE Y f .

FIGURA 2

Page 7: UNIDAD IZTAPALAPA 12>1

DE LA FIGTJRA 2 RESULTA POR TRIANGDCOS SEMEJANTES LA RELACION ENTRE LA COORDENADA y' DEL PUNTO PI EN EL ESPACIO Y LA COORDENADA Yf DE SU IMAGEN EN EL PLANO F

a R - Z '

DE LA CUAL RESULTA

y ' . d - YF - (4)

R - Z '

Y POR RAZONES DE SIMETRIA SE ENCUENTRA TWIEN:

d XI

XF = (5)

R - Z '

EL SISTEMA COORDENADO PRIMO SE ELIGIO DE FORMA QUE FUESE SIMPLE OBTENER LA RELACION ENTRE LAS COORDENADAS DEL SISTEMA PRIMO Y LAS COORDENADAS DE LA IMAGEN. EN GENERAL PODEMOS ESPERAR QUE EXJ SISTEMA COORDENADO DEL ESPACE0 TENGA SUS EJES COORDENADOS EN' UNA ORIENTACION DIFERENTE DEI LA QUE TIENE EL SISTEMA PRIMO. BUSCAREMOS AHORA LA RELACION DEL SISTEMA DEL ESPACIO AL SISTEMA PRIMO.

SEGUIRE LA COSTUMBRE EN BOGA DE ASOCiAR AL EJE Oz DEL ESPACIO AL EJE O f Yf DEL PLANO DEL DIBUJO QUE SE LLAMA RECTA PRINCIPAL.

EL PLANO O'Y'Z' DEL SISTEMA PRIMO SE PROYECTA EN EL EJE OYf DEL PLANO F, POR LO CUAL EL EJE Oz ESTA EN DICHO PLANO COORDENADO OY' Z' .

Page 8: UNIDAD IZTAPALAPA 12>1

SUPONGA QUE LA DIRECCION DEL EJE Oz EN EL SISTEMA PRIMO FORMA UN ANGULO TETA CON EL EJE 0 2 ' . LA DIRECCTON DEL EJE 02' EN EL SISTEMA PRIMO SERA:

G =

( O, SEN TETA , COS TETA) (6)

- SEN FI COS FI O

- COS TETA COS FI - COS TETA SEN FI

SEN TETA COS FI SEN TETA SEN FI CON TETA

INTERESA R3TAR EL SISTEMA COORDENADO GENERAL AL SISTEMA COORDENADO PRIMO DE TAL FORMA QUE EL EJE OZ GENERAL SE ROTE EN ESTA DIRECCION DEL PLANO OY'Z' QUE FORMA UN MGULO TETA CON LA DIRECCION M O f O EN QUE SE MIRE AL DIBUJO.

ENTONCES LA ROTACION G DEBERA TENER LA PROPIEDAD:

SEGUN EL DR. PIÑA ( 4 ) , LA ROTACION G GENERAL CON LA PROPIEDAD (7 ) ESTAN DADOS POR

PARA DAR. SENTIDO GEOMETRIC0 AL ANGULO FI, OBTENGO LA DIRECCION EN QUE ESTA SITUADO EL OBSERVADOR EN EL SISTEMA GENERAL, LA CUAL ES:

SE ENCUENTRA AS1 QUE TETA Y FI SON LAS COCRDENADAS ESFERICAS DE LA POSICION DEL OBSERVADOR M EN EL SISTEMA ';ENERAL, JUNTO CON LA DISTANCIA R ?JJ ORIGEN O (FIG 3) .

Page 9: UNIDAD IZTAPALAPA 12>1

x FIGURA 3

LOS PARAMETROS R, TETA, FI SE PENSARAN DESDE AHORA COMO AQUELLOS QUE SITUAN AL OBSERVADOR M EN EL SISTEMA DE COORDENADAS DEL'ESPACIO.

EL SISTEMA COORDENADO DEL ESPACIO SE ELIGE CON SU ORIGEN EN LA RECTA PERPENDICULAR DEL OBSERVADOR M AL DIBUJO. LA ORIENTACION DE LOS EJES COORDENADOS DEL ESPACIO ES MAS CONVENIENTE PARA LA FORMA DEL OBJETO QUE SE QUIERE DIBUJAR.

CON AYUDA DE LOS COEFICIENTES (8) ESCRIBIMOS AHORA LAS COORDENADAS DEL SISTEMA PRIMO EN FUNCION DE U& COORDENADAS DEL SISTEMA GENERAL Y SE OBTIENE:

(10 ) X'm - X SEN FI + Y COS FI Y'= - X COS TETA COS FI - Y COS TETA SEN FI + Z SEN TETA Z'= X S m TETA COS FI + Y SEN TETA SEN FI + Z COS TETA

Y SE SUSTITUYEN ESTAS EXPRESIONES EN LRC'ECUACIONES (4) Y (5) PARA ENCOJYTRAR LAS COORDENADAS EN EL DIBUJO DE- LOS PUNTOS PROYECTADOS DEL. OBJETO EN FUNCION DE LAS COORDENADAS X , Y , Z DE CADA PUNTO DEL ESPACIO QUE SE QUIERA DIBUJAR.

d ( -X SEN FI + Y COS FI) XF = (11)

R - X SEN TZTA COS FI - Y SEN TETA SEN FI - $ COS TETA

d ( - X COS TETA COS FI - Y COS TETA SEN FI + Z SEN TETA) Y F = (12 1

R - X SEN TETA COS FI - Y SEN TETA SEN FI - Z COS TETA

Page 10: UNIDAD IZTAPALAPA 12>1

LAS ECUACIONES (11) Y (12) CONSTITUYEN EL INSTRUMENTO MAS VALIOSO PARA DIBUJAR EN PERSPECTIVA. DEPENDE DE LA POSICION M EN COORDENADAS ESFERICAS ( R, TETA, FI ) Y DE LA POSICION DEL OBSERVADOR A UNA DISTANCIA d. PARA CADA TERNA (X,Y,Z) DE COORDENADAS CARTESIANAS DE UN PUNTO P , SE OBTIENEN LAS COORDENADAS X f , Y f DEL MISMO PUNTO EN EL DIBUJO.

PARA DIBUJAR UNA LINEA QUE PASA POR UNA SUCESION DE PUNTOS EN EL DIBUJO SE PRINCIPIA POR MEDIR O CALCULAR LAS COORDENADAS DE DICHOS PUNTOS EN EL ESPACIO.SE CALCULAN CON AYUDA DE (11) Y(12) LAS COORDENADAS CORRESPONDIENTES EN EL DIBUJO. SE DIBUJA EL PRIMER PUNTO. SE TRAZA LA LINEA DEL PRIMER PUNTO AL SEGUNDO. DESPUES LA LINEA DEL SEGUNDO AL TERCER PUNTO, Y AS1 SUCESIVAMENTE.

CON ESTA IDEA SE PUEDE DIBUJAR CUALQUIER OBJETO DEL ESPACIO. LO QUE SIGUE ES UN ANALISIS MAS DETALLADO DE ESTE CONOCIMIENTO.

LAS COORDENADAS X f , Y f CORRESPONDIENTES A LA PROYECCION PUNTO

SE HILERAS

PUEDEN EXPRESAR CON AYUDA DE TRES VECTORES QUE FORMAN DE LA MATRIZ G EN (8) .

DEL

LAS

U = ( SEN TETA COS FI, SEN TETA SEN F I , COS TETA e

V = ( - SEN FI, COS FI, O - (14 ) .

W = ( - COS TETA COS FI, - COS TETA SEN FI;SEN TETA) a

LOS TRES VECTORES SON UNITARIOS Y PERPENDICULARES ENTRE S I .

RECUERDESE QUE UN VECTOR ES UNITARIO CUANDO EL PRODUCTO ESCALAR CONSIGO MISMO ES UNO. DOS VECTORES SON PERPENDICULARES CU&NDO EL PRODUCTO ESCALAR ES LA SUMA DE LOS PRODUCTOS DE LAS COMPONENTES CORRESPONDIENTES.

SE ENCUENTRAN:

d.r.v a -

XF = R - r .u

a a

Y

. I .... . . . ~. -.._.I _c

Page 11: UNIDAD IZTAPALAPA 12>1

d.r .w a a

Y F = R - r . u

LAS ECUACIONES (15) Y (16) SON IDENTICAS A LAS ECUACIONES ( 11 ) Y ( 12 1, PERO SU FORMA CON MENOS SIMBOLOS PERMITIRA EXPRESAR EN FORMA MAS COMPACTA LAS ECUACIOPJES QUE SIGUEN MAS ADELANTE.

PARA DIBUJAR RECTAS

ESTUDIAMOS AHORA LA PROYECCION DE UNA RECTA CUYA ECUACION EN EL ESPACIO ES

r = a + b s ... a a ( 1 7 ) .

DONDE a Y b SON DOS VECTORES CONSTANTES Y 8 ES UN a -

PARAMETRO VARIABLE. CADA VALOR DE 8 DARA UN P"T0 DE LA RECTA; 8 MIDE LA DISTANCIA DE ESE PUNTO DE LA RECTA AL PUNTO a DE LA

RECTA QUE CORRESPONDE AL VALOR DONDE SE ANULA 8 . EL VECTOR b a

ES UN VECTOR UNITARIO EN LA DIRECCION DE LA RECTA.

AL SUSTITUIR LA ECUACION (17) EN LAS ECU&!IONES (15) Y (16) SE OBTIENEN LAS ECUACIONES PARA LA REPRESENTACION DE LA RECTA EN EL ESPACIO (17) EN EL PLANO F.

d(a .v + b.v 8 ) a a a a

XP(8) = R - a.u - b.u 8

YP(8) = R - a .u - b.u 8

( 1 9 ) .

SE PUEDE DEMOSTRAR QUE LOS PUNTOS CON 8 WARIABLE QUE TIENEN LAS COORDENADAS (18) Y (19) ESTAN SOBRE UNA RECTA PUESTO QUE ES POSIBLE ENCONTRAR TRES CONSTANTES A,B,C INDEPEWDIENTES DE 8 QUE NOS DAN

Page 12: UNIDAD IZTAPALAPA 12>1

. ., :

O E A X f ( 8 ) + B Yf(ü) + C (20)

LA CUAL ES LA ECUACION DE LA RECTA DE PBMDIENTE -A/B EN EL DIBUJO.

SUSTITUYENDO (18) Y (19) EN (20) PARA OBTENER LAS DOS ECUACIONES.

A d a .v + B d a . w + C ( R - a.u) O " - - - .. A d b.v + B d b o w - C b.u = O

- e .I" .I" (21)

LAS CONSTANTES A,B,C ESTAN DETERMINADAS HASTA UN FACTOR NO CERO ARBITRARIO.

UNA SOLUCION PARTICULAR

A = EI.w b . ~ - B = a . ~ b.v - .... ....

DE (21) ESTA DADA POR:

a .u b . w + R b o w (22) -.I-... .I...

a . v b.u - R b.v ...I . I - - "

C = d(- a.v b o w + a . w b.v) e - - - ....

ESTA SOLUCION SE PUEDE ESCRIBIR EN TERPEZNOS DE PRODUCTOS ESCALARES Y VECTORIALES COMO:

A = axb.v + R b . w

B = a x b . w - R b.v

C = d axb.u

" - - " - ... . . .e

- I -

DONDE SE HA USADO LA ECUACION PARA EL DOBLE PRODUCTO X DE VECTORES

(a x b) x c = b a.c - a b . c e u - ....I- .I"...

(26)

Y EL HECHO DE QUE LOS VECTORES u,v,w SON UNITARIOS Y ... PERPENDICULARES ENTRE SI.

LAS RECTAS PARALELAS AL PLANO DEL DIBUJQ SE PROYECTAN EN RECTAS PARALELAS SOBRE EL MISMO. PERO EN GENERAL, CUANDO EL VECTOR b NO ES PARALELO AL PLANO F LA RECTA ( 17 ) NO SE

I

Page 13: UNIDAD IZTAPALAPA 12>1

TRANSFORMA EN LA RECTA COMPLETA DEL PLANO SINO SOLO EN UNA SEMIRECTA QUE SE EXTINGUE EN EL PUNTO EN QUE 8 CRECE INDEFINIDAMENTE

d b.v - a

Y

X i m X f ( 8 ) = - b.u a a

s - > *

d bow a -

1 4 6 5 1 6

Y SE DEMUESTRA QUE TODAS LAS RECTW PARALELAS A LA DIRECCION b (NO PARALELAS AL PLANO DEL DIBUJO) CONCURREN EN EL PUNTO DE COORDENADAS (27) Y (28) DONDE TERMINAN.

UN CASO PARTICULAR CONTENIDAS EN UN PLANO FORMA UN ANGULO BETA CON

EN TAL CASO b e ( COS

IMPORTANTE ES EL CONJUNTO DE RECTAS DE ALTURA Z , CONSTANTE CUYA DIRECCION EL EJE OX. EL VECTOR UNITARIO b a ES

Y EN EL LIMITE QUE 8 TIENDE A INFINITO TODAS LAS RECTAS PARALELAS A ESTE b CONCURREN EN EL PUNTO. -

TAN (FI - BETA)

Y

l i m Y f ( s ) = s ->co

SE CONCLUYE QUE HORIZONTALES Di? CUALQUIER

- d SEN TETA

( 3 0 )

d COT TETA (31)

TODAS LAS RECTAS SOBRE PLANOS ALTURA Z CONSTANTE SE PROYECTAN EN

RECTAS QUE TEFüVINAN EN UN PUNTO SOBRE LA ZECTA LLAMADA DEL HORIZONTE

Y f = d COT TETA ( 3 2 ) .

Page 14: UNIDAD IZTAPALAPA 12>1

QUE CONTIENEN TODOS LOS PUNTOS LIMITE DE COORDENADAS (30) Y (31).

DE PARTICULAR IMPORTANCIA SON LOS CASOS DB PROYECCION DE LOS EJES COORDENADOS.

EL EJE OX ESTA CARACTERIZADO POR y = z = O LOS PUNTOS DEL EJE SE PROYECTAN EN LAS COORDENADAS CON X VARIABLE

- x d SEN FI XF =

R - x SEN TETA COS FI

( EJE ox 1 (33) x d COS TETA COS FI - -

IF = R - x SEN TETA COS PI

ESTA ES UMA RECTA QUE PASA POR EL ORIGEN OF Y DE ECUACION

QUE TERMINA EN EL PUNTO

TAN FI lim X f = d ( FIN DEL EJE OX (35) x - > - SEN TETA

lim X f = d COT TETA x - > og

ANALOGAMEN!FE, EL EJE OY ESTA CARACTERIZADO POR X = Z = O ; Y LOS P m O S DEL EJE SE PROYECTA EN LAS COORDENADAS CON Y

VARIABLE

d Y COS FI X f =

R - Y SEN TETA SEN FI 4 EJE OY 1 (36)

- d Y COS TETA SEN FI

R - Y S m TETA SEN FI Pf =

Page 15: UNIDAD IZTAPALAPA 12>1

ESTOS PUNTOS ESTAN SOBRE LA RECTA DEL DIBUJO

Y f COS FI = - Xf COS TETA SEN F I (EJE OY ) ( 3 7 ) . QUE SE ACABA EN EL HORIZONTE CON LAS COORDENADAS

- d COT FI lim Xf = y ->o0 SEN TETA

( FIN DEL EJE OY 1 (38) lim Y% = d COT TETA y ->o0

LA RECTA BEL HORIZONTE PASA POR ESOS DOS PUNTOS (35) Y ( 3 8 ) .

OTRA RECTA IMPORTANTE ES EL TERCER EJE COORDENADO OZ, CON LA PROPIEDAD X = Y = O., SUS COORDENADAS SON:

Xf = o ( EJE oz 1 (39) o

d Z SEN TETA

R - Z COS TETA Y F =

Y LA PRIMERA DE ESTAS ECUACIONES REPRESENTA A PROYECCION DEL EJE OZ SOBRE EL DIBUJO. EL EJE OFYF. PRWIAMENTE ESTA RECTA FUE LLAMADA RECTA PRINCIPAL.

EN EL LIMITE EN QUE Z TIENDE A INFINITO EL EJE O2 TERMINA EN EL PUNTO DE COORDENADAS.

Xf = o lim Y f = - d TAN TETA z ->-

( FIN DEL EJE OZ (40)

EN CONSECUENCIA, TODAS LAS RECTAS PARALELAS AL EJE OZ SE PROYECTAN POR RECTAS QUE CONCURREN EN ESTE PUNTO DE COODENADAS (40)

Page 16: UNIDAD IZTAPALAPA 12>1

SE LES LI,4MAM PUNTOS DE FUGA A LOS TRBS PUNTOS EN QUE CONCURREN LAS F.ACTAS PARALELAS A LOS TRES EJES COORDENADOS (351, (38) Y ( 4 0 ) . VFP. FIGURA 4 .

FIGURA 4

SI MIRAMOS EL EJE VERTICAL O ' Z EN UNA DIRECCION PERPENDICULAR,. EJE OZ ESTARA ENTONCES PARALE :> AL DIBUJO Y LA LINEA DEL HORI7ONTE ESTARA A LA ALTURA DE LA PISTA. EL PUNTO DE FUGA VERTICAL DESAPARECE AL ALEJARSE SIN LIMITE Y LAS LINEAS PARALELAS AL EJE OZ SE DIBUJARAN PARALELAS. EXISTEN EN TAL CASO SOLO DOS PUNTOS DE FUGA CORRESPONDIENTES A LAS DIRECCIONES HORIZONTALES. ALGUNOS DIBUJANTES DISTINGUEN LOS DOS PUNTOS DE FUGA EN ESTE CASO Y LOS LLAMAN PUNTO DE FUGA Y PUNTO DE GUIA, PERO SE PODRI3,N INTERCAMBIAR NOMBRES SIN OTKO CAMBIO PORQUE JUEGAN PAPELES SIMILARES A DERECHA E IZQUIERDA DEL DIBUJO. VEME P.E. EL CUADERNO DE E. FREIXAS (5).

EN OCAC'TONES SE QUIEREN DIBUJAR PUNTOS QUE ESTAN IGUALMENTE ESPACIADOS SOBRE UNA RECTA DEL ESPACIO, A UNA DISTANCIA AS ENTRE DOS PUNTOS CONSECUTIVOS.ESTOS PUNTOS LOS NUMERAMOS CON uív ENTERO n A PARTIR DEL QUE SE Sb'7UENTRA EN LA POSICION a Ali CUAL SE DA VALOR n = O .

.I

LAS ECUACIONES DEL PUNTO n EN EL ESPACIO FdRAN

r (n) = a + b A S n, ... ... (41)

, .. _._.-.__.I" .<.. . . -- " .. ... " .

Page 17: UNIDAD IZTAPALAPA 12>1

EL CUAL ES UN PUNTO SOBRE LA RECTA (17) . Y LA PRCYECCION DE ESTE PUNTO EN 7L DIBUJO TENDRA

COORDENADAS.

d( a.v + b.v n A S ) a a a a

X f = a - a.u - b.u n A S

a a m a

d( a.w + b.w n A ST a - a a

Y€ = B - a.u - b.u n A S

a a a a

PODEMOS USAR LAS ECUACIONES (42) PARA DIBUJAR UN CONJUNTO DE SEGMENTOS PARALELOS EN EL ESPACIO COMO LOS QUE FORMAN UNA SUCESION DE VENTANAS IGUALES EN UN EDIFICIO, UN CONJUNTO DE POSTES EN UNA CRLLE RECTA O LOS TRAVESAÑOS DE UNJA VIA DIRECTA DE FERROCARRIL.

PARA DIBUJAR EL PRIMER SEGMENTO SE TRAZA LA LINEA ENTRE DOS PUNTOS (42) CON DOS VECTORES a DIFERENTES Y CON n = O . LOS SEGMENTOS 2ARALELOS AL PRIMERO SE OBTIENEN TRAZANDO LAS LINEAS ENTRE LOS MISMOS DOS VECTORES a PERO DANDO A n LOS

a

a

VALORES 1,2, ... VER EJEMPLO EN LA FIGURA 5.

FIGURA 5

Page 18: UNIDAD IZTAPALAPA 12>1

EL SECRETC NO DIBULGADO DE LAS FOTOGRAFIAS.

TODO DIBlfJO O FOTOGRAFIA DE UN OBJETO EN FORMA DE PARALELEPIPEDO, COMO UN EDIFICIO CON ARISTAS MUTUAMENTE PERPENDICULARES NOS ESTA DICIENDO IMPLICITAMENTE CUAL ERA LA POSICION RFLATIVA DEL OBSERVADOR QUE PROYECK'O ESA FIGURA.

PARA OBTENi'R ESA INFORMACION TOMESE LA FOTOGRAFIA Y TRACENSE LAS LINEAS CORRESPONDIENTES A LAS RECTAS PARALELAS A LAS TRES DIRECCIONES PERPENDICULARES. ESAS RECTAS SE CRUZAN EN TRES PUNTOS DE FUGA COMO INDICA LA FIGURA 6.

FIGURA 6

LAS COORDENADAS DE LOS PUNTOS DE FUGA X, Y , 2 ESTAN DADOS POR LAS ECUACIONES (35), (38) Y ( 4 0 ) . SI MEDIMOS XL TRIANGULO XYZ DE LA FIGURA 6 E IGUALAMOS LAS CANTIDADES DE DICHAS ECUACIONES SE PUEDEN OBTENEit LA POSICION DEL PUNTO FPINCIPAL O f Y LAS CANTIDADES d , FI , TETA. QUE DETERMINAN LA POSICION DEL OBSEVADOR RESPKTO AL DIBUJO Y LOS ANGULOS PEbPECTO AL SISTEMA

v

COORDENADO DEL SSPACIOLo d

3

d Cote

t

FIGURA 7

Page 19: UNIDAD IZTAPALAPA 12>1

PARA ELLO TRAZO LA LINEA ZH PERPENDICULAR AL HORIZONTE YX. ESTA LINEA ES LA LINI3A PRINCIPAL QUE CONTIENE AL PUNTO Of COMO SE MUESTRA EN LA FIGURA 7 , TOMADA DE LA FIGURA 6. EN LA FIGURA 7 SE HAN INDICADO LOS VALORES DE LAS DISTANCIAS YH, EX, OFX, HOf Y OfZ, PERO INICIALMENTE PODEMOS SUPONER QUE LA POSICION DEL PUNTO O f ES DESCONOCIDA.RECUERDESE QUE EL ORIGEN Of SEÑALA LA POSICION DEL OBSERVADOR M , PERPENDICULAR AL DIBUJO. DIVIDIENDO LAS DISTANCIAS CONOCIDA HX / YH SE ENCUENTRA :

plx TAN ^2 FI

Yf - - - (43)

DETERMINAN FI CONOCIDO EL ANGULO FI Y LA DISTANCIA 1 4 6 5 1 6

TAN FI EX = d

SEN TETA

SE PUEDE CONOCER LA DISTANCIA:

d 1 e Hx

SEN TETA TAN FI

LA DISTANCIA Hz VALE: d

HZ = d COT TETA + d TAN TETA = SEN TETA Coi TETA

DEL COCIEhTE DE ESTAS DOS DISTANCIAS (45) Y (46) SE PUEDE CONOCER EL ANGULO TETA:

Hx

Hz TAN FI = COS TETA (47) 0

c

CONOCIDOS TETA Y FI SE PUEDEN DETERMINAR AHORA FACILMENTE EL VALOR DE d Y LA POSICION DEL PUNTO PRINCIPAL Of .

ES CASI INMEDIATA UNA DETERMINACION PURAMENTE GEOMETRICA DE

COMO Of ESTA SOBRE LA RECTA PRINCIPAL LA CUAL ES UNA DE LAS ALTURAS, SE SIGUE DE RAZONES DE SIMETRIA QZJE; Of ESTA SITUADO EN EL PUNTO ORTOCENTRO DONDE SE INTERSECTAN W TRES ALTURAS DEL TRIANGULO DE PUNTOS FUGA.

LA LOCALIZACION DE Of EN EL TRIANGULO DE LOS TRES .PUNTOS FUGA.

Page 20: UNIDAD IZTAPALAPA 12>1

BORDE :

POR ECUACION EN EL ESPACIO: SEA UNA SUPERFICIE LISA Y SIN ARISTAS CXTOS PUNTOS TIENEN

DE ESTA FTGURA EL OBSERVADOR M VERA EL BORDE QUE ES LA CURVA FORMADA POR LOS CONTACTOS DE LRS RECTAS TANGENTES A LA SUPERFICIE DESOR EL PUNTO M. (VER FIGURA 8 ) .

t

FIGURA 8

ESTE BORDE EST+i EN LA INTERSECCION O TANGENCIA DE LAS DOS SUPERFICIES

Y

( r - Ru). 1 f(r) = O - - (49) .

DONDE !f(r), EL GRADIENTE DE f(r) ES UN VECTOR PERPENDICULAR A - - LA SUPERFICIE (48).

LA PRIMERA. ECUACION DE (49) TC&4A EN CUENTA QUE r ESTA EN LA SUPERFICIE Y LA SEGUNDA ASEGURA QUE EL PUNTO ES UNO DE TANGENCIA DESDE M. R u ES EL VECTOR QUE FIJA LA POSICION DEL

PUNTO M EN EL ESPACIO. -

Page 21: UNIDAD IZTAPALAPA 12>1

LA ECUACIOii DEL SISTEMA (49) NOS DA LA ECUACION DEL BORDE EN EL ESPACIO. SUS COORDENADAS QUE CUMPLEN (49) SE DEBERAN TRANSFORMAR POR. (15) Y (16) PARA OBTENER Lp. REPRESENTACION DE LOS PUNTOS DEL BORDE EN EL PLANO DEL DIBUJO.

Cara O-ie des& M Ca ca yY V\S ib\e 003=10

?ARTE POSTERIOR DEL OBJETO

HAY PUNTCS DE UNA CARA QUE NO SE PLZDEN VER DESDE M PORQUE EL VECTOR NORMAL A LA CARA, APUNTmO HACIA AFUERA TIENE PRODUCT3 ESCALAR POSITIVO CON LA POSLCION RELATIVA AL OBSERVADOR DE UN PUNTO DE LA CARA. k3TOS PUNTOS NO Se DIBUJARAN A mNOS QUE FORMEN PARTE DE 01'R.A CARA QUE SI SE CONTEMPLA DESEE M Y SI SE DEBE DIBUJAR. LA CARA QUE SI ES OBSERVABLE DESiji3 M TENDRA UN PRODUCTO ESCALAR NEGATIVO ENTRE LA NORMAL HACIA AFUERA Y EL VECTOR DEL PUNTO W A UN PUNTO DE LA CARA. LA MAQOINA PUEDE DISTINGUIR AMBOS CAXi FACILMENTE SEGUN SE INDICA MAS AEELANTE. (VER FIGURA 9).

SEA UNA CARA DETERMINADA POR LA POSICION DE TRES PUNTOS rl, r2, r3 ORDEXADOS CICLICAMENTE PARA QUE AL RECORRERSE EN SU .. ORDEN NOS DA LA DIRECCION EXTERIOR SEGX" LA REGLA DEL TIRABUZON. EN OTRAS PALABRAS SE TENDRA UN VECTOR p

,.. - -

PERPENDICULAR A LA CARA Y APUNTANDO HACIA X

p - ( r 2 - r l ) X ( r 3 - r i I - - = r2Xr3 + r3Xrl + rlXr2

... I _ - I I -

AFUERA POR EL PRODUCTO

(50)

a

FIGURA 10

Page 22: UNIDAD IZTAPALAPA 12>1

LA CONDICION PARA QUE UNA CARA SEA VISIBLE SERA

( rl - Ru1.p e= O " - "

QUE TAMBIEN SE PUEDE ESCRIBIR COMO:

1 4 6 5 1 6 CUANDO SE TENGA EL CASO DE UNA SUPERFICIE CURVA, CUYA FORMA

FORMA SE VISUmIZA CON AYUDA DE UNA CURVA SO-E LA SUPERFICIE, LOS PUNTOS VZSIBLES DE ESTAS CURVAS DEB- SATISFACER A LA CONDI C ION

(53) . DONDE f (r) ES LA ECUACION DE LA SUPERFICIE.

ESTA ECUACION ES ANALOGA A ( 51 ) PERO AHORA EL VECTOR PERPENDICULAR A LA SUPERFICIE ES f (r) QUE SE HA ELEGIDO APUNTANDO HACIA AFUERA. EL CASO LIMITE EN QUE (53) SE ANULA CORRESPONDE A UN PUNTO DEL BORDE (49).

...

OBJETOS QUE TAPAN PARCIALMENTE A OTROS OBJETOS

W A DE LAS DIkICULTADES A VENCER CUANDO SE ESTA DIBUJANDO ES HACER OUE LA MAOUINA DETERMINE LAS PARTES DEL DIBUJO OUE NO DEBEN DIBUJARSE POROUE UN O BJETO OCULTA PARTE DE O TRO o BJETO POR INTERPONERSE ENTRE ESTE ULTIMO Y EL OBSERVADOR,

SI OUEREMOS O UE ESTA DIFICULTAD SEA REBU ELTA DE FORMA AUTOMATICA POR LA MAOUINA PARA UNA PORCIQN ARBITRARIA DEL OBSERVADOR, NOS ENFRENTAMOS A UN EJERCICI~ MAS AVANZADO DE DIBUJO.

EN EL CA5 'O DE SUPERFICIES LISAS, REPRESENTADAS POR CURVAS DE INTERSECCION DE DICHAS SUPERFICIES CO N LOS PLANOS

X = n O X (n ENTERO. O X CONSTANTB) (54) . Y, O CON LOS PLANOS

Y = m OY (m ENTERO, O Y CONSTANTE) (55)

Page 23: UNIDAD IZTAPALAPA 12>1

SE PUEDEN ENCONTRAR COLINEAS QUE IMPIDAN OBSERVAR PARTE DE LA MISMA SUPERFICIE.

CONVIENE ENTONCES ELEGIR A FI EN EL PRIWR CUADRANTE (SIN PERDER GENERALIDAD)

O e FI e ANGULO RECTO (56) .

Y DIBUJAR PRIMERO LAS CURVAS CON MAYOR n o MAYOR m. DESPUES SE DIBUJA LA CURVA CON e n ( O m DISMINUIDA EN UN

ENTERO, Y ESTA SE SUJETA A LA RESTRICCION DE QUE CADA UNA DE SUS COORDENADAS Yf NO PUEDE SER MENOR QUE LAS DE LA CURVA ANTERIOR PARA EL MISMO VALOR DE Xf ) . ESTAS ORDENADAS SE GUARDAN UN ARCHXVO DE LA MEMORIA Y SE SUSTITUYEN POR UNA NUEVA

PAREJA (Xf,Yf) CADA VEZ QUE SE DIBUJA OTRA TAJADA (54) CON UNA n MENOR. AMBAS FAMILIAS ( 54 ) O ( 55 DEBERAN DIBUJARSE POR SEPARADO. DE ESTA FORMA SE EVITA LA SUPERPOSICION DE PARTES QUE SE DEBEN DIBUJAR CON AQUELLAS QUE NO SEAN VISIBLES POR OBSTRUCCION .

LOS DETALLES VARIAN CON CADA MAQUINA Y LENGUAJE PERO SE ILUSTRA EL RESULTADO EN LA FIGURA 11.

FIGURA 11

Page 24: UNIDAD IZTAPALAPA 12>1

VISION ESTZRBOSCOPICA EN TERCERA DIMENS ION

PARA LOGRAR UNA VISION EN TERCERA DIMENSION CAD A UNO DE NUESTROS DOS OJOS PERCIBE UNA VISTA LIGBRAME NTE DIFERENTE DEBIDO A SU POSICION DIFERENTE.

PARA LOGRAR UNA SENSACION DE VER OBJETOS EN TERCERA DIMENSION PODEM¿X DAR A CADA UNO DE NUESTROS DOS OJOS UNA VISION DIFERENTE OUE CORRESPONDA A LA IMAGEN EN PERSPECTIVA DEL OBJETO DEL ESPACIO VISTO POR DOS OBSERVADORES DIFERENTES EN LA POSICION DE NUESTROS OJOS.

ESTA ULTIMA POSIBILIDAD DE LA COMPUTADORA SE PUEDE REALIZAR APLICANDO LOS CONOCIMIENTOS YA APRENDIDOS. SE TIENE COMO EJEMPLO MUY CQHOCIDO LAS FIGURAS DE PROYECCION ESTEREOSCOPICA DEL LIBRO DE MORSE Y FESHBACK (6) LAS CUALES PUEDEN VERSE EN TERCERA DIMENSION CON ALGO DE ESFUERZO VISUAL O CON AYUDA DE ELEMENTOS OPTICBS AUXILIARES QUE FACILITAN LA VISION DIFERENTE DE IMAGEN PARA CADA OJO.

TECNICAS DE DESPLIEGE TRIDIMBNCIONAL

LAS REPRESENTACIONES DE UN OBJETO SOLIDO EN UNA SUPERFICIE DE VISION POR LO GENERAL CONTIENEN INFORMACION DE PROFUNDIDAD PARA QUE UN OBSERVADOR PUEBA IDENTIFICAR CON FACILIDADf PARA UNA VISION SELECCIONADA DADA, CUALES SON LAS PARTES ANTERIOR Y POSTERIOR DEL OBJETO. EXISTEN VARIAS TECNICAS QUE PUEDEN UTILIZARSE PARA INCLUIR. INFORMACION DE PROFUNDIDAD EN LA REPRESENTACION BIDIMENCIONAL DE OBJETOS SOLIDOS; LA ELECCION DE LA TECNICA DE DESPLI- DEPENDE DE LOS REQUISITOS DE LA APLICACION.

SUPRESION DE LINE3iS OCULTAS

ESTA TECNICA ES UTIL CUANDO LOS OBJETOS KJ$ DEFINEN COMO UN CONJUNTO DE LINEAS QUE REPRESENTAN LAS ARISTAS DE LAS SUPERFICIES DE LOS OBJETOS. PARA UNA VISTA SELECCIONADA. CUALQUIER LINEA QUE ESTE OCULTA POR SUPERFICIES FRONTA~ES SE SUPRIME ANTES DE QUE EL OBJETO SE DESPLIEGUE. A PESAR QUE PUEDEN NECESITARSE MUCHOS CALCULOS PARA LOCALIZAR LOS SEGMENTOS DE LINEAS OCULTAS EN UNA ESCENA, ESTE METODO OFRECE UN .DESPLIEGUE MAS REALISTA DE LA INFORMACION DE PROFUNDIDAD EN .TRAZOS DE LINEAS. EN ALGUNAS APLICACIONES ES UTIL REEMPLAZAR LAS ARISTAS OCULTAS DE OBJETOS CON LINEAS PUNTEADAS EN VEZ DE SUPRIMIRLAS TOCAS. ESTA FORMA SUMINISTRA MAS INFORMACION SOBRE SUPERFICIES ANTERIORES.

Page 25: UNIDAD IZTAPALAPA 12>1

ROTACION

PARA ESPECIFICAR UNA TRANSFORMACION DE ROTACION DE UN OBJETO, SE DEBE DESIGNAR UE: EJE DE ROTACION ( EN TORNO AL CUAL SE HARA GIRAR

EN EL OBJETO ) Y LA CANTIDAD DE ROTACION ANGULAR. APLICACIONES BIDIMENCIONALES, EL EJE DE ROT?$XON ES SIEMPRE PERPENDICULAR AL PLANO XY. EN TRES DIMENSIONES, UN EJE DE ROTACION PUEDE TENER CUALQUIER ORIENTACION ESPACIAL. LOS EJES DE ROTACION MAS FACILES DE MANEJAR SON 4QUELLOS QUE SON PARALELOS A LOS EJES COORDENADOS. ASIMISMO, PODEMOS VALERNOS DE LAS ROTACIONES EN CUALQUIER EJE DE ROTACION ESPECIFICADO EN FORMA ARBITRARIA.

ADOPTANDO EL CONVENCIONALISMO DE QUE LAS ROTACIONES EN SENTIDO CONTRARIO AL DEL RELOJ EN TORNO A UN m E COORDENADO SE PRODUCEN CON ANGULOS DE ROTACION POSITIVOS.

LAS ECUACIONES DE ROTACION DEL EJE Z BIDIMENCIONAL SE DESARROLLAN FACXLMENTE A TRES DIMENSIONES.

X I = x cos - y sen ; r l = x sen + y cos

. z ' = z

EL PARAMETRO ES PECIFICA EL ANGULO DE ROTACION. EN FORMA COORDENADA HOMOGENEA, LAS ECUACIONES DE ROTACION DEL EJE X TRIDIMENCIONAL SE EXPRESAN COMO:

1 0 o 1

CX'Y'Z'I = IXYZll

O

LAS ECUACIONES DE TRANSFORMACION PARA ROTACIONES EN TORNO A LOS OTROS DOS EJES COORDENADOS PUEDEN OBTENERSE CON UNA PERMUTACION CICLICA DE LOS PARAMETROS COORDENADOS DE LAS ECUACIONES ANTERIORES. SUSTITUIMOS X POR Y, Y POR Z Y Z POR X

. UTILIZANDO ESTA PERMUTACION SE OBTIENEN LAS ECUACIONES PARA UNA ROTACION DEL EJE X:

y' = y cos - z sen z 1 = y sen + z cos x' = x

LO QUE FUEDE ESCRIBIRSE EN LA FORM& DE COORDENADAS HOMOGENEAS

O [X'Y'ZII = IXYZl]

Page 26: UNIDAD IZTAPALAPA 12>1

LAS COORDENADAS CICLICAMENTE PERMUTANTES DE LAS ECUACIONE DAN LAS ECUACIONES DE TRANSFORMACION PARA LA ROTACION DEL EJE Y:

z ' = z cos - x sen z ' = z sen + x cos Y ' = Y

LO QUE PUEDE ESCRIBIRSE EN LA FORMA DE COORDEIWDAS HOMOGENEAS

cos o -SEN o [im 5 I X ' Y ' Z ' I = [ X Y Z l ]

UNA MATRIZ DE ROTACION INVERSA SE FORMA SUSTITUYENDO EL ANGULO DE ROTACJON POR - . LOS VALORES NEGATIVOS DEL ANGULO DE ROTACION GENERAN ROTACIONES EN UNA DIRECCION IGUAL A LA DEL RELOJ, DE MODO QUE LA MATRIZ DE IDENTIDAD SE ,PRODUZCA CUANDO LA MATRIZ DE ROTACEON SE MULTIPLIQUE POR EL RECIPROCO. YA QUE SOLO LA SUNCION SENO SE VE AFECTADA POR EL CAMBIO DE SIGNO DEL ANGULO DE ROTACION, LA MATRIZ INVERSA TAMEIEN PUEDE OBTENERSE INTERCAMBIANDO HILERAS Y COLUMNAS. ES DECIR PODEMOS CALCULAR

LA INVERSA DE CUALQUIER MATRIZ DE ROTACION R MEDIANTE LA EVALUACION DE SU TRANSPUESTA. ESTE MET0i)u DE OBTENCION DE MATRIZ INVERSA' SE CUMPLE TAMBIEN PARA CDALQUIER MATRIZ DE ROTACION COMPUESTA.

ROTACION ALREDEDOR DE UN EJE ARBITRAR20

SE PUEDE HACER QUE LOS OBJETOS GIREN EN TORNO A CUALQUIER EJE SELECCIONADO EN FORMA ARBITRARIA, APLICANDO UNA MATRIZ COMPUESTA CUYAS COMPONENTES EFECTUAN UNA SECUENCIA DE TRASLACIONES Y ROTACIONES EN TORNO A LOS EJES COORDENADOS.

EN EL CASO ESPECIAL DONDE EL EJE DE ROTACION SELECCIONADO ES PARALELO A UNO DE LOS EJES COORDENADOS, LA RQTACION D E S W A DEL OBJETO SE LOGRA CON EL CONJUNTO EQUIVALENTE DE TRES TRANSFORMACIONES.

Page 27: UNIDAD IZTAPALAPA 12>1

l.-TRASLADECE EL OBJETO DE MANERA QUE EL, EJE DE ROTACION COINCIDA CON EL EJE COORDENADO PARALELO.

2.-EFECTUESE LA ROTACION ESPECIFICADA.

3.-TRASLADECE EL OBJETO DE MODO QUE EL EJE DE ROTACION SE DEWELVA A SU POSICION ORIGINAL.

CUANDO UN EJE DE ROTACION TRIDIMENCIONALi NO ES PARALELO A LOS EJES COORDENADOS , ES PRECISO EFECTUAR ALGUNAS TRANSFORMACIONES ADICIONALES. EN ESTE CASO. TAMBIEN SE HACE GIRAR EL EJE DE ROTACION DE MANERA QUE SE ALINEE CON UN EJE COORDENADO Y SE APLIQUEN ROTACIONES INVERSAS PARA DEVOLVER EL EJE A SU ORIENTACION ORIGINAL. PODEMOS DETE-NAR LA FORMAR DE LAS MATRICES DE TRANSFORMACION DE ESTU ROTACIONES DE ALINEACION UTILIZANDO OPERACIONES VECTORIALES COMUNES.

SaTPRBSION DE SUPERFICIES OCULTAS

UNA CONSIDBRACION IMPORTANTE EN LA GENERACION DE ESCENAS REALISTAS ES LA IDENTIFICACION Y SUPRESION DE'LAS 'PARTES DE LA IMAGEN DEFINIDA QUE NO SON VISIBLES DES- UNA POSICION DE OBSERVACION SELECCIONADA. EXISTEN MUCHOS METODOS QUE SE PUEDEN UTILIZAR PARA RESORVER ESTE PROBLEMA Y SE mT CREADO NUMEROSOS ALGORITMOS PARA ELIMINAR LAS PARTES OCULTAS DE ESCENAS EN FORMA EFICAZ EN DIFERENTES TIPOS DE APLICACIONES. ALGUNOS METODOS REQUIEREN MAS MEMORIA, EN ALGUNOS INTERVIENE MAS EL TIEMPO DE PROCESAMIENTO Y ALGUNOS SOLO SE APLICAN A TIPOS ESPECIALES DE OBJETOS. EL METODO ELEGIDO PARA UNA APLICACION DETERMINADA DEPENDE DE FACTORES TALES COMO LA COMPLEJIDAD DE LA ESCENA, LOS TIPOS DE OBJETOS QUE SE DESPLEGARAN, EL EQUIPO

DE DISPOSICION Y SI SE VAN A GENERAR DESPLIEGUES ANIMADOS O BIEN ESTATICOS. ALGUNOS METODOS SON:

l.-METODO DE LA LINEA DE RASTREO. 2.-METODO DE ORDENAMIENTO CON PROFUNDIDAD. 3.-METODO DE SUBDIVISION DE AREAS. 4.-METODOS DEL ARBOL OCTAL.

Page 28: UNIDAD IZTAPALAPA 12>1

APLICACION DE GEOMETRIA PROYECTIVA

EL OBJETIVD DEL PROYECTO ES LA UTILIZACION DE LOS CONCEPTOS DE GEOMETRIA PRUYECTIVA ANTES VISTOS. SE APLICARAN A FIGURAS SENCILLAS (TRANSPARENTES O COLOREADAS), CON OPCION A ROTACION Y DESPLAZAMIENTO, OCULTAMIENTO DE LAS CARAS NO VISIBLES (EN EL CACO DE FIGURAS COLOREADAC.

LA PARTE PRINCIPAL ES UNA ESCENA, LA CUAL ESTA FORMADA POR DIVERSAS (1 O MAS) FIGURAS QUE A SU VEZ ESTA COMPUESTA POR CUERPOS, LOS CUERPOS POR CARAS Y LAS CARAS POR VERTICES EN 3 DIMENCIONES. DICHA ESCENA SE PROYECTA EN UN PLANO EN 2 DIMENCIONES (PANTALLA DEL MONITOR), SE ELIGE LA POSICION DEL OBSERVADOR (EN COORDENADAS ESFERICAS) Y LA DISTANCIA DESDE LA CUAL SE OBSERVA. SE LE INDICAN ADEMAS EL TIPO DE TRASLACION Y DE ROTACION POR MEDIO DE ECUACIONES DE TRAYECTORIA..

UNA TRAYECTORIA EN Rn ES UNA FUNCION : [a,bl - z Rn . SI ES DIFERENCIABLE DECIMOS QUE ES UNA TRAYECTORIA DIFERENCIABLE. LOS PUNTOS ( a ) Y ( b ) SON LOS EXTREMOS DE LA TRAYECTORIA.

ES UTIL REPRESENTAR t COMO A LA VARIABLE Y CONSIDERAR A (t) COMO EL TRAZO DE LA CURVA EN Rn CONFORME t VARIA. IMAGINAMOS A MENUDO A t COMO EL TIEMPO Y A (t) COMO UNA PARTICULA EN MOVIMIENTO.

SI ES UNA TRAYECTORIA EN R3, PODEMOS ESCRSBIR

Y LLAMAMOS A x (t) , Y (t) , z (t) FUNCIONES COMPONENTES DE . ES CURO QUE DE MANERA ANALOGA PODEMOS FORMAR FUNCIONES COMPONENTES EN R2, O EN GENERAL EN RN.

EN EL DESARROLLO DEL PROYECTO SE REALJZAIZON LAS SIGUIENTES PARTES.

LIMPAN

GRAFICO : INCLUYE PF-OCEDIMIENTOS PARA LIMPIAR LA PANTALLA EN MODO

LimpiaPantEJ la LimpiaEj es LimpiaEscena LimpiaFigura Limpiacuerpo LimpiaCaraOpaca LimpiaCaraTransparente

Page 29: UNIDAD IZTAPALAPA 12>1

3DA2D ALGORITMOS DE PROYECCION DE UNA FIGURA DE 3 A 2 DIMENCIONES. Proyecta3Da2D IniciaModoGraf ico Retardo PintaEj es Base ProyectaEscena ProyectaFigura Proyectacuerpo Proyectacara Dibujacara TrazaCaraExt TrazaCaraInt ProductoCruz ProductoPunto Fx FY Fz

DEFS

UTILICEN EN EL PROYECTO. CONTIENE LAS DEFINICIONES DE LAS ESTRUCTURAS DE DATOS QUE SE

ROTACI

ARBITRARIO. FUNCIONES ?ARA CREAR LA MATRIZ DE ROTACION EN TORNO A UN EJE

Identidad Crea-M-Traslacion Multi-Matriz Crea-M: RotacionZ Crea Vector - Unitario GiroA XZ Giro-A-Z Crea-M-Rotacion

- -

GPCRESCE PROCEDIMIENTOS PARA CAPTURAR UNA ESCENA (mEAR). AbreArchivrJ CierraArchivo Error CreaEscena ConstruycYtgura Cons truyeCtterpo Construyecara

,

Page 30: UNIDAD IZTAPALAPA 12>1

GPLEESCE

DE üN ARCHIVO. LeeEscena LeeFigura Leecuerpo LeeCara

PROCEDIMIENTOS PARA LEER LOS PUNTOS QUE DEFINEN UNA ESCENA

GPFIN PROCEDIMIRaSTOS DE BORRADO DE FIGURAS. BorraFigura Borracuerpo

GPRIN PROGRAMA PRINCIPAL. main ObtenEscena Iniciavariables

Page 31: UNIDAD IZTAPALAPA 12>1

iclude cgraphics.h> iclude cstdio.h> iclude cstdlib.h> iclude cmath.h> iclude cconio.h> iclude "gpdef s. cV1

variables externas globales */ iclude llgpglobae. cI1

)at ProductoPunto( Puntos3D rvectorl, Puntos3D *vector2 1; )at Fx(int i, float t) ; )at Fy(int i, float t); )at Fz(int i, float t);

float deltax, deltay, deltaz ;

)yecta3Da2DCuerpo( CuerposG *cuerpo1 )

static Puntos3D ejes[ 6 + 4 1 = { O,O,O, O,OfO, O,O,O, o,o,o, o,o,o, o,o,o, o,o,o, o,o,o, o,o,o, 0,OfO };

/* del 734 al 934vector de los ejes corresponden a deltas y el 10% ai origen. */

textmode (3) ; IniciaModoGraf ico ( ) ;

Base(); /* Determination de la base del sistema proyectivo */ Proyectacuerpo( cuerpo1 ) ; / * Proyector principal*/ Retardol) ; /* Limpiapantalla ( escenal, ejes ; */ clearviewport ( ) ; restorecrtmode (1 ;

int tarjeta, modog ;

detectgraph(&tarjeta, modog) ;

_i

initgraph(&tarjeta, &nodog, IVII) ;

setwritemode ( XOR PUT ) ;

setlinestyle ( LINEA-EXTERNA, O, NORM-WIDTH ) ;

maximax = getmaxx0 ;

Mainwindow ( VIGeometr& Proyectiva1!) ;

-

maximay = getmaxyo ;

:ardo ( )

char c ; @

c .= getch() ;

Page 32: UNIDAD IZTAPALAPA 12>1

int m; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D e [6+41 ;

(C I - > x = masaltax * 1.1; (c + l)-> x = masbajax * 1.1; (c + 2)-> y = inpaltay * 1.1; (c + 3)-> y = masbajay * 1.1; (c + 4)-> z = masaltaz * 1.1; (c + 5)-> z = masbajaz * 1.1; (c + 6)-> x = deltax;

(c + 7)-> x = deltax; (c + 7)-> y = deltay;

(c + 8)-> x = deltax; (c + a)-> y = deltay; (c + 8)-> z = deltaz;

for( m=O ; mc 10 ;++m)

pcu = ( ( ( c + m )->XI* matriz3DA2D[O] .x + ( ( c + m )->y)* matriz3DA2D[O .y + ( ( c + m )->z)* matriz3DA2D[O].z ) ;

pcv = ( ( ( c + m ) ->XI * matriz3DA2D[l] .x + ( ( c + m )->y) * matriz3DA2D[l] .y + ( ( c + m ->z) * matriz3DA2D[l] .z);

pcw = ( ( ( c + m )->XI * matriz3DA2D[2] .x + ( ( c + m ->y) * matriz3DA2D[2] .y + ( ( c + m ) ->z) * matriz3DA2D[2] .z);

xp = (dh * pcv)/(rh - pcu); yp = (dh * pcw)/(rh - pcu);

ehl .xg = ( int ) ( maximax * 0.53 ) + ( xp * 0.34 * maximax ) ;

eími .yg = ( int ( maximax * 0.68 )

{

/ * Guarda coordenadas en 2 dimensiones: */

."* - ( 150 + yp * 150 ) ;

1 ; setcolor(EGA LIGHTGRAY); setlinestyle7 CENTER - LINE, 125, NOW-WIDTH ) ; for( m=O ; m< 6 ; m+=2 )

setcolor (EGA DARKGRAY) ; setlinestyle7 DASHED-LINE, 125, NOW-WIDTH ) ;

line ( e [ml .xg, e [ml .yg, e [m+il .xg, e [mi11 .yg ) ;

line( e[9l .xg, erg1 .yg, e[61 .xg, e161 .yg 1 ; /* ( O, O, o) - (ax, o, o)*/ line( eC61 .xg, e[61 .yg, e171 .xg, e[7i .yg ) ;/*(ax , O, o ) - (&,ay, o)*/ line( e[71 .Xg, e[71 -Yg, e181 -Xg, e[81 .yg 1 ;/*(dx,dy, O) - (dx,dy,dz)*/ setlinestyle( SOLID - LINE, O, NOW-WIDTH ) ;

'* fin Ejes */

. .. ". .

Page 33: UNIDAD IZTAPALAPA 12>1

rh = coefrobser[Ol + t * coefrobserill + t * t * coefrobser[2] ; theta = coefthobseri01 + t * coefthobser[ll + t * t * coefthobseri21 ; phi = coefphohser[Ol + t * coefphobser[ll + t * t * coefphobser[2] ; matriz3DA2D[Ol .x = matriz3DA2D[O] .y = matriz3DA2D [O] . z = matriz3DA2D[l] .x = matriz3DA2D[l] .y = matriz3DA2D[l] .z = matriz3DA2D[21 . x = matriz3DA2D[2] .y = matriz3DA2D[2] . z = return (O) ;

'* fin base */

sin(theta) * cos(phi) ; sin (theta) * sin (phi) ; cos (theta) ; -sin (phi) ; cos (phi) ; 0.0; -cos (theta) * cos (phi) ; -cos(theta) * sin(phi) ; sin (theta) ;

ProyectaEscena traduce los puntos de una Escena a 2D, dados el radio, la distancia d y la matriz de proyecciAn.

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

)yectaEscena( Escenas fescenal, Puntos3D *ejes)

char i;

'*fin

PintaEjes ( ejes 1 ; setwritemode( XOR PUT ) ; setlinestyle( LINEA-EXTERNA, O, NORM WIDTH ) ; for (i=O ; ic= ( escenal ) ->ultFigura ; ++i) {

deltax = Fx(i,t); deltay = Fy(i,t); deltaz = Fz(i,t); ProyectaFigura ( i, escenal ) ;

1; ProyectaEscena */

char i; Figuras figural ;

figural = * ( (&cenai)->figura[j] ) ; for (i=O ; ic= t figural ).ult~~erpo ; ++i){ /* ProyectaCuerpo( i, &figural ) ; */

* ( ( escena1 ) ->figura [j I ) = figural ; 1;

'* fin ProyectaFigura */

CuerposG cuerpo1 ; CarasG cara1 ; int visible = l,i=O ;

Page 34: UNIDAD IZTAPALAPA 12>1

cuerpol = *cuerpo2 ; for (i=O ; ie= ( cuerpoi.uitCara) ; ++i){

caral = * ( ( cuerpoi ) .cara [i] ) ; Proyectacara( &caral, &visible ) ; if (visible) {

if ( !carai.color )

if ( cuerpoi.coior

else

caral.color = cuerpol.color

Dibujacara ( &cara1 ) ;

TrazaCaraExt( &cara1 ) I

}else{ if ( !cuerpoi.color )

TrazaCaraInt( &cara1 )

1; I

* ( ( cuerpoi 1 .cara[il ) = caral ; 1; *cuerpo2 = cuerpol ;

* fin Proyectacuerpo */

1 4 6 5 1 6

int m, u=O, v=l. w=2 ; Puntos3D vectorl, vector2 ; float xp, yp ; float pcu, pcv, pcw ;

/* Rota la cara completa, en una cara auxiliar, y toda la proyeccih se hace sobre la cara auxiliar. */

else { vector1.x = ( (al->punto3D[il) .x - (al->punto3D[OI) .x); vector1.y = ( (al->punto3D[lI 1 .y - (al-,>punto3D[OI) .y); vector1.z = ( (al->punto3D[lI) . z - (al-*>punto3D[O]) .z);

vector2.x = ( (al->punto3D[ml) .x - (al->punto3D[Ol) .XI; vector2.y = ( (al->punto3D[ml) .y - (al->punto3D[Ol) .y); vector2.z = ( (al->punto3D[ml) .z - (al->punto3D[Ol) .z);

ProductoCruz(&vectorl, &vector2); /* vector noma1 a la cara */ vector2 = matriz3DA2D[O] ; /* coordenadas del observador */ *visible = ( (ProductoPunto(&vectorl, &vector2)) O ? 1 : O ) ; / *

Si el proc$cto punto del vector normal a la cara con la posiciAn del observador es 0,la cara es visible.

Page 35: UNIDAD IZTAPALAPA 12>1

*/ A

* 5 1; *

{ for( m=O ; mc= (al-> ultVertice);++m)/* todos . F ~ S puntos de la cara*/

pcu = ((al->punto3D[ml) .x + deltax) * matriz3DA2D[ul .x + ( (ai- >punto3D [ml 1 .y + deltay) * matriz3DA2D [u] .y + ( (al->punto3D [ml 1 . z + deltaz) * matriz3DA2D [u] . z;

pcv = ( (al->punto3D[ml) .x + deltax) * matriz3DA2D[v] .x + * matriz3DA2D[v] .y + ((al->punto3D[ml) .y + deltay)

( (al->punto3D [ml 1 . z + deltaz) * matriz3DA2D [VI . z; pcw = ( (al->punto3D[ml) .x + deltax) * matriz3DA2D[w] .x +

* matriz3DA2D[w] .y +

xp = (dh * pcv)/(rh - pcu) ; yp = (dh * pcw)/(rh - pcu);

( (al->punto3D[ml 1 .y + deltay) ( (al->punto3D [ml 1 . z + deltaz) * matriz3DA2D [w] . z;

/* Guarda coordenadas en 2 dimensiones: */ al- >punto2D [ml . xf = xp ; al- >punto2D [ml . yf = yp ;

1; * fin Proyectacara */

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA I ;

for( m=O ; m<= (*al).ultVertice;++m)/* todos los puntos de la cara*/

pse[ml .xg = ( int ( maximax * 0.53 ) {

+ ( (*ai) .punto2D[ml .xf * 0.34 * maximax ) ;

pseIm1 .yg = ( int ) ( maximax * 0.68 )

1; if ( ai->color == O I I ( al->coior r getmaxcoioro))

setf illstyle (SOLID FILL, (*ai) .color ) ; fiiipoiy ( ai->uitVertice + 1, pse 1 ;

- ( 150 + (*ai) .punto2D[ml .yf * 150 ) ;

(al->color) = 1 ;

'* fin Dibujacara */

TrazaCaraExt traza en pantalla los puntos ya t,ransformados por Proyectacara si el cuerpo es transparente y la cara es visible.

*/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .zaCaraExt ( CarasG *al)

int m ; float x p , yp ;

Page 36: UNIDAD IZTAPALAPA 12>1

float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA I ;

for( m=O ; mc= (*al) .ultVertice ;++m)/* todos* 1.0s puntos de la cara*/

pse[m] .xg = ( int 1 ( maximax * 0.53 ) {

+ ( (*ai) .puntoLD[mI .xf * 0.34 * maximax ) ;

pse[m].yg = ( int maximax * 0.68 ) - ( 150 + (*ai) .punto2D[ml .yf * 150 ) ;

1; setlinestyle (LINEA EXTERNA, 0,NORM - WIDTH ) ; setcoior (ai- >color); drawpoly ( al->ultVertice + 1, pse ) ; line( pse[OI .xg, pse[OI .yg,

pse [ al->ultVerticel .xg, pse [ al->ultVerticel .yg ) ; * fin TrazaCaraExt */ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

TrazaCaraInt traza en pantalla los puntos ya transformados por Proyectacara si el cuerpo es transparente y la . cara no es visible.

*/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . zaCaraInt( CarasG *al)

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA I ;

for( m=O ; mc= (al->ultVertice);++m)/t todos los puntos de la cara*/

pselml .xg = ( int ( maximax * 0.53 ) {

+ ( al-)punto2D [ml .xf * 0.34 * maximax ) ;

pse[m] .yg = ( int ) ( maximax * 0.68 ) - ( 150 + al->punto2D[ml .yf * 150 1;

1; setlinestyle(LINEA~INTEFlNA,O,NORM~WIDTH ) ; setcolor(a1->color); drawpoly ( al->ultVertice + 1, pse ) ; line ( pse 101 .xg, pse [O1 .yg,

* fin TrazaCaraInt */ pse[ al->ultVerticel .xg, pse[ al->ultVerticel .yg ) ;

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Funciones para t,y,z en funcih de t y de la figura.

*/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . lat Fx(int i, float t)

float result = O ;

result = coefFigura[il .coefx[Ol + t * coefFigura[il .coefx[ll + coefFigura[i].coefx[21 * (t * t) + coefFigura[il .coefx[31 * sin( t * coefFigura[il .coefx[4] +

coefFigura [il . coefx [5] ) ; return result ;

lat Fy(int i, float t:

Page 37: UNIDAD IZTAPALAPA 12>1

float result = O ;

result = coefFigura[il .coefy[Ol + t * coefFigul?a[i] .coefy[l] +

return result ;

coefFigura[i].coefy[21 * (t * t) + *-

coefFigura[il .coefy[31 * sin( t * coefFigura[il .coefy[4] + coef

[at Fz(int i, float t)

float result = O ;

result = coefFigura[il .coefz[Ol + t * coefFigura[il .coefz[l] + coefFigura[iI.coefz[21 * (t * t) + coefFigura[il .coefz[31 * sin( t * coefFigura[i] .coefz[41 +

coefFigura[il .coefz[51 ) ; return result ;

Puntos3D vector3;

vector3.x = ( ( vectorl->y ) * (vector2->z) - ( vectori->z ) * (vector2->y) ) ;

vector3.y = ( ( vectorl->z ) * (vector2->x) - ( vectori->x ) * (vector2->z) ;

vector3.z = ( ( vectorl->x ) * (vectorL->y) - *vector1 = vector3 ;

( vectori->y * (vector2->x) ) ;

* fin ProductoCruz */

return ( ( vectorl->x ) * ( vector2->x) + ( vectorl->y ) * ( vector2->y) + ( vectorl->z ) * ( vectorl->z) ) ;

'* fin ProductoPunto */ iclude cgraphics.h> dude cstdio.h> iclude cstdlib.h> iclude <math. h> iclude cctype. h> dude cconio.h> iclude "gpdefs.cIl

variables externas globales */ dude Ilgpglobae. c1I

Page 38: UNIDAD IZTAPALAPA 12>1

*/ * / */ */

MAINWINDOW: Establish the main window for the demo and set a viewport for the demo code.

d Mainwindow( char *header )

nt height;

etcolor( getmaxcolor0 - 1 ) ; /* Set current color to white etviewport ( O, O, maximax, maximay, i ) ; /* Open port to full screen leardevice ( ) ; /* Clear graphics screen */

.eight = textheight( #HI1 1; /* Get basic text height ettextstyle( DEFAULT FONT, HORIZ DIR, 1 ) ; ettextjustify( CENTER-TEXT, TOP TEXT ; uttextxy ( maximax/2, 2, header 7; etviewport ( O, height+4, maximax, maximay- (height+4), 1 ) ; IrawBorder ( ) ; etviewport ( 1, height+5, maximax-1, maximay- (height+5), 1. ) ;

STATUSLINE: Display a status line at the bottom of the screen.

*/

*/ */ */

d StatusLine( char *msg )

nt height;

etviewport( O, O, maximax, maximay, 1 ) ; /* Open port to full screen etcolor ( getmaxcolor0 - 1 ) ; /* Set current color to white ettextstyle( DEFAULT FONT, HORIZ DIR, 1 ) ; ettextjustify( CENTER-TEXT, TOP TEXT ; etiinestyie( SOLID LINE, O, NORE-WIDTH ; etfiiistyie ( EMPTY-FILL, - O ) ;

eight = textheight( I1HV1 ) ; /* Detemine current height lar ( O, maximay- (height+4) , maximax, maximay ) ; ,ectangle ( O, maximay- (height+4), maximax, maximay ) ; wttextxy( maximax/2, maximay- (height+2), msg ) ; etviewport ( 1, height+5, maximax-1, maximay- (height+T), 1 ) ;

*/

DRAWBORDER: Draw a solid single line around the current viewport.

wBorder (void)

truct viewporttype vq;

etcolor( getmaxcolor0 - 1 ) ; /* Set current color to white etlinestyle( SOLID-LXNE, O, NORM WIDTH 1;

etviewsettings ( &vp ) ;

-

*/ * / */ */

Page 39: UNIDAD IZTAPALAPA 12>1

ectangle( O, O, vp.right-vp.left, -.bottom-vp.top g

I ,

1 - 1 1 . int i, j ; char cadena 151 , relleno [71 = iiuu[Tuull;

/* for ( i = 1 ; i e= 15 ; ++i ) { * / ventana-xy (7,1,1) ; itoa (1, cadena, 10 1 ; ventana-xy (7,1,1) ; ventana escribet (7, II 1" ) ; ventana xy (7,3,1) ; ventana-escribet (7, !!azul II 1 ; ventanazxy(7,1,2) ; VentanaIescribet (7, 2" ) ; ventana_xy(7,3,2) ; ventana escribet(7, "verdev1 ) ; ventana_xy(7,1,3); ventana-escribet(7,Il 3" 1; ventana xy(7,3,3) ; ventana-escribet (7,"cyan" ) ; ventanaZxy(7,1,4); ventanaIescribet(7,Il 4 " 1; ventana_xy(7,3,4) ; ventana e~cribet(7,~~yojo~~ ) ; ventana xy(7,1,5) ; ventanhescribet (7, 5" 1 ; ventanaIxy(7,3,5) ; ventana escribet (7, wmagentall) ; ventana-xy (7,1,6) ; ventana-escribet (7, 6 " 1 ; ventana-xy (7,3,6) ; ventanaIescribet (7, "caf

ventana_xy(7,3,7); ventana escribet (7, "gris c" 1 ; ventana-xy (7,1,8) ; ventana-escribet (7, " 8 1 ; ventana_xy(7,3,8) ; ventana-escribet (7, '#gris o" ) ; ventana_xy(7,1,9) ; ventana-escribet(7,11 9" ) ; ventana-xy (7,3,9 ) ; ventana-escribet (7, "azul c" ) ; ventana_xy(7,1,10); ventana e~cribet(7,~lO" 1; ventana xy (7,3,10) ; ventana-escribet (7, "verde c" ) ; ventanarxy(7,1,ii) ; ventana-escribet (7, t3111v ) ; ventana_xy(7,3,11); ventanaIescribet (7,"cyan c1I 1; ventana_xy(7,1,12) ; ventana escribet (7,111211 ; ventana.-xy(7,3,12) ; ventana-escribet (7, I1rojo c" ) ; ventana_xy(7,1,13) ; ventana-escribet (7, ii1311 ) ; ventana_xy(7,3,13) ; ventana-escribet (7, Ifmagenta c" ) ; ventana xy(7,1,14) ; ventana-escribet (7, i11411 ; ventanaIxy(7,3,14) ; ventana-escribet (7, llamarilloll ) ; ventana_xy(7,1,15) ; ventana-escribet (7, "15" ) ; ventana_xy(7,3,15) ; ventanhescribet (7, Ilblanco" ) ;

; ventana_xy(7,1,7) ; ventana-escribet (7, 7" 1;

/* ): * / '* Pintacóiores */

int chl, xl,yl ; char *cadi;

/* clrscr ( ) ; */ ventana(0) ; ventana-xy (O, 28 5) ; ventana-escribec (O, : Proyectar Escena. ; ventana xy(0,28,7); ventana1escribet(0,liM : Modificar Escena. "1;

Page 40: UNIDAD IZTAPALAPA 12>1

ventana-xy (O, 2 8 I 9 I ; ventana escribet (O, IiF : Funciones F (t) . 'I) ; ventanaIxy ( O I 2 8, ii ; ventana-escribet(0,"S : Salir de GeomProy."); ventana-xy ( O, 2 8,13 ; ventana escribet (O, II Opcih: ' I ) ; xl = wh&ex() ; y1 = whereyo ;

chl = toupper( getcheo 1 ; cadl = strchr ( ilPMFS1l, chl) ;

do {

gotoxy(xl,y1) ; }while (cadl == NULL) ; desactiva(0) ; return chl ;

int chl, xl,yl ; char *cadl, cadenaf301 = I1\O1l;

{

ventana (5 ) ; ventana xy(5,2,1) ; ventana-escribet. (5, : Crear Escena. ; ventanaIxy (5,2,3) ; ventana-escribet (5 I I1L : Leer Escena. 1 ; ventana-xy (5 I 2,5) ; ventana-escribet (5, llOopciAn? (c/L) : do {

ventana-xy ( 5,19, 5) ; chl = toupper( getche 0 ) ; cadl = strchr ( iiCL1l, chl) ;

}while (cadl == NULL); ventana_xy(5,2,7) ; ventana - es~ribet(5,~~Usando el archivo:[

ventana_xy(5,21,7) ; ventana lee campo (5, cadena, 25) ;

}while ( strlenTcadsna) e 1) ; if ( chl == 'L') {

if ( ! (AbreArchivo ( archivoEscena Error (2) ;

if ( !(AbreArchivo( archivoEscena Error(1);

do {

1 else if ( chl A* IC'){

1 ; desactiva (5) ; return chl ;

/ *fin PideOpcionEscena */

1 ;

1 ;

, cadena ,llrbll)))

I cadena , I1wbn 1 1 1

*/

Rutinas de ventanas para presentacib */ aVentanas ( )

rear ventana (O, Geometrh Proyectiva U , O, 0,79,24,1,VID-N0RM) ; crear - ventana (1, Ecuaciones del observador I 12, 3,70,18,2 I VID-INV) ;

Page 41: UNIDAD IZTAPALAPA 12>1

rear-ventana (2, Obtencih de la figura I ! , 5, 3,57, 5,2,VID INV); rear ventana (3, Obtencih del cuerpo 6, 5,60,10,2,VID1INV); rearventana (4, II Obtencih de la cara I ! , 2, 8;G5,24,2,VID_INV); rearventana (5, Obtencih de la Escena ! I , 10, 2,65,14,1,VID INV);

rearventana (7,11Coiores11, 6 6 , 2,79,19,1,VIDINORM) ;*/ rearzventana (8, Ecuaciones del cuerpo 1, 3,79,24,2,VID-INV);

rearventana (6, Creacih de la Escena ! I , 4 , i,50, ~,I,VID-INV);

float rO, rl, r2, r3, r4 ; char cadena [201 ;

ventana (1) ; ventana-xy (1,2,1) ; ventana escribet(l,llCoordenadas esfricas del observador:" 1; ventanazxy (I, 2,3) ; ventana-escribet (1, IIR(t) = [ I + [ l*t + [ I*t*if 1;

ventana-xy (1,8,3) ; gcvt (coefrobser [O1 ,7, cadena) ; ventana-lee-campo numerico(l,cadena,7); coefrobser[Ol = (float) atof (cadena) ;

ventana-xy (1,2 O, 3 ) ; gcvt (coefrobser 111 ,7, cadena) ; ventana lee campo numeric0 (1, cadena, 7) ; coefrobser [TI = (Tioat) atof (cadena) ;

ventana-xy (1,34,3 1 ; gcvt (coef robser [2 I ,7, cadena) ; ventana lee-campo-numeric0 (1, cadena, 7) ; coefrobser [2] = (float) atof (cadena) ;

ventana-xy ( 1,2,5 ) ;

ventana-xy (1,8,5 ; gcvt (coefthobser [O] ,7, cadena) ; ventana-lee-campo-numeric0 (1, cadena, 7) ; coef thobser [O] = (float) atof (cadena) ;

ventana-escribet (1, (t) = [ I + [

ventana-xy ( 1,2 O ,5 ) ; gcvt (coefthobser [ll ,7, cadena) ; ventana lee campo - numerico(l,cadena,7); coef thobser[l] - (float) atof (cadena) ; ventana-xy ( 1,3 4 I 5 ) ; gcvt (coefthobser[21 ,7,cadena) ; ventana~lee~campo~numerico(l,cadena,7); coefthobser[2] = (float) atof (cadena) ;

ventana-xy ( 1,2,7 ) ; ventana-escribet (1, (t) = [ I + [ ventana-xy (1,8,7) ; gcvt (coefphobser [O] ,7, cadena) ; ventana - lee - cam~o-numerico(l,cadena,7);

l * t + [ l*t*" ) ;

l*t + [ ]*t*" ) ;

Page 42: UNIDAD IZTAPALAPA 12>1

coefphobser [O] = (float) atof (cadena) ;

ventana-xy ( 1,2 O. 7 ) ; gcvt (coefphobser 111 ,7, cadena) ; ventana lee-campo-numerico(l,cadena,7); coefphobser [l] = (float) atof (cadena) ;

ventana-xy (1,34,7) ;' gcvt (coefphobser [21 ,7, cadena) ; ventana~lee~campo~numerico(l,cadena,7); coefphobser [23 = (float) atof (cadena) ;

ventana-xy (1,2,9 ) ; ventana-escribet(l,"Distancia del observador al plano proyectivo:ll

ventana-xy ( 1,4 7,9 ) ; gcvt (dh, 7, cadena) ; ventana~iee~campo~numerico(1,cade~a,~~; dh = (float) atof (cadena);

1;

ventana_xy(i,2,11) ; ventana escribet (1, I1to= ] deltat-[ - ventana-xy ( 1,6,11) ; gcvt (to,7,cadena) ; ventana~lee~campo~numerico(l,cadena,7); to = (float) atof (cadena);

ventana-xy (1,23,11) ; gcvt (deltat, 7, cadena) ; ventana - lee-campo-numerico(l,cadena,7); deltat = (float; atof (cadena) ;

ventana-xy ( 1,3 6,111 ; gcvt (tf, 7, cadena) ; ventana-lee-campo-nurico (1, cadena, 7) ; tf = (float) atof (cadena);

ret = 10 ; ventana-xy (1,2,3.3 ) ; ventana escribet (1, llFactor de retardo = -

3 tf=[ ) ;

ventana-xy (1,23,13 ) ; gcvt (ret,4,cadena) ; ventana-lee-cai--$o-numeric0 (1, cadena, 4 1 ; ret = (int) abs( atof (cadena) 1 ; desactiva (1) ;

*/ */

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . enEcuacionesFigura(const int *j ) /* informacih de la figura j-sima */ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - - - - _ _ - _ _ - - - -

float rO, rl, r2, r3, r4, r5 ; char cadena I201 ;

result = coefFigura[il .coefx[Ol + t * coefFigura[il .coefx[ll + coefFigura[i].coefx[2] * (t * t) +

Page 43: UNIDAD IZTAPALAPA 12>1

coefFigura[il .coefx[3] * sin( t * coef@igura[i] .coefx[4] + coefFigura[il .coefx[51 1 ;

return result ; */

ventana (8) ; ventana_xy(8,3,1) ;

ventana-xy (8,39,1) ; gcvt ( * j , 3, cadena) ; ventana-escribe& (8, cadena) ;

ventana xy(8,1,3);

ventana:- ( 8,1,4 ) ;

ventana xy(8,9,3) ; gcvt (coefFigura[*j] .coefx[O] ,7,cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFigura[*jl .coefx[Ol = (float ventana-xy (8,21,3) ; gcvt (coef Figura [*j I . coefx [ll ,7, cadena) ; ventanaIlee-campo-numerico(8,cadena, 7) ; coefFigura[*jl .coefx[ll = (float ventana xy(8,34,3) ; gcvt(coefFigura[*jl .coefx[21 ,7,cadena); ventanaIlee - campo - numerico(8,cadena,7) ; coefFigura[*j] .coefx[21 = (float

ventana xy(8,9,4) ; gcvt (coefFigura[*jl .coefx[31 ,7,cadena) ; ventana-lee-campo-nuerico(8,cadena, 7) ; coefFigura[*jl .coefx[31 = (float ventanaIxy(8,24,4) ; gcvt (coefFigura[*jl .coefx[41,7,cadena) ; ventana-lee-campo numerico(8,cadena,7) ; coefFigura[*jl .coefx[41 = (float ventana xy(8,37,4); gcvt (coefFigura[*jl .coefx[5] ,7,cadena) ; ventanaIlee-campo-numerico(8,cadena, 7) ; coefFigura[*jl .coefx[51 = (float

- (r*

ventana-escribet (8, I1Funcih de traslacih de la figura: . I1 1;

1 4 6 5 1 6 ventana-escribet (8, I1X(t) = [ I + [ It + r 3 t» + i t ) ;

ventana - escribet (8, ]SENO( [ It + i 1 ) . I 1 ) ;

- - - - _ _ _ - - - _ - - - - - - - - - L _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ventana-xy ( 8,1,6) ;

ventanaxxy(8,1,7) ; ventana escribet(8, "Y(t) = [ I + [ - I t + [ 3 t» +! I ) ;

ventana-escribet (8, r ]SENO( [ It + r 1

ventana_xy(8,9,6) ; gcvt (coefFigura[*j] .coefy[Ql ,7,cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFiyura[*j] .coefy[O] = (float ventana-xy (8,21,6) ; gcvt (coef Figura [*j I . coefy [I] ,7, cadena) ; ventana lee campo-numerico(8,cadena,7) ; coefFigrira[*j] .coefy[ll = (float ventanazxy(8,34,6) ; gcvt (coefFigura[*jl .coefy[2],7,cadena) ; ventana - lee - campo - numerico(8,cadena,7) ; coefFigura[*jl .coefy[21 = (float

ventana-xy (8,9,7) ; gcvt (coefFigura [*j 1 . coefy [31,, 7, cadena) ; ventana-lee-campo-numerico(8,cadena,7); coefFigura[*jI.coefy[31 = (float ventana_xy(8,24,7) ; gcvt (coefFigura[*jl .coefy[41 ,7,cadena) ; ventana lee campo numerico(8,cadena,7) ; coefFigura[*jl .coefy[4] = (float ventanazxy (8,37,7); gcvt (coefFigura [*j 1 . coefy [5),7, cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFipra[*jl .coefy[5] = (float

ventana-xy (8,1,9) ;

ventana_xy(8,1,10) ;

ventana-xy (8,9,4r) ; gcvt (coefFigura [*j I . coefz [O], 7, cadena) ; ventana~lee~campo~numerico(8,cadena,7) ; coefFigura[*jl .coefz[Ol = (float ventana_xy(8,21,9) ; gcvt (coefFigura[*jl .coefz[ll ,7,cadena) ; ventana-lee campo-numerico(8,cadena,7) ; coefFigura[*jl .coefz[ll = (float ventana_xy(8,34,9) ; gcvt(coefFigura[*jl .coefz[d! ,7,cadena);

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

ventana-escribet (8, IiZ (t) = [ I + [ It + r 3 t» +if);

ventana - escribet (8, r ]SENO( [ It + r 1

Page 44: UNIDAD IZTAPALAPA 12>1

ventana - lee - campo-numerico(8,cadena,7) ; coefFiyura[*jl .coefz[2] = (float

ventana_xy(8,9,10) ; gcvt (coefFigura[*jl .coefz[j? ,7,cadena) ; ventana lee campo numerico(8,cadena,7) ; coefFi,~ara[*jl .coefz[31 = (float ventana-xy(8,24,15) ; gcvt(coefFigura[*jl .coefz[41 ,7,cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFigura[*j] .coefz[41 = (float ventanaIxy (8,37,10) ; gcvt (coefFigura [*j 1 . coef z [5] ,7, cadena) ; ventana - lee-campo - numerico(8,cadena,7) ; coefFigura[*jl .coefz[51 = (float

desactiva(8) ;

clude cstdio.h> clude cstdlib.h> clude cmath.h> clude llgpdef s. c1I fine MAXCOEFGAMA 7 fine MAXCOEFZETA 6 fine MAXINTERANG 32 fine MAXINTERZ 16

variables globales */

typedef Puntos3D Reticulas[ MAXINTERANG I [ MAXINTERZ 3 ; Coef Figura coef Figura [ MAXFIGURAS 1 ; CoefsObser coefrobser ; CoefsObser coefthobser ; CoefsObser coefphobser ; float to, t, deltat, tf; float Rgama [ MAXCOEFGAMA 1 , Rzeta [ MAXCOEFZETA I ; int ret ; float rh, theta, phi, dh ; Puntos3D matriz3DA2D[ 3 I;/* Vectores de base del sistema proyectivo*/ float maximax, maximay, masaltax, masaltay ,

FILE *Arch - datos; masbajax,masbajay,masaltaz, masbajaz ;

1 I n (void)

char continuar f 1 ,option = '; CuerposG *cue@Hl ;

Reticulas reticula; float gamaO=O,gamaf=O,zetaO=O,zetaf=O; int intervalosg=O , intervalosz=O;

Creaventanas ( ) ; Iniciavariables (1 ; clrscro ; cuerpo1 = malloc (sizeof (CuerposG) ; cuerpol->ultCara = -1 ; cuerpol->color = O ; setcbrk(1) ; ObtenFunciones( &gamaO, &gamaf, &zetaO,

&zetaf, &intervalosg,&intervalosz, Rgama, Rzeta ) ;

Page 45: UNIDAD IZTAPALAPA 12>1

Formacaras( cuerpol, intervalosg, intervaiosz,

* &zetaO, &zetaf ; ?a 4 ,

reticula, &gamaO, &gamaf,

while (continuar) { opcion = PideOpcion() ; switch (opcion) {

case 'P' :Proyecta3Da2DCuerpo(cuerpol) ; break; case 'W :ModificacionCuerpo(cuerpol) ; break; case 'I?' :ObtenFunciones( &gamaO, &gamf,&zetaO,

fzetaf, &intervalosg,&intervalosz, Rgama, Rzeta 1;

Formacaras( cuerpol, intervalosg, intervalosz, reticula, &gamo, &gamqf, &zetaO, &zetaf 1

; break; case 'S' : continuar = O ; break; 1;

1; /* Borracuerpo (cuerpol) ; */ return O ;

ificacionCuerpo(CuerposG *cuerpol)

char cadena [201 ;

result = coefFigura[il .coefx[Ol + t * coefFigura[il .coefx[l] + coefFigura[i].coefx[2] * (t * t) + coefFiyura[il .coefx[31 * sin( t * coefFigura[il .coefx[4] +

coefFigura[i] .coefx[51 ) ; return result ; */

ventana ( 8 ) ; ventana_xy(8,3,1) ; ventana e~cribet(8,~~Funciones de superficie del cuerpo" ventanaIxy (8,3,2) ; ventana-escribet ( 8 , "en coordenadas cilhdricas, i. e. radio= (z, ) . I1 ) ; ventana-xy ( 8,1,4 1 ;

ventanaIxy ( 8,1,7 ;

ventana-xy (8,11,4) ; gcvt (Rzeta [O] ,7, cadena) ; ventana-lee-campo-numerico(8,cadena, 7) ; Rzeta[Ol = (float) atof (cadena) ; ventana_xy(8,23,4) ; gcvt(Rzeta[l] ,7,cadena) ; ventana-lee-caiipo_numerico(8,cadena,7) ; RzetaI9.1 = (float) atof (cadena) ; ventana_xy(8,36,4) ; gcvt(Rzeta[21 ,7,cadena); ventana lee campo numerico(8,cadena,7) ; RzetaI21 = (float) atof (cadena) ;

) ;

ventana escribet(8, "(z,) = [ I + [ 12 + [ 32» + " ) ;

ventana-escribet ( 8 , [ ]SENO( I lz + I ) +

- - -

Page 46: UNIDAD IZTAPALAPA 12>1

ventana-xy (8,11,7) ; gcvt (Rzeta [3 1 , 7, cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; Rzeta[3] = (float) atof (cadena) ;

ventana-lee-campo-numerico(8,cadena, 7) ; Rzetar41 = (float) atof (cadena) ; ventanaVxy(8,39,7) ; gcvt(Rzeta[51,7,cadena) ; ventanaIlee - campo - numerico(8, cadena, 7) ; Rzeta 151 = (float) atof (cadena) ;

ventana xy(8,26,7); gcvt(Rzeta[41 ,7,cadena); ,* >

ventana-xy ( 8,1,10 ) ;

ventana:- (8,22,12 1 ;

ventanaIxy (8,1,13 ;

ventana escribet ( 8 , [ I + [ 1, + i t ) ;

ventana escribet ( 8 , 1 1 I l l ;

ventana-escribet ( 8 , 3 SENO^ ( 1 I + [

ventana xy(8,11,10); gcvt(Rgama[OI ,7,cadena); ventanaIlee-cqo numerico(8,cadena,7) ; Rgama[Ol = (float) atof (cadena) ; ventana_xy(8,24,18) ; gcvt(Rgama[ll,7,cadena) ; ventana-lee-campo - numerico(8,cadena,7) ; RgamaLl] = (float) atof (cadena) ;

ventana - xy(8,11,13); gcvt(Rgama[2] ,7,cadena);

ventana-lee campo_numeric0(8,cadena,7) ; Rgama[21 = (float) atof (cadena) ; ventana ~~(8~23,121; gcvt(Rgama[31 ,3,cadena); ventana~lee-campo-numerico(8,cadena,3) ; Rgama[31 = (float) atof (cadena) ;

ventana xy(8,31,13); gcvt(Rgama[4],7,cadena); ventana-lee - - campo_numerico(8,cadena,7) ; Rgama[4J = (float) atof (cadena) ;

ventana_xy(8,40,12); gcvt(Rgama[51 Acadena); ventana-lee-campo numeric0 ( 8 , cadena, 3) ; Rgama [51 = (float) atof (cadena) ; ventana xy(8,48,13); gcvt(Rgama[61,7,cadena); ventanaxlee - campo_numerico(8,cadena,7) ; RgamaI61 = (float) atof (cadena) ;

ventana-xy (8,1,15 I ; ventana-escribet ( 8 , !!Rango de la funcih : 1 ; ventana xy(8,1,f6);

ventana-xy ( 8,1,17 ;

*zetaf = *zeta0 + 2;

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

ventana-escribet ( 8 , IIDesde z' = [ 1 , y "= [ 1 I ;

ventanaxescribet (8, "hasta ' z ' = [ 1 , y "= [ 1 . ;

*g-f = 6.2832;

ventana_xy(8,12,16); gcvt( *zeta0,7,cadena); ventana lee_campo_numeric0(8,cadena,7); *zeta0 = (float) atof(cadena1; ventanaIxy(8,29,16) ; gcvt ( *gama0,7,cadena) ; ventana lee-cmpo-numerico(8,cadena,7) ; *gama0 = (float) atof (cadena) ; ventanaIxy(8,12,17); gcvt( *zetaf,7,cadena); ventana lee-cmpo-numerico(8,cadena,7) ; *zetaf = (float) atof (cadena) ; ventanaIxy ( 8,2 9 I 17 1 ; gcvt ( *gamaf ,7, cadena 1 ; ventana~lee~campo~numerico(8,cadena, 7) ; *gamaf = (float) atof (cadena) ;

ventana-xy (8,1,18) ; ventana-escribet(8, ventana-xy (8,1,19 1 ; ventana escribet. ( 8 , llSobre z' : [ 1 , sobre ' ' : 1 . "1 ;

llIntervalos de muestre0 de la funcih:");

- *intervalos2 = *zetaf - *zetaO; *intervalosg = 8 ;

i

Page 47: UNIDAD IZTAPALAPA 12>1

ventana xy(8,12,19) ; itoa(*intervalosz, cad da,lO) ; ventana~lee-campo-numerico(8,cadena,3); *int&rv&losz = atoi(cadena1; ventana xy(8,29,19) ; itoa(*intervalosg, cadena,210); ventana-lee - - campo-numerico(8,cadena,3); *intervalosg = atoi(cadena);

float fgama0, float fgamaf, float *zetaO, float *zetaf, int *intervaiosg, int *intervalosz */

ventana-xy ( 8,1,3.7 ) ; ventana escribet (8, Il0Es un cuerpo cerrado? (S/N1 : [ I . ; desactiva (8) ;

ciavariables (1

int register i, j ;

coefrobser[Ol = 200; coefrobser[ll = O; coefrobser[2] = O ; coefthobser[Ol = 0.79; coefthobser[ll = 0.0; coefthobser[2] = O ; coefphobser[Ol = 0.79; coefphobser[ll = 0.0; coefthobser[21 = O ; dh = 35 ; to-O; deltat=0.2; tf=05;

for ( j = O; j cMAXCOEFGAMA ; ++j )

for ( j = O; j cMAXCOEFZETA ; ++j ) Rgama[jl = O ;

RzetaEj] = O ; Rgama[3] = Rgm[5] = 1 ;

at FuncionZG(f1oat zeta,float gama

float faux = O ;

faux = Rzeta[O] + Rzeta[l] * zeta + Rzeta[2] * zeta * zeta + Rzeta[3? * sin( Rzeta[4] * zeta + RzetaI51 + Rgama[O] * zeta + RgamaIll * gama * gama + . Rgama[2] * pow( sin( RgamaI41 * pow( gohma,Rgama[SI) return faux;

+ Rgama[GI) ,Rgama[31);

macaras( CuerposG tcuerpol, int intervalosg, int intervalosz, Reticulas reticula,float *gamaO, float *gamaf, float *zetaO,float *zetaf )

int i, j , k; float deltag, deltaz,zeta,gama,radio,basura=O;

deltag = fabs! *gamaf - *gama0 /intervalosg; deltaz = fabsS *zetaf - *zeta0 ) /intervalosi;

for (i=O,zeta=*zetaO; ic intervalosz ; zeta= *zeta0 + ( ++i * deltaz) ) { for (j=O,gama=*gamaO; jcintervalosg ;gama =*gama0 + (++j * delta

reticula[i] [jl .z = zeta; radio = FuncionZG(zeta,gama) ; reticula[il [jl .x = cos(gama) * radio; reticulari] [jl .y = sin(gama1 * radio;

Page 48: UNIDAD IZTAPALAPA 12>1

radio = O ;

for (i=O;ic(intervaiosz - i) ; ++i) { for ( j -O ; j c ( intervalosg - 1 ) ; ++j,++k) {

cuerpol- >cara [k] - >punto3D [O1 = reticula [il [j 1 ; cuerpol->carark] ->punto3D[lI = reticula[il [j+il ; cuerpol- >cara [kl - >punto3D 121 = reticula [i+il [j +11 ; cuerpol->cara[k] ->punto3D[3] = reticula[i+ll [jl ; cuerpol- >cara [kl - >ultVertice = 3 ; cuerpoi- >cara [k] - >color = 14;

cuerpol- >cara [kl - zpunto3D [O1 = reticula [il [j 1 ; cuerpol->cara[k] ->punto3D[l] = reticulafil [O1 ; cuerpol- >cara [k] - >punto3D [21 = reticula [ i + i l [O] ; cuerpol- >cara [kl - >punto3D [3] = reticula [i+il [j 1 ; cuerpoli >cara [k] ->color = 15;

1;

1; cuerpol->ultCara = k;

nclude cgraphics.h> clude cstdio.h> clude cstdlib.h> clude cmath. h> clude cconio.h> clude "gpdef s . cfl

variables externas globales */ clude "gpglobae. c1I

piaPantalla( Escenas *escenal,Puntos3D *ejes )

if ( t > ( tf - deltat ) )

setwritemode ( COPY PUT ; setfiiistyie (SOLIDIFILL, O ) ; setcolor (O) ; setlinestyle( SOLID LINE, O, NORM WIDTH ) ; LimpiaEscena ( escenk, ejes ) ;

if ( t e ( tf + deltat ) ) getch0;

-

int m; float x p , yp ; float pcul pcv, pcw ; IntPuntos2D e [6+41 ;

int m; float x p , yp ; float pcul pcv, pcw ; IntPuntos2D e [6+41 ;

for( m=O ; me 19 ;++m)

PCU = ( ( ( c + m )->XI * matriz3DA2D[Ci] .x + ( ( c + m - > y ) * matriz3DA2D[O] .y + ( ( c + m ) ->z) * matriz3DA2D[OI .z ) ;

pcv = ( ( ( c + m )->XI * matriz3DA2D[l] .x + ( ( c + m ) - > y ) * matriz3DA2D[l] .y + ( ( c + m ) ->z) * matriz3DA2D[l] . z ) ;

pcw = ( ( ( c + m ) ->XI * matriz3DA2D[2] .x + ( ( c + m ->y) * matriz3DA2D[2] .y +

{

Page 49: UNIDAD IZTAPALAPA 12>1

( ( c + m ) - > z ) * matriz3DA2D[2] . z ) ;

xp = (dh * pcv)/(rh - pcu); yp = (dh * pcw)/(rh - pcu);

e[m] .xg = ( int ) ( maximax * 0.53 ) + ( xp * 0.34 * maximax ) ;

e[ml .yg = ( int ) ( maximax * 0.68 )

/ * Guarda coordenadas en 2 dimensiones: */

- ( 150 + yp * 150 ) ;

1 ; for( m=O ; me 6 ; m+=2 )

line ( e [ml .xg, e [ml .yg, e [m+il .xg, e [n+il .yg ) ; line( e[gI.xg, eDI.yg, e[6l.xg, eL61.yg I ; / * ( O, O, o)-(dx, O, o)*/ line( e[61 .xg, e[61 .yg, e171 .xg, e171 .yg ) ; / * ( d x , O, O)- (dx,dy, O)*/ line ( e [71 .xg, e [71 .yg, e [81 .xg, e [81 .yg ) ;/* (dx,dy, O) - (dx,dy,dz) */

* fin LimpiaEjes */

piaEscena( Escenas tescenal, Puntos3D *ejes)

char i;

LimpiaEjes ( ejes ) ; for (i-O ; ic= ( escenal ) ->ultFigura ; ++i) {

LimpiaFigura ( i, escenal ) ; 1;

*fin LimpiaEscena */

char i; Figuras figural ;

figural = * ( (escenal) ->figura [jl ; for (i=O ; ie= ( figural ).uitCuerpo ; ++i){

LimpiaCderpo( i, &figural ) ; 1; * ( ( escenal ) ->figura[jl ) = figural ;

* fin LimpiaFigura * /

char i,il; CuerposG cuerpo; ; CarasG cara1 ; int visible = i ;

cuerpo1 = * ( (figural) - >cuerpo [ j ] ) ; for (i=o ; ie= ( cuerpo1 ).uitcara ; ++i){

Page 50: UNIDAD IZTAPALAPA 12>1

caral = * ( ( cuerpo1 ) .cara[il ) ; if ( cuerpoi.color )

Limpiacaraopaca ( cara1 ) ; LimpiaCaraTransparente( caral ) ;

I

j ; * fin Limpiacuerpo * /

piaCaraOpaca ( CarasG ai)

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA 3 ;

for( m=O ; mc= (al.ultVertice);++m)/* todos los puntos de la cara*/

pse[m].xg = ( int ) ( maximax * 0.53 ) {

+ ( al.punto2D[m] .xf * 0.34 * maximax 1;

pse[m] .yg = ( int ) ( maximax * 0.68 ) - ( 150 + al.punto2D[m] .yf * 150 1;

1; fillpoly ( (ai.ultVertice) + 1, pse 1;

* fin Limpiacaraopaca */ piaCaraTransparente( CarasG ai)

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA 3 ;

for( m=O ; me= (al.ultVertice);++m)/* todos los puntos de la cara*/

pse[m] .xg = ( int ) ( maximax * 0.53 ) {

+ ( al.punto2D[ml .xf * 0.34 * maximax ;

pse[m] .yg = ( int ) ( maximax * 0.68 ) - ( 150 + al.punto2D[ml .yf * $50 ;

h drawpoly ( (al.ultVertice) + 1, pse 1; line( pse[OI .xg, pse[OI .yg,

pse [ ai .ultVerticel .xg, pse [ al.ultVertice1 .yg ) ; * fin LimpiaCaraTransparente */

extern extern extern extern

extern extern

extern

/ *

Coef Figura coef Figura MAXFIGURAC I ; CoefsObser coefrobser; CoefsObtaer coefthobser; CoefsObser coefphobser;

float to, t, deltat, tf; /* variables de tiempo */ int ret ; /* factor de retardo entre las float rh, theta, phi, dh ;/* distancia al objeto, ngulos

A y del observador,asA

Coeficientes de fhnulas de posicih en funcih del tiempo :

*/

proyecciones. */

Page 51: UNIDAD IZTAPALAPA 12>1

como distancia k l plano proyectivo. */

extern Puntos3D matriz3DA2D[ 3 3 ; /* Vectorec%tte base del sistema proye

extern FILE *Alrch-datos;

extern float mximax,maximay,masaltax,masaltay,masbajax,masbajay, masaltaz , masbaj az ;

clude cstdio.h> clude cstdlib.h> clude cmath.h> clude "gpdefs . cI1 variables globales */

Coef Figura coef Figura [ MAXFIGURAS I ; CoefsObser coefrobser ; CoefsObser coefthobser ; CoefsObser coefphobser ; float to, t, deltat, tf; int ret ; float rh, theta, phi, dh ; Puntos3D matriz3DA2D[ 3 I ; / * Vectores de base del sistema proyectivo*/ float maximax, maximay, masaltax, masaltay ,

FILE *Arch-datos; masbajax, masbajay, masaltaz, masbaj az ;

n (void)

char continuar -= 1 ,opcion = I ;

Escenas *escena ;

Creaventanas ( 1 i Iniciavariables (1 ; clrscr (1 ; escena = malloc (sizeof (Escenas) ; escena->ultFigura = -1 ; Ob t enEs cena ( es cena ) ; info0 ; setcbrk(1) ; while (continuar) {

opcion = PideOpcion ( ) ; switch (opcion) { case ' P' : Proyecta3Da2D (escena) case 'M' :ModificacionEscena(escena) case IF7' :info0 case 'S' : continuar = O 1;

1; BorraEscena (escena) ; return O ;

ificacionEscena(Escenas *escenal) I

enEscena(Escenas *eseenal)

; break; ; break; ; break; ; break;

Page 52: UNIDAD IZTAPALAPA 12>1

'4 .

char opcion; FILE *archivoEseena;

opcion = PideOpcionEscena(&archivoEscena); switch (opcion) {

case C' : CreaEscena ( escenai, archivoBscena) ; break; case 'L' :LeeEscena( escenai, archivcEscena) ; break;

1;

ciavariables ( )

int register i, j ;

coefrobser[Ol = 100; coefrobser[l] = O; coefrobser[21 = O ; coefthobser[Ol - 0.79; coefthobser[ll = 0.0; coefthobser[2] = O ; coefphobser[Ol E: 0.79; coefphobser[ll = 0.3; coefthobser[2] = O ; dh = 35 ;to=O;deltat=0.2;tf=05;

for ( i = O; ic MAXFIGURAS ; ++ i for ( j = O; j cMAXCOEFDESPLA ; ++j {

coefFiguraLi1 .coefx[jl = O ; coefFigura[il .coefy[jl = O ; coefFigura[il .coefz[jl = O ;

1 I

nclude cstdlib.h> clude cctype.h> clude <stdio.h> clude <dos.h> clude llgpdefs.cll

d muestra cabecera(),dibuja-bordeO,escribe-texto(),escribe-car(); d guarda ;ideo ( ) , restaura-video ( 1 , vete-xy ( ) , ventanaborra ( ) ; r far *m&n video;

Estructuras paras las ventanas */ uct base-ventana nt comienzax,finx,comienzay,finy; nt curx, cury; nsigned char *p; har *cabecera; nt tipo-video; nt borde; ,'a borde si/no */ nt activa; /* pantalla activa si/no */ ase [MAX-BASE] ;

*/ -

/* posicioa ventana */ /*position actual del cursor en l a ventana */ / * puntero al bufeer */ /* mensaje de cabecera */ /* video normal o inverso */

* / Construye la base de una ventana. devulve 1 si se puede construir; en caso contrario devuelve O

ar-ventana(int num,char *cabecera,int comienzax,int comienzay, int finx,int finy,int borde,int tipo-v$deo)

Page 53: UNIDAD IZTAPALAPA 12>1

numero de ventana, texto cabecera, coordenadas x,y de la esquina superior izq. coordenadas x,y de la esquina inferior der., nc hay borde si cero

nsigned char *p; f (num>MAl-BASE) printf ( demasiadas ventanas \nil) ;

Ireturn O;

Ireturn O;

Ireturn O;

f ((comienzay>24) I ! (comienzayc0) I I (comienzax>78) I I (comienzaxc0)) printf (iierror de rangoii) ;

f ((finy>24) I I (finx>79)) printf ( I 1 no cabe la ventanaii) ;

* reserva la memoria necesaria para usar la ventana */ =(unsigned char *)malloc (2* (finx-comienzax+l) * (finy-comienzay+l) ; f ( !p) exit (1) ; /* posicion del controlador de errores */ * construccion de la base */ ase [num] . comienzax=comienzax; base [numl . f inx=f inx; ase [num] . comienzay=comienzay; base [numl . f iny=f iny; ase [numl . p=p; ase [numl . cabecera=cabecera; ase [numl .borde=borde; ase [num] .tipo video=tipo - video; ase [num] .actiGa=O; ase [numl .curx=O; base [num] .cury=O; eturn 1; /* fin del proceso crear-ventana */

Aparicion en pantalla de una ventana */ d ventana (int num) numero de ventaNA */

*/

nt modov,selecc; nt x,y; lodov=modo-video ( ) ; f ((modov!=2) && (mOdOV!=3) && (modov!=7)) printf(Iiel modo de Video ha de ser el de 80 columnas de texto “1;

(l) ; * calcula la direccian adecuada de la RAM de video */ f (modov==7) mem - video= (char far *) OxBOOOOOOO; lse mem video= (char far‘ * ) OxB8000000;

* situa en activa la ventana */ f ( !base [numl .activa: /* no esta activa */’ guarda video(num); /* grava la pantalla a la vista */ base[nÜm].activa=l; /* activa la marca de activa */

dibujaborde (num, base [numl .borde) ;

I f (base [numl .borde)

Page 54: UNIDAD IZTAPALAPA 12>1

uestra-cabecera(num); /* muestra la ventana */ =base [num] . comienzwbase [numl . curx+l; =base [num] . comienzayabase [numl . cury+l; entanaborra (num) ; ete-xy(x,y) ; /* fin del proceso ventana */ * /

I

desactiva una ventana y la borra de la pantalla */ activa (int num)

* coloca el cursor en la posicion de la esq. sup. izq. */ ase [numl . curx=O ; ase [numl . cury=O; estaura-video (num) ;

*/ presenta el mensaje-cabecera d muestra-cabecera(ht num)

egister int x,lon;

en su posicion */

=base [num] . comienzax; * calcula la posicion a decuada para centrar el meneaje cabecera */ * - - - si negativo no cabe el mensaje - - - * / onrstrlen (base [num] .cabecera) ; on=(base[num] .finx-x-lon)/2; f (lonco) return; /* no lo muestra */ =x+lon; scribe-texto (x, base [numl . comienzay, base [numl .cabecera, base [numl . tipo-video) ; * fin de muestra cabecerea */

*/ d dibuja-borde(int num,int tipo-borde)

egister int i,bor-hor,bor-ver,sup - izq,sup-der,inf - izq,inf - der; har far *v,far *t;

=mem - video; =V; witch (tipo - borde) case 1 : bor_hor=196; bor_ver=179; sup_der=191; sup_izq=218; inf_der=217; inf izq=192; break;

case 2 : bor-hor=205 ; bor_ver=i86; sup_der=187; sup-izq-201; inf der=188; inf-izq=zoO; break;

case 3 : bor_hor=205;

Page 55: UNIDAD IZTAPALAPA 12>1

bor_ver=179; sup_der=184; sup_izq=213; inf-der=190; inf-izq-212 ; break;

case 4 : bor_hor=196; bor_ver=186; sup-der-183; sup_izq=214; infder-189; inf_izq=211; break;

case 5 : bor hor-219; borver=219 ; suprde r= 2 19 ; sup izq=219; inf-der=219 ; inf-izq=a 19; break;

case 6 : bor_hor=176; bor_ver=176; sup_der=176; sup-izq-176; inf-der=176; inf izq=i76; break;

case 7 : bor_hor=177; bor_ver=177; sup_der=l77; sup_izq=177; infder=177; inf_izq=177; break;

case 8 : bor-hor-178; bor_ver=178; sup der=178; sup1izq-178; inf der=178; inflizq=178; break;

1 or (i=base [num] . comienzay+l; icbase [num] . f iny; i++) v+= (if160) +base [num] . comienzax*2; *v++=bor-ver; *v=base [num] . tipo-video; v=t; v+=(i*160)+base[numl .finx*2; *v++=bor-ver; *v=base [num] . tipo-vkdeo; }v=t; or (i-base [num] . comie.uzax+l; icbase [numl . finx; i++) v+= (base [num] .comie~zay*160) +i*2; *v++=borhor;

Page 56: UNIDAD IZTAPALAPA 12>1

*v=base [numl . tipo-video; v=t; v+= (base [num] . f iny*160) +i*2; *v++=bor hor; *v=base [&m] . tipo-vi deo; v=t: 1 scribe-car (base [numl . comienzax, base [num] . comienzay, sup izq, base [num] . tipo-vid scribe-car (base [num] . comienzax, base [numl . finy, inf-izq,base [num] . tipo-video) ; scribe-car (base [num] . f inx, base [num] . comienzay, sup d2r, base [num] . tipo-video) ; scribe-car (base [numl . f inx, base [numl . f iny, inf - der,base [num] .tipo - video) ;

*/

* / */ */

FUNCIONES DE ENTRADA SALIDA DE VENTANAS

Escribe un texto en el lugar en donde se haya actualmente el cursor en la ventana especificada devuelve cero en case de que la ventana no este activa en otro caso 1

tana-escribet (int num, char *str)

* se asegura de que la ventana esta activa */ f (!base [numl .activa) return O; or (; *str;str++) ventana-escribecar(num,*str,O); eturn 1;

*/

Esrcribe texto con atributo especial */ tana - esc-esp(int num,char *str,int atrib)

* se asegura de que la ventana esta activa */ f (!base [num] .activa) return O; or (; *str; str++) ventana-escribecar(num,*str,atrib); eturn 1;

* / tana-escribecar(int num,char car,int atrib)

egister int x,y; har far *v; * se asegura de que la ventana esta activa */ f (!base [num] .activa! return O; .=base [numl . curx+base [numl . comienzax+l; =base [num] . cury+basetnum] . comienzay+l; =mem video; +=(y*16O)+x*2;/* calcula la direccion */ f (y>=base [numl . finy) return 1; f (x>=base [num] . finx ) return 1; f (car==’\n‘) /* caracter de salto de linea */ y++; x=base [numl . comienzax+l; v=mem video; v+= (yY160) +x*2; /* calcula la direccion */

Page 57: UNIDAD IZTAPALAPA 12>1

base [num] .cury++; /*, invcrementa y */ base [num] .curx=O; /* reinicia x */ 1 lse

base [numl . curx++; *v+ += car ; /* escribe el caracter */ if (atrib==O) *v++=base[num].tipo-video; /* atributo del video */

else *v++=atrib; / * atxibuto del video */

1 ventana x y (num, base [num] . curx, base [numl . cury) ; return i;

*/ situa el cursor en una posicion determinada de la ventana devuelve cero si se sale del rango en caso contrario un valor distinto de cero

tana - xy(int num,int x,int y)

f (xe0 I I x+base [num] . comienzax>=base [numl . f inx-1) f (ye0 I I y+base [num] . comienzay>=base [numl . f iny-1) ase [numl . curx=x; ase [numl . cury=y; ete-xy (base [num] . comienzax+x+l, base [numl . comienzay+y+l) ; eturn 1;

return O;

return O;

*/ lee un texto desde la ventana */ d ventana-leet(int num,char *s)

har car, *temp;

emp=s ; or (;;I { car=ventana-leecar(num); switch (car) { case '\r' : /* se pulso enter */

*s='\O' ; return;

case BKSP : /* RETROCESO */ if (s>temp) { s - - : bass [nu] . curx- - ; if (base [num] . curxe0) base [numl . curx-O; ventana xy (num, base [numl . curx, base [hum] . cury) ; escribe-car (base [num] . comienzax+base [numl . curx+l, base [ñum] . comienzay+base [numl . cury+l, base [numl . tipo-video) ; ,

1; case O : break;

default : *s=c.ar;

Page 58: UNIDAD IZTAPALAPA 12>1

s++;

, _

* /

lee teclas pulsadas desde dentro de la ventana y devuelve un codigo de rastreo de 16 bits

tana-leecar (int num)

nion inkey char car [21 ; int i;

1 c; f (!base[num] .activa) return O; /* ventana no activa */ entana xy (num, base [numl . curx, base [numl . cury) ; .i=biogkey(O) ; f (c.car[OI)

/* lee la tecla */ switch(c.car[01) { case ‘\yr : /* s e ha pulsado intro */ case BKSP : /* retroceso borrar */

default :

break;

break;

if (base [num] . curx+base [num] . comienzaxcbase [num] . f inx- 1) { escribe-car (base [num] . comienzax+base [numl . curx+l, base [num] . comienzay+base [num] . cury+l, c. car [O] ,base [num] . tipo video) ; base [numl . curx++; -

1 1

if (base [nun] . curyct3) base [numl . cury-O; if (base [num] . cury+base [num] . comienzay>base [numl . f iny-2) ventana - xy (nu, base [numl . curx, base [numl . cury) ; base [numl . cury- - ; 1 eturn c.i;

*/ lee un campo desde la ventana */ d ventana - lee - campo (int num, char *s, int longitud)

har car, *temp; nt longaux = O;

emp=s; f (base [numl . curx + longitud > base [numl . f inx)

lon itud = base [numl . finx - base [num] . curx ; or ( ; ; I 9 car-ventana-leecar(nu); switch (car) { case ’\yr : /* se pulso enter */

*s=,\D’; return;

case BKSP : /* RETROCESO */ if ( sa temp) { s--; longaux--;

Page 59: UNIDAD IZTAPALAPA 12>1

basa [numl . curx- - ; if (base [numl . curxe0) base [numl . curx=O ; ventana-xy (num, base [numl . curx, baseJnum1 . cury) ; escribe-car (base [numl . comienzax+base [numl . curx+l, base [num] . comienzay+base [numl . cuxy+l, base [numl . tipo-video) ;

case O : break; default : if ( longaux c longitud ) {

,

1;

*s=car; s++; longaux++;

base [numl . curx- - ; if (base [numl . curxe0) base [nun] . curx-O; ventana-xy (num, base [num] . curx, base [numl . cury) ; escribe-car (base [numl . comienzax+base [numl . curx+l,

,

}else{

base [numl . comienzay+base [numl . cury+l, base [num] . tipo-video) ;

1 1 /* fin ventana-lee-campo */

*/ lee un campo numrico desde la ventana */ ventana - lee - campo-numerico(int num,char *s,int longitud)

har car,*temp; nt longaux = O;

emp=s; f (base [num] . curx + longitud > base [numl . finx) ongaux= s t rl en ( s ) ; ongaux = ( longaux > longitud ? longitud : longaux 1; entana-escribet (num, 8 ) ;

or (;;) {

longitud = base [numl . finx - base [numl . curx ; ~

+= longaux;

car=ventana-leecar-numerico(num) ; switch (car) { case '\yr : /* se pulso enter */

*s='\()'; return O;

case 9 : return 9 ;/* tabulador */ case BKSP : /* REYROCESO */

if ( s >temp) { s--; lontfaux--; base [numl . curx- - ; if [base [num] . curxc0) base [numl . curx=O; ventana xy (num, base [numl . curx, base&numl . cury) ; escribe-car (base [num] . comienzax+base [numl . curx+l, base [%.un] . comienzay+base [numl . cury+l, base [numl . tipo-video) ; ,

1; case O : break:

Page 60: UNIDAD IZTAPALAPA 12>1

default : if ( Longaux e longitud ) { *s=car; s++; longaux++; ventana xy (num, base [numl . curx, base [numl . cury) ; escribe-car (base [numl . comienza&+base [numl . curx, -

base [num] . comienzay+ba@e [numl . cury+l, car, base [numl . tipo-video) ;

}else{

1;

base [numl . curx- - ; if (base[numl .curxcO) base[numl .curx=O;

1 1 /* fin ventana-lee campo numerico */ - -

*/

tana leecar numerico (int num) - -

nion inkey char car [2] ; int i;

char cc; 1 c;

f (!base[num] .activa) return O; /* ventana no activa */ entana-xy (num, base [numl . curx, base [numl . cury) ; .i=bioskey(O) ; f (c. car [O] ) switch(c.car[Ol) { case '\r' : /* se ha pulsado intro */

break;

break;

break;

/* lee la tecla */

case BKSP : /* retroceso borrar */ case 9 : /* tab */ default : cc = C.car[Ol; if ( ! ( isdigit(cc1 1 1 cc == '.' 1 1 cc == ' - ' I )

else

/*

return ( O ) ;

base [numl . curx++; if (base [numl . curx+base [numl . comienza < base [numl . f inx- 1) {

escribe car ( base [numl . comienzax+base [numl . curx+l, base [nGl . comienzay+base [numl . mry+i, c. car [O] , base [num] .tipo video ) ; base [numl . curxT+;

1; 1 if (base[numl .curycO) basernuml .cury=O; if (base [numl . cury+hase [numl . comienzay>base [numl . f lny-2) ventana-xy (num, base [numl . curx, base [numl . cury) ; base [numl . cury- - ; 1 eturn c.i; ;/* fin ventana-leecar numerico */ -

Page 61: UNIDAD IZTAPALAPA 12>1

*/

Borra una ventana */ d ventanaborra (int num)

egister int i, j ; har far *v, far *t;

=mem-video; =V; or (i-base [num] . comienzax+l; icbase [numl . f inx; i++) for(j=base[num] .condenzay+l;jcbase[numl .finy;j++) { v=t; v+=(j*160) +i*2; *v++=' '; / * escribe un espacio */ *v=base [numl . tipo-.video;

1 ase [numl .curx=O; ase [numl . cury=O ;

*/ -

Borra hasta el final de la linea */ d ventana-borrestol(int num)

egister int i,x,y; =base [numl . curx; =base [numl . cury; entana xy (num, base [num] . curx, base [numl . cury) ; or(i=b%e[num] .curx;icbase[num] .finx-i;i++)

entana-xy (nun, x, y) ; ventana-escribecar(num,' ',O);

*/ */ */

MISCELANEA DE FUNCIONES */ */

Muestra un texto con atributo especifico */ d escribe-texto(int x,int y,char *p,int atrib)

egister int i; har far *v;

=mem-video; +=(y*160)+x*2; /* calcula la direccion */ or (i=x; *p; i++) *v++=*p++; /* escribe el caracter */ *v++=atrib; /* escribe el atributo */

1 */

Escribe un caracter con el atributo especificado. */ d escribe-car(int x,ínt y,char car,int atrib)

Page 62: UNIDAD IZTAPALAPA 12>1

egister int i; har far *v;

=mem-video; +=(y*16O)+x*2; /* cakcula la direccion */ v++=car; /* escribe el caracter */ v=atrib; /* escribe el atributo */

* /

Guarda una parte de la pantalla */ d guarda-video(int num)

egister int i, j ; har *bufgtr; ~

har far *v, far *t;

ufgtr=base [numl .p; =mem video; or (iLbase [num] . comienzax; icbase [numl . f inx+l; i++) for (j =base [num] . comienzay; j cbase [numl . f iny+l; j ++> { t= (v+ (j*160) +i*2) ; *buf_ptr++=*t++; *buf_ptr++=*t; *(t-i)=’ I ; /* borra la pantalla */

1 */

Restaura una parte de la pantalla */ d restaura - video (int num) egister int i, j ; har far *v, far *t; har *buf_ptr;

uf_ptr=base [numl .p; =mem - video; =V; or (i=base [nu] . comienzax; icbase [numl . finx+i; i++) for(j=base[num] .comienzay;jcbase[numl .finy+l;j++) { v=t; v+= (j*160) +i*2; *v++=*buf_ptr++; *v=*bufptr++;

/* escribe el caracter */ /* escribe el atributo */

1 ase[num] .activa=O; /* restaura video */

-. */ Borra la pantalla */ d borpan ( )

nion REGS r;

.h.ah=6; /* codigo de paso de la pantalla */

.h.al=O; /* codigo de borrado de pantalla */

.h.ch=O; /* fila inicial */

.h.cl=O; /* columna inicial */

Page 63: UNIDAD IZTAPALAPA 12>1

.h.dh=24; / * fila inicial */

.h.d1=79; /* columna final */

.h.bh=7; /* linea de espacios */ nt86 (0x10, &r, &r) ;

*/

Situa el cursor en la posicion especificada X, Y. k / d vete-xy (int x, int y)

nion REGS r;

.h.ah=2; /* funcion de direccionamiento del cursor +/

.h.dl=x; / * coordenada de la columna */

.h.dh=y; /* coordenada de fila */

.h.bh=O; /* pagina de video */ nt86 (OxlO,&r,&r) ;

*/

Devuelve el modo de video en operacion */ o - video (1

nion REGS r; .h.ah=15; / * lee modo de video */ eturn int86(0xlO,&r,&r) & 255;

*//*-

Funciones para crear la matriz de rotacih en torno a un eje arbitrario */

*/ clude cmath.h> clude "gpdef s . cI1

*/ Crea la matriz identidad M */

Identidad

*/ d Identidad (Matriz m)

gister int i, j ;

r(i=O; ic= TAMATRIZ; i++) for(j=O; jc= TAMATRIZ; j++)

m[i] [jl = O;

m [ i l [jl = 1;

if (i != j)

else

{

1 */

Crea M Traslacih Crea ia matriz para ia trasiaciin ai origen */

*/ .d Crea-M-Traslacion(Euntos3D p1,Matriz m)

Page 64: UNIDAD IZTAPALAPA 12>1

gister int z; t Coorj; o r 2 = TAMATRIZ-1;

*/

m3 = ml * m2 */ */

Multi Matriz Realiza la mutiplicacih de dos matriceib ml,m2

d Multi-Matriz(Matriz ml, Matriz m2)

gister int i,j,k; triz m3;

r(i=O; ic= TAMATRIZ; i++) for(j=O; jc= TAMATRIZ; j++)

m3[il [jl = O; for (k-O; kc= TAMUTRIZ; k++)

{

1 m3[il [j]= m3lil [jl + (mi[

r(i=O; ic= TAMATRIZ;'i++) for(j=O; jc= TAMATRIZ; j++)

ml [il [jl =m3 [il [jl ;

*

*/ */ */

Crea M Rotacib Z Crea ia matriz para ia rotaciAn en torno ai eje z

d Crea-M-Rotacion-Z(doub1e angulo, Matriz m)

uble sen-angulo,cosangulo;

sangulo = cos (angulo) ; n-angulo = sin(angu1o); 01 [O1 = 01 [ll = 11 [O1 = 11 [I1 = 21 r21 = 31 [31 =

cosangulo; -sen-angulo; sen-angulo; cosangulo; 1; 1;

*/ */ */

Crea Vector Unitario Determina el vector unitario paralelo al eje de rotach

d Crea-Vector-Unitarío(Puntos3D *vectorUnitario, Pufitos3D pl,

float longitud;

Puntos3D p2, float*longi)

Page 65: UNIDAD IZTAPALAPA 12>1

vectorunitario->x = p2.x - p1.x; vectorunitario->y = p2.y - p1.y; vectorunitario->z = p2.z - p1.z; longitud = sqrt(vectorUnitario->x * vectorunitario->x +

vectorünitario->y * vectorunitario->y + vectorunitario->z * vectorunitario->z 1;

(vectorUnitario->x)/=longitud; (vectorunitario->y);-longitud; (vectorunitario->z)/Plongitud; *longi = sqrt( (vectorünitario->y) *(vectorUnitario->y) t

I

vectorünitario->z * vectorunitario->z 1;

*/ Giro A XZ

Giro en torno a x para quedar en el plano xz */ * /

id Giro-A-xz(Matriz.m,float b,float c, float d)

[21 [21 = c/d; [31 [2I = -b/d; [21 131 = b/d; [31 131 = c/d;

*/ G i r o A Z

Giro en torno a x para quedar en el plano xz */ * / I

id Giro - - A z(Matriz m,float a,float d)

[I1 111 = d; [31 [ll = -a; [I1 [31 = a; [31 [31 = d;

* / Crea M Rotacib

Crea la matriz para la rotaciAn en torno a un eje arbitrario */ * /

d Crea-M-Rotacion(Pu1itos3D pl,Puntos3D p2,Matriz mrot,float angulo)

untos3D vectorUnitarxo,negpl; loat longi; atriz mat; nt Coorj;

rea - Vector_Unitario(&vectorUnitario,pi,p2,&longi); dentidad (mrot) ; rea-M-Traslacion (pi ,Inrot) ;

dentidad(mat1 ; .ir0 - - A xz(mat,vectorUnitario.y,vectorUnitario.z,long&); iulti - Matriz (mrot,matj ;

Page 66: UNIDAD IZTAPALAPA 12>1

dentidad (mat) ; iro A-z(mat,vectorUruitario.x,longi); uitT-Matriz (mrot,mat? ;

dent idad (mat) ; rea-M-Rotacion-Z(angulo,mat); ulti - Matriz (mrot,mdt.! ;

dentidad (mat) ; iro - - A z(mat,-vectorUnitario.x,-longi); ulti-Matriz(mrot,matr;

dentidad (mat 1 ; iro - - A xz(mat,-vectorUnitario.y,-vectorUnAtario.z,-lOW ulti - Matriz (mrot,mat) ; egp1.x =-p1.x; egp1.y =-p1.y; egp1.z =-p1.z;

dentidad (mat) ; rea - - M Traslacion(negp1,mat) ; uiti - Matriz (mrot,matj ;

*/ */ */

Rotacih Aplica la matriz para la rotacih a un punto

d Rotacion(Puntos3D pl,Puntos3D *p2,Matriz mrot)

->x = pi.x * mrot[~' [O] + pi.y * mrot[il [O] + p1.z * mrot[21 [O]; ->y = pi.x * mrot[O] [i] + pi.y * mrot[il 113 + p1.z * mrot[21 111; ->z = pi.x * mrot[Of [2] + pi.y * mrot[íl [2] + p1.z * mrot[21 [21;

GRV */ /* Archivo GPLEESCE.C */

int i, cod; float Real;

cod=fread(&Real,sizeof(float),l,Arch-datos 1; if (feof(Arch-datos))

(escenal) - >ultFigura= (int ) ( - -Real 1 ; for (i=O ; i c= (escena1)->ultFigura; ++i){

LeeFigura( i, escena1,Arch-datos);

Error (21 ;

1; cod = CierraArchivo ( &Arch-datos ) ;

Page 67: UNIDAD IZTAPALAPA 12>1

if ( cod == O 1 - *

return O ; Error(3) ;

int i, cod; Figuras *figural ; float Real;

figural = malloc (sizeof (Figuras) ) ; cod=fread(&Real,sizeof (float) ,l,Arch-datos ; (figural) ->ultCuerpo = (int) (--Real); for (i=O ; i c= (figurai)->uitCuerpo ; ++i){

1; ( escena1 ) ->figura[jl = figural ;

Leecuerpo ( i , figural , Arch-datos) ;

* fin LeeFigura */

int cod, i; CuerposG *cuerpo1 ; float Real;

cuerpol = malloc (sizeof (CuerposG) 1 ; cod=fread(&Real,sizeof (float) ,l,Arch-datos ) ; (cuerpoi) ->ultCara = (int) (--Real ; cod=fread(&Real,sizeof(float),l,Arch-datos 1; (cuerpoi) ->color = (int) (Real ; for (i=O ; i e= (cuerpoí)->uitCara; ++i){

1; ( figural ) ->cuerpo[jl = cuerpol ;

LeeCara I i, cuerpo1,Arch-datos) ;

* fin Leecuerpo */

register int i; int cod; CarasG *cara1 ; float xl,yl,zl,Real; Puntos3D puntoaux;

cara1 = malloc (sizeof (CarasGI 1 ; cod=fread(&Real,sizeof(float),l,Arch-datos 1; (caral) ->ultVer:.ice =(int) (--Real) ; cod=fread(&Real,sizeof (float) ,l,Arch-datos 1 ; (caral) ->color :- (int) (Real ;

for (i=O ; i e= (carai)->uitVertice; ++i){

Page 68: UNIDAD IZTAPALAPA 12>1

cod=fr~d(&puntoauxrsizeof(Puntos3D) ,l,kch-datos ) ; caral- wunto3D [i] = puntoaux ; masaltw = max( masaltax, ( abs( puntoa:x.x ) 1 ) ; masbajax = min( masbajax, (-abs( puntoa:.ix.x 1) ; masaltay = max( masaltay, ( abs ( punto&x.y ) ) ; masbajay = min( masbajay, (-abs( punt0aux.y ) ) ; masaltaa = max( masaltaz, ( abs( punt0aux.z 11 ) ; masbajae = min ( masbajaz, ( -abs ( puntoairx. z ) ) 1 ;

1; ( cuerpo1 ) ->cara[jl = caral ;

* fin Leecara */

clude cgraphics.h> clude <stdio.h> clude cstdlib.h> clude <math.h> clude cctype.h> clude cconio.h> clude "gpdef s. cl1

variables externas globales */ clude llgpglobae. ct1

*/ MAINWINDOW: Establish the main window for the demo and set */ a viewport for the demo code. */

*/ d Mainwindow( char *header )

nt height;

leardevice ( ) ; / * Clear graphics screen */ etcolor( getmaxcolor() - 1 ) ; /* Set current color to white etviewport ( O, O, maximax, maximay, 1 ; /* Open port to full screen

eight = textheight( gH1l 1; /* Get basic text height ettextstyle( DEFAULT FONT, HORIZ DIR, 1 ) ; ettextjustify ( CENTER-TEXT, TOPFEXT ) ; uttextxy ( maximax/2 2 header ; etviewport ( O, height+4, maximax, maximay- (height+4) 1 ; rawBorder ( ; etviewport ( 1, height+5, maximax-1, maximay- (height+5) 1 ;

STATUSLINE: Display a status line at the bottom of the screen.

*/

* / */ */

d StatusLine( char *msg )

nt height;

etviewport ( O, O, maximax, maximay, i ) ; /* Open port to full screen etcolor ( getmaxcolor() - 1 ) ; /+ Set current color to white

ettextstyle( DEFAULT - FONT, HORIZ - DIR, 1 1 ;

I_L - T I - ~ ~ - --_.- .~ -~ -._- .

Page 69: UNIDAD IZTAPALAPA 12>1

ettextjustify( CENTER-TEXT, TOP TEXT ) ;

etfiiistyie ( EMPTYIFILL, O ;

ar( O, maximay- (heiyht+4), maximax, maximay 1; ectangle( O, maximay-(height+4), maximax, maximay ) ; uttextxy( maximax/2, maximay- (height+21, m g 1; etviewport ( 1, height+5, maximax-1, maximay- (height+5), 1 ) ;

etiinestyie( SOLID LINE, O, NORM: - WIDTH ; 1, I

eight = textheight( nH1l 1; /* Detemine curLent height */

DRAWBORDER: Draw a solid single line around the current viewport.

wBorder (void)

truct viewporttype vp;

etcolor( getmaxcolor0 - 1 ) ; /* Set current color to white

etlinestyle( SOLID-GTNE, O, NORM - WIDTH ) ;

etviewsettings ( &vp 1 ; ectangle( O, O, vp.right-vp.left, vp.bottom-vp.top ) ;

int i, j ; char cadena [51 , relleno [71

/* for ( i = 1 ; i e= 15 ; ventana--xy ( 7 , 1 , 1) ; itoa(l;cadena,lO) ; ventana--xy (7 , 1 , 1) ; ventana_-xy ( 7 , 3 , 1) ; ventana-xy (7,1,2 ; ventana-_xy (7 , 3 , 2 ; ventana-xy (7,1,3 ; ventana-xy (7,3,3 ) ; ventaria-xy (7,i, 4 ; ventana-xy (7 I 3,4 ; ventana-xy (7,1,5 ; ventana-xy (7,3,5 1 ; ventana-xy (7,1,6 1 ; ventana-xy (7,3,6) ; ventana-xy (7,1,7) ; ventana-xy ( 7,3,7 1 ; ventana-xy (7,1,8) ; ventana--xy (7,3,8 ; ventana-xy (7,1,9 ; ventana-xy (7,3,9 ;

*/ */ */ */

++i > { */

ventana escribet (7, 1" ) ; ventana-escribet (7, 1 ; ventana-escribet (7, 2" 1 ; ventana-escribet (7, "verde ) ; ventana-escribet (7, " 3" ; ventana-escribet (7 I %cyanvr ; ventana-escribet (7, It. 4 " ; ventana-escribet (7, "rojoll ; ventana-escribet ( 7 , 5" ; ventana-escribet (7 , %agentall 1 ; ventanhescribet (7, 6" ; ventana escribet (7, 'caf" 1 ; ventana-escribet (7, " 7 " ; ventana-escribet (7, "gris c" ; ventana-escribet (7, 8 " ; ventana-escribet (7, "gris o" ; ventana-escribet (7, I' 9 1 ; ventana-escribet (7, "azul c" ;

ventana_-xy(7,1,10); ventana escribet(7, n l O 1 l 1; ventana--xy(7,3,10) ; ventana-escribet(7, "verde c" 1; ventana--xy(7,1,11) ; ventanaIescribet (7, rllvl ; ventana xy(7,3,11); ventana escribet(7, "cyan cn 1;

-* -

Page 70: UNIDAD IZTAPALAPA 12>1

ventana__- (7,1 , 12) ; ventana-xy (7 , 3 , 12 ) ; ventana_xy(7,1,13) ; ventana-xy ( 7,3,13 ) ; ventana xy(7,1,14); ventanaIxy (7,3 , 14) ; ventana-xy (7,1 , 15 ; ~entana~xy ( 7,3 ,I5 1 ;

/* }; * / * Pintacoiores */

ventana escribet (7, ji 12 ; ventana-escribet (7, 'rojo c1I ; ventandescribet ( 7 . "13" 1 ; ventana escribet (7, "magenta c" ; ventana-escribet ( 7 , 111411 ; ventana-escribet (7, namarilloll ; ventana-escribet (7, " 15" ; ventanaIescribet (7, llblancoll ;

int chl, xl,yl ; char fcadl;

clrscr (1 ; ventana (O ; ventana-xy (O, 28,5) ; ventana escribet (O, : Proyectar Escena. ; ventanaIxy (O, 28 7) ; ventana-escribet(0,"M : Modificar Escena. "1; ventana-xy (O, 28,9 ; ventana escribet (O, : Funciones F(t) . "1 ; ventanaIxy ( O I 2 8,11) ; ventana escribet (O, : Salir de GeomProy. I I ) ; ventanaIxy ( O, 2 8,13 ; ventana escribet (O, Opcih: ; XI = whGrex0 ; y1 = whereyo ;

chl = toupper( getche 0 ; cadl = strchr ( llPMFS1l, chl) ;

do {

gotoxy(x1,yl) ; }while (cadl == NULL); return chl ;

int chl, x1,yl ; char *cadl, cadena[301 = ii\Oil;

ventana (5 1 ; ventana-xy (5,2 I &) ; ventana escribet (5, : Crear Escena. ; ventanaIxy(5,2,?) ; ventana escribet (5, I1L : Leer Escena. ; ventana:- (5 I 2, S I ; ventana-escribet (5, 11'opciAn? (c/L) : [ I ; do {

ventana-xy ( 5,19, 5) ; chl = toupper( getcheo ) ; cadl = strchr("CLtl,chl) ;

}while (cadl == NULL); ventana_xy(5,2,7) ; ventana - es~ribet(5,~~Usando el archivo:[

i

1 ;

Page 71: UNIDAD IZTAPALAPA 12>1

ventana-xy ( 5 , 2 1 I 7 ) ; ventana lee campo(5,cadenar25) ;

}while ( strlenTcadena) c 1) ; if ( chl == 'L'){

if ( ! WreArchivo ( archivoEscena , cadena , "rb1I) Error (2) ;

if ( ! (AbreArchivo ( archivoEscena , cadena I1wb") ) 1 Error (1, ;

do {

1

1 ;

else if ( chl == 'C') {

desactiva(5) ; . return chl ;

/*fin PideOpcionEscena */ * /

Rutinas de ventanas para presentacih */ aventanas ( )

rear-ventana (O, Geometrh Proyectiva ' I , O, D,79,24,1,VID-NORM); rear-ventana (1, EcuacioGes del observador I t , 12, 3 :, 70 , 18 2 ,VID-INV) ; rear ventana (2, ObtenciAn de la figura 5, 3,57, 5,2,VID INV); rearventana (3 , 6 , 5 , 60,lO , 2 , VIDIINV) ; rearventana (4, ObtenciAn de la cara II 2, 8,65,24,2,VID-INV); rearIventana (5 , Obtencih de la Escena 10, 2,65,14,1,VID-INV); rear-ventana (6, Creacih de la Escena 4, 1,SO, 3,1,VID-INV); rear ventana (7, llColoresll , 66, 2,79,19,1,VID_NORM); rearventana ( 8 , II Ecuaciones de la figura ' I , 1, 6,79,20,2,VID-INV);

Obtenci& del cuerpo I t ,

-

float rO, rl, r2, r3, r4 ; char cadena 1201 ;

ventana(1) ; ventana-xy ( 1 2,1) ; ventana escribet(l,llCoordenadas esfricas del observador:11 1; ventanaIxy ( 1,2 3 ; ventana escribet (1, !IR (t) = [ I + [ l*t + [ I*ts" 1; - ventana-xy (1,8 r 3 1 ; gcvt (coefrobser 101 ,7, cadena) ; ventana lee campo-numeric0 (1, cadena, 7) ; coefrobser[Ol = (float) atof (cadena) ;

ventana_xy(l,20,3) ; gcvt (coefrobserlll ,7,cadena) ; ventana lee-campo-numerico(l,cadena,7); coefrobser[l] = (float) atof (cadena) ;

ventana-xy (1,34,3 ) ; gcvt (coef robser (2 I ,7 , cadena) ; ventana lee~campo~numerico(lrcadena,7); coefrobger[2] = (float) atof (cadena) ;

,... .

Page 72: UNIDAD IZTAPALAPA 12>1

ventana-xy (1,2,5) ;

ventana-xy (1,8,5) ; gcvt (coefthobser[Ol ,7,cadena) ; ventana-lee-campo-numerico(l,cadena,7); coefthobser[O] = (float) atof (cadena) ;

ventana-escribet (1, (t) = [ I + [ 1% + I l*t>" 1;

ventana-xy ( 1,2 C 5 ) ; gcvt (coefthobser[ll ,7,cadena) ; ventana~lee~campo~numerico(l,cadena,7); coefthobser [l] = (float) atof (cadena) ;

ventana xy(1,34,5); gcvt (coef thobser [21 ,7, cadena) ; ventana-lee-campo-nurico (1, cadena, 7) ; coefthobser[2] = (float) atof (cadena) ;

ventana-xy ( 1,2,7 ) ; ventana - escribet (1, (t) = I + [ l*t +

ventana-xy (1,8,7 ; gcvt (coefphobser [O], 7,cadena) ; ventana-lee-campo-numerico(l,cadena,7); coefphobser[O] = (float) atof (cadena) ;

ventana-xy (1,20 7) ; gcvt (coefphobser 111 ,7, cadena) ; ventana~lee~campo~numerico(l,cadena,7); coefphobser[l] = (float) atof (cadena) ;

ventana-xy ( 1,34 7 ; gcvt (coef phobser [ 2 I ,7, cadena) ; ventana~lee~c~o~numerico(l,cadena,7); coefphobser [2] (float) atof (cadena) ;

ventana-xy (1,2 I 9 ) ; ventana-escribet(l,I1Distancia del observador al plano proyectivo:I1 1;

ventana-xy (i,47,9 ; gcvt (dh, 7, cadena) ; v e n t a n a ~ l e e ~ c ~ o ~ n u m e r i c o ( l , c a d e n a , 7 ) ; dh = (float) ataf (cadena);

ventana_xy(1,2,11) ; ventana-escribet (1, to= [ 3 deltat=[

ventana_xy(1,6,11) ; gcvt (to,7,cadena); ventana~lee~campo_numerico(l,cadena,7); to = (float) atof (cadena);

ventana-xy ( 1,2 3 11 1 ; gcvt (deltat,7,cadena) ; ventana~lee~campo~nu1nerico(l,cadena,7); deltat = (float? atof (cadena) ;

ventana xy(1,36,11) ; gcvt (tfy7, cadena) ; ventana~lee~campo~numer~co(l,cadena,7); tf = (float) atof (cadena);

] tf=[

-. ._ . . - --I.-

Page 73: UNIDAD IZTAPALAPA 12>1

. .> ret = 10 ; ventana-xy (i,2,3.3 1 ;

ventana_xy(l,23,13) ; gcvt (ret, 4, caderia) ; ventana~lee~cm~o~numerico(i,cadena,4); ret = (int) abs( atof (cadena) ; desactiva (1) ;

ventana-escribet(l,llFactor de retardo = [ I " 1;

float rO, rl, r2, r3, r4, r5 ; char cadena 1201 ;

result = coefFigurali1 .coefx[Ol + t * coefFigura[il .coefx[ll + coefFigura~i].coefx[2] * (t * t) + coefFigura[il .coefx[31 * sin( t * coet!Figura[il .coefx[4] +

coefFigura[il .coefx[5] ) ; return result ; */ ventana (8) ; ventana-xy (8,3,1) ;

ventana-xy ( 8,3 9,l) ; gcvt ( * j , 3, cadena) ; ventana - escribet (8, cadena) ;

ventana-escribet (8, I1Funcih de traslacih de la figura: .I1 1;

ventana-xy (8,1,3 ;

ventanaIxy ( 8,1,4 1 ;

ventana-xy (8,9,3) ; gcvt (coefFigura [*j I . coefx [O] ,7, cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFigura[*j] .coefx[O] = (float ventana_xy(8,21;3) ; gcvt (coefFigura[*j] .coefx[lE ,7,cadena) ; ventana-lee-cam~o-numerico(8,cadena,7) ; coefFignrra[*jl .coefx[ll = (float ventana_xy(8,34,3) ; gcvt (coefFigura[*jl .coefx[2] ,7,cadena) ; ventana~lee~campo~numerico(8,cadena, 7) ; coefFigura[*jl .coefx[2] = (float

ventana_xy(8,9,r) ; gcvt (coefFigura[*j] .coefx[3: ,7,cadena) ; ventana-lee-campo~numerico(8,cadena,7) ; coefFigura[*jl .coefx[31 = (float ventana xy(8,24,4); gcvt(coefFigura[*jl .coefx[41 ,7,cadena); ventana-lee~cam~o~numerico(8,cadena,7) ; coefFigura[*jl .coefx[4] = (float ventanaIxy (8,37,4) ; gcvt (coef Figura [*j ] . coefx [51,7, cadena) ; ventana~lee~campo~numer~co(8,cadena,7) ; coefFiw.ca[*jl .coefx[5] = (float

ventana escribet (8, llX(t) = [ I + [ It + It, + " ) ;

ventana-escribet (8, [ ]SENO( It + 1

--------iiiiiiiiiii_.------------------------------~~------------------------ ventana-xy (8,1,6) ;

ventanaIxy(8, l,?) ;

ventana - xy(8,9,&) ; gcvt(coefFigura[*jl .coefy[Oa ,7,cadena) ;

ventana escribet (8, IiY (t) = [ I + [ It + [ It, + I ! ) ;

ventana-escribet (8, [ ]SENO( [ It + [ 1 ) . " I ;

Page 74: UNIDAD IZTAPALAPA 12>1

ventana-lee-campo-numerico(8,cadena,7) ; coefFigura[*jl .coefy[Ol = (float ventana-xy (8,21,6) ; gcvt (coef Figura [ *j I . coefy [SI ,7, cadena) ; ventana-lee-cantpo-numerico(8,cadena, 7 ) ; coefFi&fra[*jl .coefy[ll = (float ventana_xy(8,34,6); gcvt(coefFigura[*jl .coefy[2] ,7,cadena); ventana~lee~caxrpo~numerico(8,cadena,7) ; coefFigura[*jl .coefy[2] = (float

ventana_xy(8,9,'7) ; gcvt (coefFigura[*jl .coefy[3] ,7,cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFigura[*jl .coefy[3] = (float ventana-xy(8,24.7) ; gcvt (coefFigura[*jl .coefy[4I,7,cadena) ; ventana-lee-canipo~numerico(8,cadena,7) ; coefFigtira[*jl .coefy[41 = (float ventana-xy (8,37: 7) ; gcvt (coefFigura [*j I . coefy [5] ,7, cadena) ; ventana~lee~canipo~numerico(8,cadena,7) ; coefFigura[*jl .coefy[5] = (float

ventana-xy (8,1,9 I ; ventanaIxy (8,1,10) ;

ventana_xy(8,9,9) ; gcvt(coefFigura[*j] .coefz[O] ,7,caáena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFiwra[*jl .coefz [O] = (float ventana xy(8,21,9) ; gcvt (coefFigura[*jl .coefz[l] ,7,cadena); ventanaIlee-campo-numerico(8,cadena,7) ; coefFigura[*j] .coefz [il = (float ventana xy(8,34,9); gcvt(coefFigura[*jl .coefz[2] ,7,cadena); ventana~lee-campo-numerico(8,cadena,7) ; coefFigura[*j] .coefz [21 = (float

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

ventana escribet(8, l l Z ( t ) = [ I + [ It + [ It* + " I ;

ventana - escribet ( 8 , ]SENO( [ It + [ 1

ventana-xy (8,9,10) ; gcvt (coef Figura [*j 1 . coef z E31 ,7, cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFigura[*jl .coefz 131 = (float ventana-xy (8,24,10) ; gcvt (coef Figura [ * j I . coef z E41 I 7, cadena) ; ventana~lee~c~o~numerico(8,cadena,7) ; coefFigura[*jl .COefz[41 = (float ventana xy(8,37,10); gcvt(coefFigura[*j] .coefz[51 ,7,cadena); ventana~lee-campo-numerico(8,cadena,7) ; coefFigura[*jl .coefz 151 = (float

desactiva(8) ;

clude cgraphics.h> clude cstdio.h> clude estdlib.h> clude cmath.h> clude econio.h> clude "gpdef s. c1I

variables externas globales */ clude llgpglobae. c1I

at ProductoPunto( Puntos3D *vectorl, Puntos3D *vector2 1; at Fx(int i, float tl.; at Fy(int i, float tl; at Fz(int i, float t!;

float deltax, deltay, deltaz ;

yecta3Da2DCuerpo ( CuxposG "cuerpo1 )

static Puntos3D ejes[ 6 + 4 I = { O,O,O, O,O,O, O,O,O, o,o,o, o,c.,q, o,o,o, o,o,o, o,o,o, o,o,o, o,o,o };

Page 75: UNIDAD IZTAPALAPA 12>1

/* del 734 al 9gvector de los ejes correaponden .)* 2 a deltas y el>io% al origen. */

textmode (3 ; IniciaModoGraf ico (1 ;

Base(); /* Determinacion de la base del sisten!;z proyectivo */ Proyectacuerpoi cuerpo1 ) ; / * Proyector princip?i*/ Retardo (1 ; /* Limpiapantalla( escenai, ejes 1; */ clearviewport (1 ; restorecrtmode (1 ;

int tarjeta, modog ;

detectgraph (&tarjeta, ómodog) ;

initgraph (&tarjeta, ómodog, ;

setwritemode ( XQR-PUT ;

setlinestyle ( LINEA-EXTERNA, O, NORM - WIDTH ) ;

maximax = getmaxx0 ;

MainWindow ( llGemetrb Proyectiva") ;

maximay = getmaxyo ;

int m; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D e [6+41 ;

(C ) - > x = rnicr-aaltax * 1.1; (c + 1)-> x = masbajax * 1.1; (c + 2)-> y = masaltay * 1.1; (c + 3)-> y = msbajay * 1.1; (c + 4 ) - > z = masaltaz * 1.1; (c + 5)-> z = masbajaz * 1.1; (C + 6)-> x = deltax;

(C + 7 ) - > x = dvltax; (C + y ) - > y = deitay;

Page 76: UNIDAD IZTAPALAPA 12>1

(c + 8 ) - > y = deltay; (c + 8 ) - > z = dsltaz; I. I

for( m=O ; me 10 ;++m)

pcu = ( ( ( c + m )->x)* matriz3DA2D[O!.x + ( ( c + m )->y)* matriz3DA2D[O;.y + ( ( c + m )->z)* matriz3DA2D[O;.z 1;

pcv = ( ( ( c + m )->x) * matriz3DA2DL11 .x + ( ( c + m )->y) * matriz3DA2D[l] .y + ( ( c + m ) ->z) * matriz3DA2D[l] .z);

pcw = ( ( ( c + m )->x) * matriz3DA2D[31 .x + ( ( c + m )->y) * matriz3DA2DE33 .y + ( ( c + m ) ->z) * matriz3DA2Dr21 .z);

xp = (dh * pcv)/(rh - pcu); yp = (dh * pcw)/(rh - pcu); e[ml.xg = ( int ) ( maximax * 0.53 )

+ ( xp * 0.34 * maximax 1; e[ml .yg = ( int ) ( maximax * 0.68 )

{

/ * Guarda coordenadas en 2 dimensiones: */

- ( 150 + y~ * 150 ) ;

1 ; setcolor(EGA-LIGHTGRAY); setlinestyle( CENTER-LINE, 125, NOM-WIDTH ) ; for( m=O ; me 6 ; m+=2 )

setcolor(EGA DARKGRAY); setlinestyle7 AASHED-LINE, 125, N O M WIDTH ) ;

line( e[ml .xg, e[ml .yg, e[m+il .xg, e[m+il .yg ) ;

line( e[gI.xg, e[9l.yg, e[6l.xg, e[Zl.yg I ; / * ( O, O, O ) - ( d x , O, O)*/ line( e[61 .xg, e[61 .yg, e[71 .xg, e[71 .yg 1 ;/* (dx , O, O) - (dx,dy, O) */ line( e[71 .xg, e171 .yg, e181 .xg, e181 .yg 1 ;/*(dx,dy, O)- (dx,dy,dz)*/

setlinestyle( SOLID-LINE, O, NORM_WIDTH 1;

* fin Ejes */

rh = coefrobser[Ol + t * coefrobser[ll + t * t * theta = coefthobser[Ol + t * coefthobser[ll + t * t * phi = coefphobser[Ol + t * coefphobser[ll + t * t * matriz3DA2D[O] . x = sin(theta) * cos(phi) ; matriz3DA2D[OJ .y = sin(theta) * sin(phi) ; matriz3DA2D [O] . z = cos (theta) ; matriz3DA2D[lI .x = -sin(phi) ; matriz3DA2D [ll .*y = cos (phi) ; matriz3DA2D[1] . z = 0.0; matriz3DA2D[2] .x = -cos(theta) * cos(phi) ; matriz3DA2D[21 .y = -cos(theta) * sin(phi); matriz3DA2D[2] . z = sin(theta) ; return(0) ;

coefrobser [21 ; coefthobser 121 ; coefphobser [ZI ;

. . * fin base */

Page 77: UNIDAD IZTAPALAPA 12>1

yectaEscena( Escenas tescenal, Puntos3D *ejes)

char i;

PintaEjes ( ejes ; setwritemode ( XQR-PUT 1 ; setlinestyle( LINEA-EXTERNA, O, NORM-WIDTH 1; for (i=O ; i<= ( escenal )->ultFigura ; ++i){

deltax 3: Fx(i,t); deltay = Fy(i,t); deltaz = Fz(i,t); ProyectaFigura ( i, escenal ) ;

1; *fin ProyectaEscena */

char i; Figuras figural ;

figural = * ( (escenai)->figura[jl 1 ; for (i=O ; i<= ( figural ).uit~uerpo ; ++i){ /* Proyectacuerpo ( i, &figural 1 ; */ 1; * ( ( escenal ) -,figura[jl ) = figural ;

* fin ProyectaFigura */

CuerposG cuerpof ; CarasG cara1 ; int visible = 1,i-O ;

cuerpol = "cuerpo2 ; for (i=O ; i<= ( cuerpo1.uitCara) ; ++i){

carai = * ( ( cuerpo1 ) .cara [i] ) ; Proyectacara( &caral, &visible 1; if (visible) {

if ( !carai.color ) caral.color = cuerpol.color

if ( cuerpoí.coior 1

else Dibujacara ( &cara1 ) ;

TrazaCaraExt( &cara1 I

}else{ if ( !cuerpoi.color )

TrazaCaraInt( &cara1 ) I

1; * ( ( cuerpo1 ) .cara[i] ) = carai ; 1; *cuerpo2 = cuerpo1 ;

'* fin Proyectacuerpo */

Page 78: UNIDAD IZTAPALAPA 12>1

yectaCara( CarasG *al, int *visible)

int m, u=O, v-1, w=2 ; Puntos3D vectorl, vector2 ; float xp, yp ; float pcu, pcv, pcw ;

/* Rota laAcara completa, en una cara auxiliar, y toda la proyecciAn se hace sobre la cara auxiliar. */

vector2.x = ( (al->punto3D[m]) .x - (al->punto3D[Ol) .XI ; vector2.y = ( (al->punto3D[m]) .y - (al->punto3D[Ol) .y) ; vector2. z = ( (al->punto3D[m]) .z - (al-rpunto3D[Ol) .z ) ;

ProductoCruz(&vectorl, &vector2); /* vector normal a la cara */ vector3 = matriz3DA2D[Ol ; /* coordenaws del observador */ *visible = ( (ProductoPunto(&vectorl, avector2)) > O ? 1 : O 1; / *

Si el producto punto del vector normal a la cara con la posiciAn del observador es 3 0,la cara es visible.

*/ 1; { for( m=O ; mc= (al-> ultVertice);++m)/* todos los puntos de la cara*/

pcu = ( (al->punto3D[m] ) .x + deltax) * matriz3DA2D[u] .x + ( (al->punto3D[ml) .y + deltay) * matriz3DA2D[ul .y + ( (al- >punto3D [m] ) . z + deltaz) * matriz3DA2D [u] . z;

pcv = ( (al->punto3D[ml) .x + deltax) * matriz3DA2D[vl .x + * matriz3DA2D [VI .y + ( (ai- >punto3D [ml 1 .y + deltay)

( (al->punto3D [ml ) . z + deltaz) * matriz3DA2D [VI . z ;

pcw = ( (al->punto3D[ml) .x + deltax) * matriz3DA2D[w] .x + ( (al->punto3D[ml) .y + deltay) * matriz3DASD[w] .y + ( (ai - >punto3D [ml 1 . z + deltaz) * matriz3DA2D [wl . z;

xp = (dh * pcv)/(rh - pcu); yp = (dh * pcw)/(rh - pcu); /* Guama coordenadas en 2 dimensiones: */ al->punto2D[ml .xf = xp ; al- >punto2D [m] . yf = yp ;

Page 79: UNIDAD IZTAPALAPA 12>1

1; * fin Proyectacara */

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA 1 ;

for( m=O ; me= (*al).ultVertice;++m)/* todos los puntos de la cara*/ r

pse[m].xg = ( int ) ( maximax * 0.53 )

pse[m] .yg = ( int ) ( maximax * 0.68 + ( (*ai) .punto2D[m] .xf * 0.34 * maximax ) ;

- ( 150 + (*ai) .punto2D[ml .yf * 150 1; 1; if ( ai->color == O 1 1 ( aí->coior > getmaxcolor0))

setf illstyle (SOLID FILL, (*al) .color ) ; fiiipoiy ( al->uitVertice + 1, pse 1;

(al->color) = 1 ;

* fin Dibujacara */

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pseE MAXVERTCARA 1 ;

for( m=O ; me= i*al).ultvertice ;++m)/* todos los puntos de la cara*/

pse[m] .xg = ( int ) ( maximax * 0.53 ) {

+ ( (*ai) .punto2D[m] .xf * 0.34 * maximax 1;

pse[m].yg = ( int ) ( maximax * 0.68 1 - ( 150 + (*ai) .punto2D[m] .yf * 150 ;

1; setlinestyle(L1NEA-EXTERNA,O,NOM-WIDTH 1; setcolor (al- >cclor) ; drawpoly ( al->ultVertice + 1, pse 1; line ( pse [O] .xg, pse [ O 1 .yg,

pse [ al- >ultVerticel .xg, pse [ al->ultVerticel .yg ) ; * fin TrazaCaraExt *;‘

Page 80: UNIDAD IZTAPALAPA 12>1

zaCaraInt( CarasG *al)

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA 1 ;

for ( m=O ; me= íal->ultVertice) ; ++m) /* todos las puntos

+ ( al->punto2D[m].xf * 0.34 * maximax pse[ml .xg = ( int ) ( maximax * 0.53 1

{ de la cara*/

) ;

pse[m] .yg = ( int ) ( maximax * 0.68 1 - ( 150 + al->punto2D[m] .yf * 150 1;

1; setlinestyle(LINEA-INTERNA,O,NORM_WIDTH 1; setcolor (al->color) ; drawpoly ( al->ultVertice + 1, pse 1 ; line( psel01 .xg, pse[OI .yg,

pse [ aí->ultVerticel .xg, pse [ ai->ultVerticel .yg 1 ; * fin TrazaCaraInt */ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - - - - - - - - - - - - - - - - - - - - - -

Funciones para x,y,z en funcih de t y de la figura. */ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

at Fx(int i, float t!

float result = O ;

result = coefFigura[il .coefx[Ol + t * coefFigura[i] .coefx[l] + coefF*ura[il .coefx[2] * (t * t) + coefFigura[il .coefx[31 * sin( t * coefFigura[il .coefx[4] +

coefFigura[il .coefx[51 ) ; return result ;

at Fy(int i, float t)

float result = 0 ;

result = coefFigura[i] .coefy[O] + t * coefFigura[i] .coefy[l] +

return result ;

coefFigura[i] .coefy[21 * (t * t) + coefFigura[i] .coefy[3] * sin( t * coefFigura[i] .coefy[4] + coef

lat Fz(int i, float t).

float result = O ;

result = coefFiyura[il .coefz[Ol + t * coefFigura[i] .coefz[l] + coefFigura[i].coefz[2] * (t * t) + coefFigura[il .coefz[3] * sin( t * coeEFigura[i] .coefz[4] +

coefFigura[i] .coefz[51 ) ; return result ;

-- - "f

Page 81: UNIDAD IZTAPALAPA 12>1

Puntos3D vector3 ;

vector3.x = ( ( vectorl->y ) * (vector2->z) - ( vectori->z ) * (vector2->y) ) ;

vector3.y = ( ( vectorl->z ) * (vector2->x) .- ( vectorl->x ) * (vector2->z) ) ;

vector3.z = ( ( vectorl->x ) * (vector2->y) - *vector1 = vector3 ;

( vectorl->y ) * (vector2->x) ) ;

* fin ProductoCruz +/

return ( ( vectorl->x ) * ( vectora->x) + ( vectorl->y ) * ( vector2->y) + ( vectorl->z ) * ( vector2->z) ) ;

* fin ProductoPunto */ Archivo GPF1N.C Termina la sesih, libera la memoria asignada a las estructuras de datos utilizadas. */

clude cstdlib.h> clude "gpdef s . cfl

extern Puntos3D matriz3DA2D[ 3 I; /* Vectores de base del sistema proyec raEscena( Escenas *escena1 )

char i;

for (i=O ; ic= I escenal )->ultFigura ; ++i)

free (escenal) ; *fin BorraEscena */

BorraFigura( i, escenal ) ;

char i; Figuras *figural ;

figural = ( (escena1)->figura[jl ) ; for (i=O ; ic= ( figural )->ultCuerpo ; ++i)

free ( figural) ; Borracuerpo( i, figural ) ;

register i ;

Page 82: UNIDAD IZTAPALAPA 12>1

CuerposG *cuerpo1 ; CarasG *cara1 ;

cuerpo1 = ( (figural) ->cuerpo [jl ; for (i-0 ; ic= ( cuerpo1 ) ->uitCara ; ++i) {

1;

cara1 = ( ( cuerpo1 ) ->cara [il 1 ; free ( mral 1 ;

free ( cuerpol .j ;

Contiene las definiciones del proyecto : GEOMETRaA PROYECTIVA. INTEGRANTES DEL PROYECTO :

* fin Borracuerpo */ archivo GPDEFS.C :

LC. Gabriela Ramos Vargas Ing. Alberto Israel Santiago Soto */

AristasG es el tipo de una arista geomtrica que se forma con 2 puntos de inicio y fin.

typedef struct { Puntos3D iniAri, finAri ; int color I

} AristasG ;

CarasG es el tipo de una cara geomtrica que se forma con n vertices. Un color de cara ‘O’ significar que la cara toma el color definido para el cuerpo.

typedef struct {

*/ - - - - - - - - - - - - - - - - - - - - . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - fine MAXVERTCARA 5

Puntos3D punto3D[ MAXVERTCARA I ; Puntos2D punto2D[ MAXVERTCARA 3 ; int ultVertice ; int coior; } Cara& ;

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . CuerposG es el tipo de un cuerpo geomtrica que se forma con n caras, no necesariamente aledams.

Page 83: UNIDAD IZTAPALAPA 12>1

fine

if ine

if ine

!fine !fine

MAXCOEFDESPLA b typedef struct {

float coefx [MAXCOEFDESPLA] ; float c3efy [MAXCOEFDESPLAI ; float coef z [MAXCOEFDESPLA] ; float coef giro [MAXCOEFDESPLA] ; } CoefF3gura;

MAXCOEFOBSER 3 typedef float Coef sObser [MAXCOEFOBSER] ;

TAMATRIZ 3 I

typedef float Mstriz [TAMATRIZ] [TAMATRIZ] ;

LINEA-EXTERNA SOLID LINE LINEA-INTERNA DOTTED-LINE

lefine MAX-BASE 10 lefine VID-NORM 7 lefine VID INV 0x70 lefine VID-NORM PAR 0x87 lefine VID-INV-FAR OxFO lefine BKSF 8

Archivo GPCRESCE.C

iclude estdio.h>

*/

Page 84: UNIDAD IZTAPALAPA 12>1

dude cstdlib.h> clude <math.h> fine pi M-PI clude "gpdef s . c" clude llgpglobae. cV1

+ + + + + + + + + + + + Funcion AbreArchivo + + + + + + + + + + +

char AbreArchlvo (FILE **Archivo, char Nombre [ I , char Modo [ I )

* / /* Si puede abrir el archivo regresa un 1 si no UT: cero */

if ( ( *Archivo = fopen(Nombre,Modo)) == NULL

else

{

return (O) ;

return (1) ; 1; + + + + + + + + + + + + Funcion Error + + + + + + + + + + + */ void Error (char CodError) /* I

Manda un mensaje de error y aborta el programa */ 1

gotoxy (15,lJ ) ; switch (CodError)

I I case 1: printf("!No puedo abrir el archivo para escritura!11 break ; case 2: printf(I1!No puedo abrir e% archivo para lectura!11); break; case 3 : printf ( !No puedo cerrar el archivo! ;

1 exit (1) ;

1; + + + + + + + + Funcion Cierra Archivo + + + + c + + + + + + */

/* Si puech cerrar el archivo regresa un I sino un cero */ har CierraArchivo(F1LE **Archivo)

if ( fclose(*Archivo) == O ) {

return ( 1) ;

int nunFiguras, cod; int i; float flot; char cadena [20l I

printf ( 11Crearernos la escena. \n if ( ! (AbreArchavo( &Arch - datos, nESCENA.DAT11,11Wt3n)))

;

Error (1 II ;

Page 85: UNIDAD IZTAPALAPA 12>1

ventana-escribet(6,"'Cuantas figuras hay en la escena?:[ ventana xy(6,38,0) ; gcvt (l,Z,cadenaS ; ventana~lee~c~o~numerico(6,cadena,2); flot = (float) atof (cadena) ; numFiguras = (ifit) flot; cod = fwrite( &flot,sizeof (float) ,l,Arch-datosJ ; for ( i = O ; i c numFiguras ; ++i {

( escenal ) ->ultFigura = --i ; cod = CierraArchivo( SArch-datos ) ; desactiva(6) ; if ( cod == O

return O ; *fin CreaEscena */

onstruyeFigura( consf int *j, Escenas *escenal,FILF *Arch-datos)

1" ) ;

ConstruyeFigura( &i, escena1,Arch-datos); 1;

Error (3; ;

____________________I___________________-------------------------- */

__--____-__ii_iii-ii.--------------------- . . . . . . . . . . . . . . . . . . . . . . . . * /

int numcuerpos; int i,cod ; Figuras *figural ; float flot ; char cadena [ 2 0 3 ;

figural = malloc (sizeof (Figuras) ; ventana (2 ) ; ventana-xy (2,2, O ; ventana-escribe% (2, 'Cuantos cuerpos hay en la figura # ? 1 1 ; ventana-xy (2,38, O) ; gcvt ( * j ,2, cadena) ; ventana escribel(2, cadena) ; ventanaIxy (2,42, O ; gcvt (1,2,cadena) ; ventana~lee~campo~n~erico(2,cadena,2); flot = (float) atof (cadena) ; numcuerpos = (int) flot ; cod=fwrite( &flot,sizeof(float),l,Arch-datos); for (i=o ; ic numcuerpos; ++i){

1; ObtenEcuacionesFigura(j); desactiva (2) ; ( figural ) ->ultCuerpo = --i ; ( escena1 ) ->fiyura[*jl = figural ; return O ;

ConstruyeCuerpo( &i, figura1,Arch-datos);

* fin ConstruyeFigura */

'onstruyeCuerpo( const int *j, Figuras *figural,FILO *Arch-datos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

*/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - - - - - - - _ _ - - - - -

int nuncaras; int i, color1,cod; CuerposG *cuerpo1 ; float floti, flot2; char cadena [ 2 O I :

~ . ._ I _ -.-. 1 - -- --. - .... - "I.--

Page 86: UNIDAD IZTAPALAPA 12>1

ventana-xy ( 3,2, U 1 ; ventana escribet; (3, licCuantas caras hay en &1 cuerpo # ? [ 1 ; ventanaIxy (3,36 I O 1 ; gcvt ( * j ,2, cadetla) ; ventana-escribet(3,cadena);

ventana xy(3,40,0); gcvt (1,2, cadena; ; ventana~lee~campo~numerico(3,cadena,2); flotl = (float) atof (cadena) ; numCaras = (int) flotl ;

ventana-xy (3,2,2) ; ventana escribet (3, t1'Cual es el color por amisih del cuerpo ? [ ] ; ventanazxy (3,2,3) ; ventana-escribet(3,I1( 'Op indica que el cuerpo es transparente) . I 1 ) ;

ventana-xy (3,45,2) ; gcvt (0,2,cadenal ; ventana~lee~campo~numerico(3,cadena,2); flot2 = (float) atof (cadena) ; colori = (int) flota ;

cod=fwrite( &flotl,sizeof(float),l,Arch-datos); cod=fwrite( &flot2,sizeof(float),l,Arch-dato~); for (i=O ; ie nwmcaras; ++i){

Construyecara( &i, cuerpo1,Arch-datos); 1; desactiva(3) ; desactiva (7) ; ( cuerpoi ) ->ultCara = --i ; ( cuerpol ) ->coior = color1 ; ( figural ) ->cuerpo[*j] = cuerpol ; return O ;

* fin Construyecuerpo */ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * / Instruyecara( const int *j, CuerposG *cuerpol,FILE +Arch-datos) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . */

register int i; int colori, numVertices,cod; CarasG *cara1 ; float xl,yl,zl,flotl,flot2 ; char cadena [ 2 O I Q

cara1 = malloc (sizeof (CarasGI 1 ; ventana (4 ) ; ventana-xy (4,2,1) ; ventana-escribe2 (4, 11'Cuantas vrtices tiene la cara # ? [ 1") ; ventana-xy (4,2,2) ; ventana-escribet(4,I1(Se necesitan 3 puntos para definir un plano,"); ventana_xy(4,2,3) ;

ventana-xy (4,36,1) ; ventana-escribet(4, "el m ximo nhero admisible es: . I " ) ;

Page 87: UNIDAD IZTAPALAPA 12>1

gcvt ( * j ,2, cadena) ; ventana escribe- (4, cadena) ; /* nhnero de cara * y ventana-xy(4,33,3) ; gcvt ( Mb7ERTCA.h ,3, cadena) ; ventana - escribec(4,cadena);/* nhero m ximo de vrtices de una cara */

ventana x y (4,40 I 1) ; gcvt(3,Z,cadena\ ; ventana - lee-campo-numerico(4,cadena,2); floti = (float) atof (cadena) ;

flotl = ( flotl c 1 ) ? 1 : flotl ; ventana xy(4,40,1); gcvt (fiotl, 2, cadena) ; ventana - escribet (4, cadena) ; nunvertices = (int) flotl ;

flotl = ( flotl > MAXVERTCARA ) ? MAXVERTCARA : flotl ;

ventana-xy (4,2,5) ; ventana-escribet (4, ll'Cual es el color de la cara ? [ I ; ventana-xy (4,2,6) ; ventana escribet (4, ( ' OF indica que toma el color por omisih) 1 ; ventanaIxy (4,33,5) ; gcvt (1,2, cadena) ; ventana-lee campo-nunerico(4,cadena,2); flot2 = (float) atof (cadena) ;

flota = ( flota > 15 ) ? 15 : flOt2 ; flot2 = ( flota c 1 ) ? 1 : flota ; ventana-xy (4,3 3,5 1 ; gcvt (flot2,2, cadena) ; ventana-escribet (4, cadena) ;

colorí = (int) flot2 ; cod=fwrite( &flotl,sizeof (float) ,l,Arch-datos) ; cod=fwrite( &flot2,sizeof(float),l,Arch-datos); ventana-xy (4,2,7) ; ~entana-escribet(4,~~Coordenadas cartesianas de los vrtices:" 1; ventana-xy (4,2,8) ;

for (i=O ; ic numvertices; ++i){ ventana-escribet (4, 11 X Y Z" 1;

ventana-xy (4,2,9 + i) ;

ventana-xy (4,3,9 + i) ; gcvt (O, 7, cadena) ; ventana-lee-campo~nunerico(4,cadena,7): xi = (float) atof(cadena1; ventana-xy (4,15,9 + i) ; gcvt (O, ?, cadena) ; ventana-lee-campo-numerico(4,cadena,7); y1 = (float) atof(cadena); ventana_xy(4,27,9 + i); gcvt (O, 7 , cadena) ; ventana-lee-campo-numeric0 (4, cadena, 7 ) ; zl = (float) atof(cadena1; cod=fwrite( &xl,sizeof (float) ,l,Arch-dztos) ; cod=fwrite( &yl,sizeof (float) ,l,Arch_datos) ; , cod=fwrite( &zl,sizeof (float) ,l,Arch-*tos) ; caral- ppunto3D [i] .x = xl ; caral->punto3D[i] .y = y1 ; caral->punto3D[i] . z = zl ;

ventana-escribet (4, I' [ I , [ I , [ 1;

Page 88: UNIDAD IZTAPALAPA 12>1

caral->color = color1 ; masaltax = max( masaltax, ( abs( xl ) ) 1; masbajaa = min( masbajax,(-abs( xl ) ) ) ; masaltay = max( masaltay, ( abs( y1 ) ) , , masbajay = min( masbajay, (-abs( y1 ) ) 1; masaltae = max( masaltaz, ( abs( zl ) ) 1; masbaja$ = min( masbajaz, (-abs( zl ) ) 1:

r .

1; desactiva(4) ; ( caral ) ->ultWrtice = --i ; ( cuerpo1 ) ->cara [*jl = caral ; return O ;

* fin Construyecara */

clude cgraphics.h> clude cstdio.h> clude cstdlib.h> clude cmath.h> clude cconio.h> clude "gpdef s . cV1

variables externas globales */ clude Ilgpglobae. cI1

at ProductoPunto( Puntos3D fvectorl, Puntos3D *vector2 ) ; at Fx(int i, float t); at Fy(int i, float tk; at Fz(int i, float t);

float deltax, deltay, deltaz ;

yecta3Da2D( Escenas *escena1

static Puntos3D. ejes[ 6 + 4 I = { O,O,O, O,O,O, O,O,O, o,o,o, o,o,o, o,o,o, o,o,o, o,o,o, o,o,o, o,o,o };

/ * del 734 al 91Xvector de los ejes correBponden a deltas y ei.1034 al origen. */

textmode (3 ) ; IniciaModoGraf ico (1 ; for ( t = to ; t e= tf ; t += deltat ) {

Base(); /* Determinacion de la base del sistema proyectivo */ ProyectaEscena( escenal, ejes 1; /* Proyector principal*/ Retardo { ) ; Limpiapantalla ( escenal, ejes 1 ; /* ciearviewport 0 ; */

1; restorecrtmode (1 ;

int tarjeta, moaog ;

Page 89: UNIDAD IZTAPALAPA 12>1

detectgraph (&tarjeta, &modog) ; initgraph(&tarjeta, &modog, Ill1) ; setwritemode ( XoR-PUT ; setlinestyle ( LINEA-EXTERNA, O, NORM WIDTH ) ; maximax = getmiwx0 i Mainwindow ( I1GemetrAa Proyectiva1I) ;

maximay = getmaxyo ;

ardo ( )

int register i ; char c ;

for ( i = O ; i e ret && !kbhit() ; ++i 1; if ( kbhit0) {

c = getc:h() ; if ( c == 1

else if ( c == 27 ) /* con ESC se interrumpe */ /* con I se detiene */

getch0 ;

t = tf + deltat I

1; * fin Retardo */

int m; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D e [6a41 ;

(C I - > x = masaltax * 1.1; (c + 1)-> x = masbajax * 1.1; (c + 2)-> y = masaltay * 1.1; (C + 3)-> y = masbajay * 1.1; (c + 4)-> z = msaltaz * 1.1; (c + 5)-> z = masbajaz * 1.1; (c + 6)-> x = deltax;

(C + 7)-> x = deltax; (C + y ) - > y = deitay;

(c + a ) - > x = deltax; (c + a ) - > y = dleltay; (c + a ) - > z = deltaz;

for( m=O ; me 10 ;++m)

pcu = ( ( ( c + m )->XI* matriz3DA2D[O] .x + ( ( c + m ) - >y ) * matriz3DA2D[O] .y + ( ( c + m )->z)* matriz3DA2D[Or.z ) ;

pcv = ( ( ( c + m ) ->XI * matriz3DA2D[k] .x + ( ( c + m ) ->y) * matriz3DA2D[Z] .y + ( ( c + m )->z) * matriz3DA2D[SI .z);

pcw = ( ( ( c + m )->XI * matriz3DA2D[2f.x + ( ( c + m )->y) * matriz3DA2D[31.y + ' ( ( c + m )->z) * matriz3DA2D[21 .z);

xp = (d:i * pcv) / (rh - pcu) ;

{

Page 90: UNIDAD IZTAPALAPA 12>1

yp = (dh * pcw)/(rh - pcu) ;

e[ml.xg = ( int ) ( maximax * 0.53 ) '-*s + ( xp * 0.34 * maximax ) ;

e[ml .yg = ( int ) ( maximax * 0.68 )

/ * Guarda coordenadas en 2 dimensiones: */

- ( 150 + y~ * 150 1 ;

1 ; setcolor (EGA-LIGHTGRAY) ; setlinestyle( CENTER-LINE, 125, NORM-WIDTH ) ; for( m=O ; me 6 ; m+=2 )

setcolor(EGA-DARKGRAY); setlinestyle( DASHED-LINE, 125, NORM-WIDTH ) ;

line ( e [ml .xg, e [ml .yg, e [m+il .xg, e [m+il .yg ;

line( e[91 .xg, ei91 .yg, e[61 .xg, el61 .yg ;/* O, O, O > - (dx, O, O)*/ line( e[61.xg, e[6l.yg, ePI.xg, e[71.yg ) ;/*(ax , O, O)-(dx,dy, O)*/ line( el71 .xg, e171 .yg, e181 .xg, e181 .yg );/*(dx,dy, O)- (dx,dy,dz)*/

setlinestyle ( SOLID-LINE, O, NORM - WIDTH ;

* fin Ejes */

rh = coefrob9er[OI + t * coefrobser[ll + t¿ * t * coefrobser[2] ; theta = coefthobser[Ol + t * coefthobser[ll + t * t * coefthobser[21 ; phi = coefphobser[Ol + t * coefphobser[ll + g * t * coefphobser[21 ;

matriz3DA2D[Ol .x = sin(theta) * cos (phi) ; matriz3DA2D[Ol . y = sin(theta) * sin(phi) ; matriz3DA2D [O] .a = cos (theta) ; matriz3DA2D 111 .R = -sin(phi) ; matriz3DA2D[l] .y = cos (phi) ; matriz3DA2D[l] . z = 0.0; matriz3DA2D [21 .x = -cos (theta) * cos (phi) ; matriz3DA2D[21 .y = -cos(theta) * sin(phi); matriz3DA2D 121 . z = sin (theta) ; return (O) ;

* fin base */ - - - - - - - - - - - - - - - - - - - - * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - . - - - - - - - - - - - -

ProyectaEscena traduce los puntos de una Escena a 2D, dados el radio, la distancia d y la matriz de proyeccih.

byectaEscena( Escenas fescenal, Puntos3D *ejes)

char i;

PintaEjes ( ejes ) ; setwritemode( XOR PUT 1 ; setlinestyle ( LINEA-EXTERNA, O, NORM-WIDTH ; for (i=O ; ic= ( escenal )->ultFigura ; ++i){

deltax = Fx(i,t); deltay = Fy(i,t); deitaz = Fz(i,t); ProyectaFigura ( i, escenal 1 ;

1; '*fin ProyectaEscena * /

- . . ~ . - . . .- "- . . . . . . .. __I -.-.. - .

Page 91: UNIDAD IZTAPALAPA 12>1

char i; Figuras figural ;

figural = * ( (escena1)->figura[jl ; for (i=o ; ic=

1; * ( ( escena1 )->figura[j] ) = figural ;

figural ).uitCuerpo ; ++i){ ProyectaCuerpo ( i, &figural ;

* fin ProyectaFigura */

char i,ii; CuerposG cuerpo1 ; CarasG caral ; int visible = í ;

cuerpo1 = * ( (figural)->cuerpo[jl 1; for (i=O ; ic= 4 cuerpoi .uitCara ; ++i){

caral = * ( ( cuerpo1 ) .cara[il 1 ; Proyectacara ( &caral, &visible ; if (visible) {

if ( !caral.color

if ( cuerpoí.coior

else

caral.color = cuerpol.solor

Dibujacara ( caral ;

TrazaCaraExt ( caral ) I

}else{

if ( !cuerpol.color 1 TrazaCaraInt ( caral

1; * ( ( cuerpol ) .cara[il ) = caral ;

1; * ( ( figural ) -sccuerpo[jl ) = cuerpoi ; '* fin Proyectacuerpo */

)yectaCara( CarasG *al, int *visible)

int m, u=O, v=l, w=2 ; Puntos3D vectorl, vector2 ; float xp, yp ; float pcu, pcv, pcw ;

/* Rota la cara completa, en una cara auxiliar, y toda la

Page 92: UNIDAD IZTAPALAPA 12>1

proyeccih se hace sobre la cara auxiliar. */

*/ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . if ( (m = (ai-> ultvertice) ) c 2 ) / * es lineal o puntual. */ else {

*visible = O ;

vector1,x = ( (al->punto3D[lI) .x - (al->punto3D[O]) .x); vector1.y = ( (al->punto3D[1] ) .y - (al->punto3D[Ol) .y) ; vector1.z = ( (al->punto3D[1]) .z - (al->punto3D[OI) .z);

vector2 .x = ( (al->punto3D[m] ) .x - (al-apunto3D[Ol) .XI ; vector2,y = ( (al->punto3D[m]) . y - (al-apunto3D[O]) .y); vector2.z = ( (al->punto3D[m]) .z - (al->punto3D[Ol) .z) ;

ProductoCruz(&vectorl, &vector2); /* vector nomal a la cara */ vector2 = matriz3DA2D[Ol ; /* coordenadas del observador */ *visible = ( (ProductoPunto(&vectorl, Gvector2)) > O ? 1 : O 1; / *

Si el producto punto del vector normal a la cara con la posicih del observador es > 0,la cara es visible.

*/

1; { for( m=O ; mc= (al-> ultVertice);++m)/* todos los puntos de la cara*/

pcu = ((al->punto3D[ml) .x + deltax) * matriz3DA2D[u] .x + ((al->punto3D[m]) .y + deltay) * matriz3DA2D[u] .y + ( (al->punto3D[ml) .z + deltaz) * matriz3DA2D[u] .z;

pcv = ((al->punto3D[ml) .x + deltaxj * matriz3DA2DIvI .x + ( (al->punto3D[ml) .y + deltay) * matriz3DA2D[vl .y + ( (al->punto3D[ml ) .z + deltaz) * matriz3DA2DIvI . z ;

pcw = ( (al->punto3D[ml) .x + deltax) * matriz3DA2D[w] .x + ( (al->punto3D[ml) .y + deitay) * matriz3DA2D[w] .y + ( (al->punto3D [ml ) . z + deltaz)

xp = (dh * pcv)/(rh - pcu); yp = (dh * pcw)/(rh - pcu); /* Guarda coordenadas en 2 dimensiones: */ al- >punto2D [m] . xf = xp ; al- >punto2D [ml . yf = yp ;

* matriz3DA2D [wl . z ;

1; '* fin Proyectacara *i

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D pse! MAXVERTCARA 3 ;

Page 93: UNIDAD IZTAPALAPA 12>1

for( m=O ; me= (al.ultVertice);++m)/* todos los puntos de la cara*/

pse[m].xg = ( int ) ( maximax * 0.53 ) {

+ ( al.punto2D[m] .xf * 0.34 * maximax ) ;

pse[ml .yg = ( int ) ( maximax * 0.68 ) - ( 150 + al.punto2D[ml .yf * 150 ) ;

1; if ( ai.coior == O I I ( al.coior > getmaxcoior0))

setfillstyle(SO~ID~FILL,al.color ) ; fillpoiy ( (ai.ultVertice) + 1, pse 1;

al.color = 1 ;

* fin Dibujacara */

int m ; float x p , yp ; float pcu, pcv, pcw ; IntPuntos2D pse[ MAXVERTCARA I ;

for( m=O ; me= (ai.ultVertice);++m)/* todos los puntos de la cara*/

pse[m] .xg = ( int ) ( maximax * 0.53. 1 {

+ ( al.punto2D[m] .xf * 0.34 * maximax 1;

pse[m] .yg = ( int ) ( maximax * 0.68 - ( 150 + al.punto2D[ml .yf * $50 ) ;

1; setlinestyle (LINEA-EXTERNA, O ,NORM_WIDTH ) ; setcolor(al.color) ; drawpoly ( (al.iiltVertice) + 1, pse 1; line( pseEo1 .xg, pse[OI .yg,

pse [ ai.uitVertice1 .xg, pse [ al.ultVertice1 .yg 1 ; * fin TrazaCaraExt * I

int m ; float xp, yp ; float pcu, pcv, pcw ; IntPuntos2D psed MAXVERTCARA I ;

for( m=O ; me= (al.ultVertice);++m)/* todos los puntos de la cara*/

pse[ml.xg = ( int ) ( maximax * 0.53 ) {

+ ( al.punto2D[m] .xf * 0.34 * maximax ) ;

pse[m] .yg = ( int ) ( maximax * 0.68 ) - ( 150 + al.punto2D[ml .yf * 150 1;

Page 94: UNIDAD IZTAPALAPA 12>1

1; setlinestyle(LINEA-INE~A,O,NORM_WIDTH 1; setcolor (ai. colm) ; drawpoly ( (al.ultVertice) + 1, pse ) ; line ( pse [O] .xg, pse [O1 .yg,

* fin TrazaCaraInt */ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ^ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ - - _ - - - - - - - - - - - - - - - - - - -

pse[ ai.ultVertice1 .xg, pse[ aí.ultVertice1 .yg ) ;

Funciones para x,y,z en funcih de t y de la figura. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - - - - - - - - - - - */ at Fx(int i, float t)

float result = O ;

result = coefFigura[i] .coefx[O] + t * coefFigura[il .coefx[l] + coefFigura[il .coefx[2] * (t * t) + coefFigura[i] .coefx[3] * sin( t * coefFigura[i] .coefx[4] +

coefFigura[il .coefx[51 ) ; return result ;

at Fy(int i, float t!

float result = O ;

result = coefFiqura[i] .coefy[O] + t * coefFigura[il .cOefy[l] + coefFi&ra[il .coefy[21 * (t * t) + coefFiguraLi1 .coefy[31 * sin( t * coefFigura[il .coefy[41 + coef

return result ;

at Fz(int i, float t)

Puntos3D vector3;

vector3.x = ( ( vectorí->y ) * (vector2->z) - ( vectori->z ) * (vector2->y)

vector3.y = ( ( vectorl->z ) * (vector2->x) - ( vectorl->x ) * (vector2->z)

vector3.z = ( ( vectorí->x ) * (vector2->y) - *vector1 = vector3 ;

( vectorl->y ) * (vector2->%)

I * fin ProductoCruz */

Page 95: UNIDAD IZTAPALAPA 12>1

return ( ( vectorl->x * ( vector2->x) + ( vectorl->y ) * ( vectorl->y) + ( vectorl->z ) * ( vector2->z) ) ;

* fin clude clude clude clude clude clude clude

ProductoPunto */ cgraphics.h> cstdio.h> cstdlib.h> cmath.h> ectype. h> cconio. h> "gpdef s. ctt

variables externas globales */ clude "gpglobae. ctt

*/ MAINWINDOW: Establish the main window for the demo and set */ a viewport for the demo code. */

*/

d Mainwindow( char *header )

nt height;

etcolor( getmaxcolor0 - 1 ; /* Set current color to white etviewport( O, O, maximax, maximay, 1 1; /* Opefi port to full screen leardevice (1 ; /* Clear graphics screen */

eight = textheight( "HIt 1; /* Get basic text height */ ettextstyle( DEFAULT FONT, HORIZ DIR, 1 ) ; ettextjustify( CENTER-TEXT, TOP TEXT ; uttextxy ( maximax/2, 2, header 7; ,etviewport ( O, height+4, maximax, maximay- (height+4) , 1 1 ; IrawBorder ( ; etviewport ( 1, height+5, maximax-1, maximay- (height+5), 1 ) ;

*/

*/ STATUSLINE: Display a status line at the bottom of the screen. */

.d StatusLine( char *msg 1

.nt height;

ietviewport ( O, O, maximax, maximay, 1 ) ; /* Open port to full screen ietcolor ( getmaxcoiorl) - í ) ; /* Set current color to white 3ettextstyle ( DEFAULT-FONT, HORIZ DIR, 1 ) ; settextjustify( CENTER-TEXT, TOP - TEXT ;

Page 96: UNIDAD IZTAPALAPA 12>1

stlinestyle ( SOLID LINE, O, NORM-WIDTH ) ; ztfiiistyie ( EMPTY-'*FILL, - O ;

sight = textheight( IIHII ) ; / * Detemine current height */ ar( O, maximay- (height+4), maximax, maximay ) ; sctangle ( O, maximay- (height+4), maximax, maximay ) : Jttextxy( maximax/2, maximay- (height+2), msg ; stviewport ( 1, height+5, maximax-1, maximay- (height+5) , 1 ) ;

*/ DRAWBORDER: Draw a solid single line around the current */ viewport. */ */

wBorder (void)

truct viewporttype vp;

etcolor ( getmaxcolor0 - 1 ) ; /* Set current color to white etlinestyle( SOLID-LINE, O, NORM-WIDTH ) ;

etviewsettings ( &vp 1 ; ectangle( O, O, vp-right--.left, vp.bottom-vp.top t ;

int i, j ; char cadena 151 , relleno C71

/* for ( i = 1 ; i e= 15 ; ventana-xy (7,1,1) ; i toa ( 1, cadena, 10 ) ; ventana-xy ( 7,1,1) ; ventana-xy ( 7,3 ,I ; ventana-xy (7,1,2 ; ventana-xy (7,3,2 ; ventana-xy ( 7,1,3 ; ventana-xy (7,3,3 ; ventanaAw(7, 1,4) ; ventana-xy (7,3,4 ; ventana-xy (7,1,5 ; ventana-xy (7,3,5 1 ; ventana-xy (7,1,6) ; ventana-xy (7,3,6 ; ventana-xy (7,1,7) ; ventana-xy ( 7,3,7) ; ventana-xy (7,1,8) ; ventana-xy (7,3,8 1 ; ventana-xy (7,1,9 ) ; ventana ~~(7,3,9);

1 1 1 1 1 - - " ~ 1 1 .

++i ) { */ I

ventana escribet (7, 1" 1 ; ventana-escribet (7, llazul" 1 ; ventana-escribet (7, 2 1 ; ventana-escribet (7, "verde" 1 ; ventana-escribet (7, 3" 1 ; ventana-escribet (7, Ilcyan" 1 ;

1; ventana-escribet (7, 4" ventana-escribet (7, "rojo" 1 ; ventana-escribet (7, " 5 " 1 ; ventana-escribet (7, *magentaf1 ; ventana-escribet (7, 6" ; ventanares~ribet(7,~caf" 1; ventana-escribet (7," 7" 1 ; ventana escribet (7, "gris c" ) ;

1; ventana-escribet (7, .I 8 " ventana-escribet (7, "gris o" ; ventanarescribet (7, 9" ; ventana escribet (7, "azul cl1 1 ; - - ventana--xy(7,1,10) ; ventana escribet(7, i f l o " 1 ;

ventana_xy(7,3,10) ; ventana-escribet (7, "verde c1I 1 ; ventana_xy(7,1,11) ; ventana-escribet (7, ) ; ventana xy(7,3,11); ventana-escribetl7,"cyan c" 1; ventana~xy(7,1,12) ; ventanaIescribet (7, 111211 ;

Page 97: UNIDAD IZTAPALAPA 12>1

ventana_xy(7,3,12); ventana escribet(7, "rojo c1I 1; ventana_xy(7,1,13) ; ventana-escribet (7, Ii13l1 ) ; ventana-xy (7,3,13) ; ventana-escribet (7 , "magenta cl' ) ; ventana_xy(7,1,14) ; ventana-escribet (7, ii14i1 ; ventana_xy(7,3,14) ; ventana-escribet (7, llamarilloll ventana_xy(7,1,15) ; ventanazescribet (7, *15" ; ventana-xy (7,3,15) ; ventana - escribet (7, llblancoll

;

; /* 1; */

* Pintacoiores */

int chl, x1,yl char *cadl;

/* clrscr (1 ; */ ventana (O ; ventana-xy (O, 28,5) ; ventana-escribet (O, I1P : Proyectar Escena. ; ventana-xy ( O, 2 8,7 1 ; ventana-escribet (O, I1M : Modificar Escena. ; ventana-xy (O, 28,9) ; ventana-escribet (O, IiF : Funciones F (t) . II ; ventana-xy ( O, 2 8,11) ; ventana-escribet(0,IlS : Salir de GeomProy."); ventana-xy (O, 28,13 ) ; ventana-escribet (O, Opcik: ; xl = wherex() ; y1 = whereyo ;

chl = toupper( getche0 ) ; cadl = strchr ( iiPMFS1l, chl) ;

do {

gotoxy(x1,yl) ; }while (cadl == NULL); desactiva(0) ; return chl ;

ventana (5 ; ventana_xy(5,2,1) ; ventana escribet (5, : Crear Escena. ; ventanaIxy ( 5,2,3 ) ; ventana-escribet (5, I1L : Leer Escena. 1 ; ventana_xy(5,2,5) ; ventana-escribet (5, II'opciAn? (c/L) : [ I 1 1 ) ; do {

ventana-xy( 5,19, 5); chl = toupper( getche0 ) ; cadl = tJtrchr ( iiCL1l, chl) ;

}while (cadl == NULL); ventana-xy (5,2.7) ; ventana-es~ribet(5,~~Usando el archivo:[ 1 I r ) ;

Page 98: UNIDAD IZTAPALAPA 12>1

ventana-xy ( 5,2 1,7 ; ventana--lee-campo (5, cadena, 25 1 ;

}while ( strlentcadena) c 1) ; if ( chl == 'L'){

if ( ! (AbreArchivo ( archivoEscena Error (2) ;

if ( !(AbreArchivo( archivoEscena Error (1) ;

do {

1

1 ;

else if ( chl == ,C'){

desact iva (5 ; return chl ;

/ *fin PideOpcionEscena */

, cadena ,"rbl!)))

, cadena , "wb") ) )

* / I

Rutinas de ventanas para presentacih */ alientanas ( 1

rear-ventana (O, Geometrh Proyectiva O, 0,79,24,1,VID NORM);

rear-ventana (2, ObtenciAn de la figura , 5, 3,57, 5,2,VID-INV); rear-ventana (3, Obtenci& del cuerpo I!, 6, 5,60,10,2,VID-INV) ; rear-ventana (4, ObtknciF de la cara 2, 0 , 65,24,2,VID-INV) ; rear-ventana (5, ObtenciAn de la Escena 10, 2,65,14,1,VID-INV); rear-ventana (6, Creacih de la Escena I!, 4, 1,50, 3,1,VID-INV); rear-ventana (7, llColoresll, 66, 2,79,19,1,VID_NORM);*/ rear ventana ( 8 , Ecuaciones del cuerpo 'I, 1, 3,79,24,2,VID_INV);

crear ventana (1, Ecuacjones del observador I r , 12, 3,70 , 18,2 ,VyD-INV) ;

-

float rO, rl, r2, r3, r4 ; char cadena [201 ;

ventana (1) ; ventana_xy(l,2,1) ; ventana escribet(l,!!Coordenadas ventanaIxy (i,2,3) ; ventana - escribet (1, !IR (t) = [

esfricas del observador: ) ;

I + [ l*t + l*ts" 1;

ventana xy(1,8,3); gcvt (coefrobser [O] ,7, cadena) ; ventana lee-campo-numerico(l,cadena,7); coefrobser [O1 = (float) atof (cadena) ;

ventana-xy (1,20,3) ; gcvt (coef robser ;i] ,7, cadena) ; ~entana-iee-campo-numerico(i,cadena,7); coefrobser[ll = (float) atof (cadena) ;

ventana xy(i,34,3); gcvt (coef robser 12 I , 7, cadena) ; ventana~lee~campo~numerico(l,cadena,7); coefrobser[2] = (float) atof (cadena) ;

Page 99: UNIDAD IZTAPALAPA 12>1

ventana-xy (1,2,5) ;

ventana-xy (1,8,5) ; gcvt (coef thobser [ 01 ,7, cadena) ; ventana~lee~campo~numerico(l,cadena,7); coef thobser [O] = (float) atof (cadena) ;

ventana-escribet (1, I f & (t = I + [ l*t + [ Ift," ) ;

ventana-xy (1,20,5) ; gcvt (coefthobser[ll ,7,cadena) ; ventana-lee-campo-numerico(l,cadena,7); coefthobser [l] = (float) atof (cadena) ;

ventana-xy (1,34,5) ; gcvt (coef thobser [21 ,7, cadena) ; ventana-lee-ca1npo-numerico(l,cadena,7); coefthobser[2] = (float) atof (cadena) ;

ventana-xy ( 1,2,7 ) ; ventana - escribet (1, (t 1 = [ I + [ I*t + [ ' l*t»" 1;

ventana xy(1,8,7); gcvt (coefphobser [O] ,7, cadena) ; ventana-lee-campo-numeric0 (1, cadena, 7) ; coefphobser[O] = (float) atof (cadena) ;

ventana-xy ( 1,2 O, 7 ) ; gcvt (coefphobser [ 11 ,7, cadena) ; ventana-lee-campo-numerico(l,cadena,7); coefphobser[ll = (float) atof (cadena) ;

ventana-xy ( 1,34,7 ; gcvt (coefphobser [21 ,7, cadena) ; ventana~lee~campo~numerico(l,cadena,7); coefphobser[2] = (float) atof (cadena) ;

ventana-xy ( 1,2,? ) ; ventana-escribet(l,IlDistancia del observador al plano proyectivo:Il 1;

ventana-xy (i,47,9 ; gcvt (dh, 7, cadena) ; ventana lee-campo-numerico(l,cadena,7); dh = (float) atof (cadena);

ventana-xy ( 1,2 , I1 ) ; ventana-escribet (1, If to= [ 3 deltat=[

ventana_xy(1,6,il) ; gcvt (to,7,cadena) ; ventana~lee~campo~numerico(l,cadena,7); to = (float) atof (cadena);

ventana-xy ( 1,2 3 ,111 ; gcvt (deltat, 7, cadena) ; ventana-lee-campo-numerico(l,cadena,7); deltat = (float? atof (cadena) ;

ventana_xy(l,36 11) ; gcvt(tf,7,cadens); ventana-lee-cm~o-numerico(l,cadena,71; tf = (float) atDf(cadena);

] tf=[

Page 100: UNIDAD IZTAPALAPA 12>1

ret = 10 ; ventana-xy (1,2 I 1.3 ; ventana - escribef(l,llFactor de retardo = [ i ' i ;

ventana xy(1,23,13) ; gcvt (ret, 4, cadena) ; ventana-lee campo numeric0 ( 1, cadena, 4) ; ret = (int)abs( atof (cadena) ) ; desactiva(1) ;

float rO, rl, r2, r3, r4, r5 ; char cadena [2 O 1 ;

result = coefFigura[il .coefx[Ol + t * coefFigura[il .coefx[ll + coefFigura[iI.coefx[21 * (t * t) + coefFigura[il .coefx[31 * sin( t * coefFigura[il .coefx[4] +

coefFiguraLi1 .coefx[51 ; return result ; */ ventana ( 8 ) ; ventana_xy(8,3,1) ;

ventana xy(8,39,1); gcvt ( *3, 3, cadena) ; ventana - escribet. ( 8 , cadena) ;

ventana-escribet(8, llFuncih de traslacih de la figura: . I ' 1;

ventana-xy (8,1,3) ;

ventana:- (8,1,4) ; ventana escribet ( 8 , "X (t) = [ I + [ It + [ Its +Vi);

ventana-escribet(8, [ ]SENO( [ It + 1

~

ventana-xy (8,9,3) ; gcvt (coefFigura [*j I . coefx [O] , 7, cadena) ; ventana-lee-campo-numerico(8,cadena,7); coefFigura[*jI.coefx[01 = (float I ventana-xy (8,21,3) ; gcvt (coefFigura [*j I . coefx[ll ,7, cadena) ; ventana lee campo numerico(8,cadena,7) ; coefFi ura[*jl .coefx[l] = (float

ventana-lee - - campo_numerico(8,cadena,7) ; coefFigdra[*jl .coefx[21 = (float ventanaxxy(8,34,3); gcvt (coefFigura[*jl .coefx[ 8 I ,7,cadena) ;

ventana-xy (8,9,4) ; gcvt (coef Figura [*j I . coefx [31 ,7, cadena) ; ventana-lee-campo numerico(8,cadena,7) ; coefFigura[*j] .coefx[3] = (float ventana xy(8,24;4); gcvt (coefFigura[*j] .coefxM.l ,7,cadena) ; ventana~lee-ca1npo-numerico(8,cadena,7) ; coefFigura[*jl .coefx[4] = (float ventana_xy(8,37,4) ; gcvt(coefFigura[*j] .coefx[51 ,7,cadena) ; ventana - lee - campo-numerico(8,cadena,7) ; coefFigura[*jl .coefx[5] = (float

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

ventana-xy (8,1,6) ;

ventana-xy (8,1,7) ; ventana-escribec(8, "Y(t) = [ I + [ It + Its + i f ) ;

ventana - escribet ( 8 , [ ]SENO( It + 1 ventana-xy (8,9, G ) ; gcvt (coefFigura [*j I coefy [O3 ,7, cadena) ;

Page 101: UNIDAD IZTAPALAPA 12>1

ventana lee campo-numerico(8,cadena,7) ; coefFigura[*jl .coefy[Ol = (float ventanaIxy(8,21,6) ; gcvt (coefFigura[*jl .coefyIll ,7,cadena) ; ventana-lee-campo numeric0 (8, cadena, 7) ; coef Figura [ * j ] . coefy [ 11 = (float ventana xy ( 8,34,6); gcvt ( coef Figura [ * j I . coefy [2 1 ,7, cadena) ; ventanaIlee-campo - numerico(8,cadena,7) ; coefFigura[*j] .coefy[21 = (float

ventana_xy(8,9,7) ; gcvt (coefFigura[*jl .coefy[31,7,cadena) ; ventana lee-campo-numerico(8,cadena,7) ; coefFigura[*jl .coefy[31 = (float ventanaxxy(8,24,7) ; gcvt(coefFigura[*jl .coefy[41,7,cadena); ventanaIlee-campo numerico(8,cadena,7) ; coefFigura[*jl .coefy[41 = (float ventana-xy (8,37,77; gcvt (coefFigura [*j] . coefy [51 ,7, cadena) ; ventana~lee~campo~numer~co(8,cadena,7); coefFigura[*j].coefy[5] = (float

ventana-xy (8,1,9 1 ;

ventanaIxy (8,1,10) ; ventana escribet(8, llZ(t) = [ I + [ It + It, ;

ventana - escribet (8, [ ]SENO( It + [ 1 ) o " ) ;

ventana-xy (8,9,9) ; gcvt (coef Figura [*j I . coef z [O] ,7, cadena) ; ventana-lee-campo-numerico(8,cadena,7) ; coefFigtira[*jl .coefz[Ol = (float ventana-xy (8,21 I 9) ; gcvt (coef Figura [*j I . coef z [il ,7, cadena) ; ventana lee campo numerico(8,cadena,7); coefFigura[*jl .coefz[lI = (float ventanaxxy(8,34,9); gcvt (coefFigura[*jl .coefz[21 ,7,cadena) ; ventana~lee-campo-numerico(8,cadena,7) ; coefFigura[*j] .coefz[2] = (float

ventana xy(8,9,10) ; gcvt (coefFigura[*jl .coefz[31 ,7,cadena); ventanaIlee-campo-numerico(8,cadena,7) ; coefFigura[*jl .coefz[31 = (float ventana xy(8,24,10); gcvt(coefFigura[*jl .coefz[43,7,cadena); ventana~lee-campo-numerico(8,cadena,7) ; coefFigura[*j] .coefz[4] = (float ventana-xy (8,37,10) ; gcvt (coef Figura [*j I . coef z [SI ,7, cadena) ; ventana - lee-campo-numerico(8,cadena,7) ; coefFigura[*j] .coefz[5] = (float

desactiva(8) ;

Page 102: UNIDAD IZTAPALAPA 12>1

SEGUNDA PARTE

Page 103: UNIDAD IZTAPALAPA 12>1

INRODUCCION

Las computadoras se han convertido en una herramienta poderosa para la producción rápida y económica de iiustraciones.Prácticamente no existe ningúri area en la cual no puedan utilizarse los despliegues gráficos con alguna ventaja. Aunque las primeras apLkaciones en ciencia e ingenieria tenian que basarse en equipo costoso Y complicado, los adelantos de la tecnologia de computacion han hecha de las gráficas de computadoras interactivas una herramienta práctica. Hoy en dia, se puede advertir que estas gráficas se utilizan rutinariamente en areas diversas como la administración, la industria, el gobierno, arte, entretenimiento o esparcimiento,publicidad, educación, investigación, capacitación y medicina.

DISEÑO CON AYUDA DE LA COMPUTADORA

Desde hace varios años, el uso mas extenso de las gráficas de computadora ha sido como auxiliar del diseño. Generalmente conocido como CAD ( o DAC, traducido al español ) , los métodos de diseño con ayuda de computadoras ofrecen poderosas herramientas. El diseño de partes y el dibujo mecánico se realizan interactivkxnente, produciendo perfiles o producciones mas realistas. Cuando se han especificado las dimensiones de un objeto al sistema de computación, los deseñadores pueden observar cualquier lado del objeto paxa apreciar como será después de su construcción. Pueden hacerse cambios experimentales con libertad ya que, a diferencia del dibujo mecanico manual, el sistema CAD ( DAC incorpora rápidamente modificaciones en el despliegue del objeto. El proceso de manufactura también se beneficia en que los proyectoe muestran con exactitud la forma en que se contruirá el objeto.

Los ingenieros eléctricos y electrónicos trabajan con base en los metodos CAD. Por ejemplo, los circuitos electrónicos se diseñan comunmente con sistemas interactivos de gráficas por computadora. Utilizando simbolos gráficos para representar varios componentes, un diseñador puede construir un circuito de un monitor de video agregando componentes en forma sucesiva al proyecto del circuito. El despliegue de gráficas puede utilizarse para experimentar esquemas de circuitos alternativos mientras el diseñador intenta minimizar el número de componentes c) bien el espacio que se reqLiere para el circuito.

Page 104: UNIDAD IZTAPALAPA 12>1

Los diseñadores de automoviles, aviones, naves espaciales y barcos utilizan técnicas CAD ( DAC ) en el diseño de varios tipos de vehículos. Los trazos con estructuras de alambre se utilizan para modelar componentes individuales y planear perfiles de superficies de automóviles, aviones, naves espaciales y barcos. Las secciones de superficies y componentes de vehiculos pueden diseñarse por separado y conjuntamente para exhibir el objeto en su totalidad. A menudo se corren simulaciones de la operación de un vehículo para probar su rendimiento. Los diseños de edificios también se crean con sistemas de gráficas de computadora. Los arquitectos diseñan iteractivamente los planos de pisos,' o plantas, disposiciones de puertas y ventanas y la constitución integral de un edificio. Trabajando a partir del despliegue visual del proyecto de un edificio, el diseñador eléctrico puede experimentar disposiciones de cableado, tomacorrientes de electicidad y sistemas de prevención de incendios. La utilizacion del espacio en la oficina o en la fábrica se planea utilizando paquetes de gráficas especialmente disenados.

Los modelos tridimencionales de edificios 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 paquetes de gráficas complejos, loa disenadores pueden realizar un 'recorrido' simulado a traves de la habitaciones o por los exteriores de edificios para apreciar mejor el efecto integral de un diseño en particular.

GRAFICAS, DIAGRAMAS Y MODELOS i

Varios programas de gráficas disponibles comercialmente estan diseñados especificamente para la generación de gráficas y diagramas. A menudo un programa de trazo de gráficas tendra la capacidad de generar una variedad de tipos de gráficas como diagramas de barras, gráficas lineales, gráficas superficiales o diagramas de pastel. Muchos programas pueden resumir datos en forma bidimencional O tridimencional. Las gráficas tridimencionales se usan comunmente para ilustrar múltiples relaciones, se emplean para ofrecer una presentación mas dramatica o 'mas atractiva de los datos.las gráficas administrativas, una de las áreas de aplicación que más rapido crece,hace uso amplio de despliegues visuales como medio de una rápida comunicación de las vastas cantidades de información que se compilan para gerentes .y otros individuos de la organización. Las gráficas y los diagramas se usan por lo general para resumir datos financieros, estadísticos, matemáticos, científicos o económicos y varias gráficas a menudo se combinan en una presentación.

Page 105: UNIDAD IZTAPALAPA 12>1

Estas gráficas se generan para informes de investigadores, informes administrativos, boletines de información para el consumidor y auxiliares visuales que se utilizan durante las presentaciones. Las técnicas de manejo de proyectos se sirven de diagramas de tiempo y proyectos de redes de tareas para programar y monitorear proy&ctos. Algunos sistemas de gráficas incluyen la capacidad paragenerar dispositivos de 35 nun. o transparencias ele*das a partir de las gráficas que exhiben en un monitor de video.

El compúrtamiento de los sistemas físicros a menudo se estudia construyendo gráficas y modelos. Cuando deben analizarse grandes cantidades de datos, una gráfica codificada en color, puede ayudar a los investigadores a entender la estructura de un sistema. Sin ayuda de estas gráficas, seria difícil para un investigador interpretar tablas de datos con millones de rengistros. En forma análoga los modelos generados por computadoras se utilizan para estudiar el comportamiento de los sistemcis.

Los modelos generados por computadora de sistemas físicos, financieros y económicos a menudo se usan como auxiliares educativos. Los modelos de sistemas fisiológicos, tendencias de la poblacion G equipo físico, pueden ayudar a los principiantes a entenüer la operación de un sistema.

Muchas aplicaciones de graficación de datos se ocupan de la graficación de algun tipo de informaci6n geográfica. Con frecuencia tales gráficas se usan para exhibir diferentes tipos de estadísticas regionales o globales, como la graficación de datos sobre ventas en varios distritos. Los programas diseñados para producir mapas climatológicos pueden tomar datos de estaciones de observacion individuales para originar gráficas. Se dispone de programas cartográficos para generar mapas dealgunas areas geográficas o del mundo entero. Algunos de estos mapas permite11 separar secciones para destacarlas. ,

Page 106: UNIDAD IZTAPALAPA 12>1

ARTE POR COMPUTADORAS

Las aplicaciones creativas y comerciales del arte hacen uso intenso de las gráficas de computadora. La exhibición abstracta de algunas figuras se crea graficando una serie de funciones matemáticas 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 podria hacer la pintura en una ‘tableta de gráficas’ usando un estilo como entrada. Los programas de pincel no se limitan a personajes de caricatura, sino que tambien se utilizan para producir otra clase de arte.

El arte creado por computadora se usa ampliamente en aplicaciones comerciales. Los logotipos y diseños publicitarios de TV ahora se producen comúnmente con sistemas de graficas. Además los programas de gráficas se han elaboradc, para aplicaciones de procesamiento de publicaciones y palabras, que permiten combinar operaciones de graficacióon y edicióon de textos.

ANIMACION POR COMPUTADORA

Cada figura se desplaza ligeramente de una estructura a la siguiente para simular movimiento. Esta técnica de construcción se usa asimismo en la creación de caricaturas y películas de ciencia-ficción. Cada forma se traza con un sistema de gráficas y se graba en pelicula, con ligeros cambios en las posiciones de los objetos de una construcción a la siguiente. Cuando las formas se exhiben en sucesion rápida, se tiene una secuencia de cine animado. Los métodos de animación también se aplican en la educación, capacitación y aplicaciones de investigación. Dichas simuiariones pueden emplearse para estudiar el comportamiento de sistemas físicos o bien como auxiliares en la enseñanza.

En algunas aplicaciones de capacitación, se diseñan sistemas especiales. Algunos ejemplos de sistemas especializados son los simuladores para capacitar capitanes de barco y pilotos de aviones. Un simulador para conducción de automóvil se emplea para investigar el comportamiento de los conductores en situaciones críticas. Las reacciones de los conductores se utilizan después como base de optimización del diseño del vehículos con el objeto de maximizar la seguridad en el tránsito.

Page 107: UNIDAD IZTAPALAPA 12>1

INTERFASES CON EL USUARIO DE GRAFICAS

Las opciones de entrada a muchos programas de computadora se diseñín como un conjunto de ikonos, simbolos gráficos que se parecen a la opción de procesamiento que deben representar. Los usuarios seleccionan opciones de procesamiento señalando el icono adecuado. La ventaja de estos sistemas es que los iconos pueden ocupar menos espacio en la pantalla que la descripcion textual correspondie?&e a las funciones y pueden entenderse mas rápidamente si estan bien diseñados.

En programas de procesamiento de palabras, el proceso de añadir un elemento a un archivo se representa por un dibujo de un gabinete de archivo, gaveta t¶e archivo o carpeta de archivo. La supresión de un archivo puede representarse con un icono de basura. Una señal de alto puede representar una operación de salida y un dibujo de una regla puede utilizarse para ajustar los margenes del texto. los iconos pueden ser Útiles en muchas aplicaciones.

GRAFICAS DE USO DOMESTICO

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áficas em una forma u otra. Algunoe sistemas despliegan gráficas en pantallas integradas, pero muchos estan diseñados para conectarse a un aparato de TV.

Con la creciente popularidad de las computadoras personales j / las capacidades de graficación cada vez mayores de estos sistemas, las aplicaciones de las gráficas en el hogar se han ido extendiendo constantemente. Las computadoras personales permiten al usuario doméstico generar gráficas financieras, de conteo de calorias o bien para crear diseños de targetas de saludo y papel y sobres de cartas fabricados.

VISTA TRIDIMENCIONAL

En dos dimenciones, las operaciones de visión transfieren puntos bidimencionales en el plano coordenado mundial a puntos bidimencionales en el plano de coordenadas positivo. Las definiciones de objetos, sujetados contra el marco de una ventana, se delinean en una puerta de visión.

Page 108: UNIDAD IZTAPALAPA 12>1

-- _I__--

-

Estas coordenadas de despositivo normalizadas se convierten después en coordenadas de dispositivo y el objeto se despliega en el dispositivo de salida. En tres dimenciones, la situación es un poco mas complicada, ya que ahora tenemos algunas al; ernativas como la forma en que se van a generar las vistas. Podríamos visualizar una escena desde el frente, desde arriba o bien desde atras. También podriamos generar una vista de lo que observariamos si estuvieramos parados en medio de un grupo de objetos. Además, las descripciones tridimencionales de los objetos deben proyectarse en la superficie de visión plana del dispositivo de salida.

PROYECCIONES

Existen métodos básicos para proyectar objetos tridimencionaies sobre una superficie de visión bidimencional. Todos los puntos del objeto pueden proyectarse a lo largo de lineas paralelas o bien los puntos pueden proyectarse a lo largo de lineas que convergen '.iscia una posición denominade I centro de proyección'. LDS metodos, llamados proyeccih en paralelo y proyección en perspectiva, se muestran en la figura

En ambos casos, la intersección de una línea de proyección con la superficie de visión determina las coordenadas del punto proyectado sobreese plano de proyección.

Una proy-.cciÓn en paralelo presena dimenciones relativas de los objetos y esta es la técnica que se utiliza en el dibujo mecánico para producir ccazos a escala de objetos de tres dimenciones.

Page 109: UNIDAD IZTAPALAPA 12>1

Este método sirve para obtener vistas exactas de los varios lados de un objeto, pero una proyección en paralelo no ofrece una representacion realista del aspecto de un objeto tridimencional. En cambio, una proyección en perspectiva produce vistas realistas pero no preserva las dimenciones relativas. Las lineas distantes se proyectan como menores que aquellas que estan mas próximas al plano de proyección.

TRANSFORMACION DE LA VI$ION

La generación de una vista de un objeto en tres dimenciones es anaáoga al fotografiado de un objeto. Podemos caminar en torno al objeto y tomar su fotografía desde cualquier ángulo, desde diversas diEtancias y con diversas orientaciones de la c&nara. Lo que sea que aparezca en el lente de enfoque se proyecta sobre la superficie plana de la película. El tipo de lente de la camara que se utilice determina que parte del objeto o escena aparecera en la fotografía final. E3tas ideas se incorporan en un paquetede gráficas. Se pide al usuario que especifique un punto desde el cual sepueda observar el objeto y que indique la cantidad de la escena que se incluira en el despliegue final.

SUPRECION DE SUPERFICIES OCULTAS

Una consideración importante en la escenas realistas es la identificación y s sien de las partes de la imagen definida que no son vi 8 desde una posición de observación seleccionada. Existen muchos métodos que podemos utilizar para resolver este tipo de problema y se han creado numerosos algoritmos para eliminar las partes ocultas de escenas en forma eficaz en diferentes tipos de aplicaciones. Algunos métodos requieren mas memoria, en algunos interviene mas tiempo de procesamiento y algunos sólo se aplican a tipos especiales de objetos. El método elegido para una aplicación determinada depende de factores tales como disposición y si se van ,agenerar despliegues animados o bien estáticos. -

Page 110: UNIDAD IZTAPALAPA 12>1

CLASIFICACION DE ALG0RZlt”MOS

Los algoritmos de lineas y superficies ocultas a menudo se clasifican segun que se refieren ,a definiciones de objetos en forma directa o bien con sus imagenes proyectadas. Estos dos métodos se denominan metodos de objeto-espacio Y métodos de imagen-espacio, respectivamente. El primer método compara objetos y partes de objetos unos con otros para determinar que superficies y lineas, como un todo, deben de rotularse como invisibles. En un algoritmo de imagen-espacio, la visibilidad se decide punto por punto en cada posición de pixel sobre el plano de proyección. Muchos algoritmos de superficie oculta aplican métodos de imagen-espacio, pero los métodos de objeto- espacio pueden usarse en forma eficaz en algunos casos. Los algoritmos de linea oculta por lo general emplean métodos de objeto-espacio, aunque muchos algoritmos de superficie oculta de imagen-espacio pueden adaptarse fácilmente a la supresión de lineas ocultas.

Aunque existen diferencias importantes en el método básico abordado por los diversos algoritmos qle superficie y linea oculta, muchos de ellos emplean métodos de ordenamiento y coherencia para mejorar el rendimiento. El ordenamiento se utiliza para facilitar las comparación de profundidad mediante el ordenamiento de las lineas, superficies y objetos individuales de una escena de acuerdo con su distzncia desde el plano de visión. Los métodos de coherencia se úsan para aprovechar las regularidades de una escena. Puede esperarse que una linea de rastreo individual contenga intervalos ( corridas ) de intensiaades de pixel constantes y l os modelos de las lineas de rastreo .a menudo cambian poco de una linea a la siguiente. Los marcos o cuadros de animación contienen variaciones solamente en la vecindad de los objetos en movimiento. Y a menudo pueden establecerse relaciones constantes entre objetos y superficies de una escena.

Ejemplos de métodos para suprecion de superficies ocultas son los siguientes:

- Método del buffer con profundidad. - Método de la linea de rastreo. - Método de ordenamiento con profundidad, - Método de subdivision de areas. - Métodos del arbol octal.

Page 111: UNIDAD IZTAPALAPA 12>1

COMPARACION DE METODOS DE SUPERFICIE OCULTA

La eficiencia de un metodo de superficie oculta depende de las caracteristicas de una aplicación determinada. Si las superficies de una escena se diseminan en la dirección Z de manera que haya muy poca superpoeición en la profundidad, quiza sea mejor un método de osdenamiento por profundidad. Para escenas con superficies bien separadas en forma horizontal, un método de linea de rastreo o de subdivision de areas prodria ser la mejor opcién. En esta forma pueden elegirse métodos que utilizan técnicas de ordenamiento y coherencia para aprovechar las propiedades naturales de una escena.

Debido a que las consideraciones de ordenamiento y coherencia son importantes para la eficiencia total de un método de superficie oculta, las técnicas para efectuar estas operacicwies deben elegirse cuidadosamente.Siempre que se sepa que los objetos estan en el orden aproximado, como una lista de una tabla de aristas activa que se utiliza en el método de la linea de rastreo, puede emplearse una técnica de ordenamiento por burbuja en forma eficaz, para realizar los pocos intercambios que tie requieren. Análogamente,ias técnicas de coherencia aplicadas a lineas de rastreo, areas o cuadros pueden ser herramientas poderosas para incrementar la eficiencia de los métodos de superficie oculta.

Por lo general, el método de ordenamiento por profundidad es un método muy eficaz para escenas que tienen sólo unas cuantas superficies. Esto se debe atq hecho de que estas escenas por io general tienen pocas superficies que se superponen en la profundidad. El método de linea de rastreo tambien tiene resultados satistactodos cuando una escena contiene un numero pequeño de superficies. Puede aplicarse con buenos resultados el método de linea de rastreo o bien el de ordenamiento por profundidad en escenas con varios miles de caras. Con, escenas que contienen mag de unos cuantos de miles de superficies, el método del Luffer con profundidad o el m&Qdo del árbol octal logra mejores resultados. El metodo del buffer con profundidad tiene un tiempo de procesamiento casi constante, independiente del número de superficies de una escena. Esto se debe a que el tamaño de las areas superficiales disminuye a medida que aumenta el numero de superficies de la escena. Por lo tanto, el método de buffer con profundidad da un rendimiento relativamente bajo con escenas simples y un rendimiento relativamente alto con escenas complejas. Este método es fácil de implantar, pero requiere mas memoria que muchos métodos. Por esa razón podria referirse otro método, como los árboles octales o la subdivisión de áreas, para escenas con muchaiaa,superficies.

Page 112: UNIDAD IZTAPALAPA 12>1

Cuando utilizan representaciones de árbol octal en un sistema, el proceso de eliminación de la superficie oculta es rapido y simple. Sólo se usan sumas y restas de enteros en el proceso y no se necesitan hacer cálculos de ordenamiento o de intersección. Otra ventaja de los arboles octales es qua almacenan mas que superficies. Se dispone de toda la region sólida de un objeto para su despliegue, lo cual vuelve Útil la representación de árbol octal para obtener porciones seccional-transversales de sólidos.

Esa posible combinar e implantar los diversos métodos de superficie oculta en varias formas. Aden&, los algoritmos se implantan en hardware y se emplean sistemas especiales que hacen uso del procesamiento en'paralelo para incrementar la eficiencia de estos métodos. Los sistemas de hardware especiales se usan cuando la velocidad de procesamiento es una consideración de especia3. importancia, como la generación de vistas animadas de simuladores de vuelo.

#

Page 113: UNIDAD IZTAPALAPA 12>1

BIBLIOGRAFIA

1.-

2.-

3.-

4 . -

5.-

6.-

7.-

8.-

ALBERTO DURERO INSTITUCIONES DE GEOMETRIA ( ORIGINAL EN LATIN. PARIS 1535) UNIVERSIDAD NACIONAL AUTONOMA DE MEXICO MEXIC'J 1979.

J.-P. COLLET HISTORIA DE LAS MATEMATICAS. VOL I1 SIGLO XXI EDITORES MEXICO 1986.

F. PEREDO Y J.L. CORDOVA REWISTA CONTACTOS GRAPICACION DE CURVAS CON MICROCOMPUTADORA

E D U ~ O PIÑA AMERICAN JOURNAL OF PHYSICS VOL 51 P.375-379 A NEW PARAMETRIZATION OF THE ROTATION MATRIX.

EMILIC) FREIXES PARA APRENDER A DIBUJAR EDITORIAL AZAR MEXICO 1978.

P.M. MORSE Y H. FESHBACK METHODS OF THEORETICAL PHYSICS McGRAW HILL NEW YORK 1953.

DONALD HEARN, M. PAULINE BAKER

PRENTICE HALL MEXIC? 1988.

GRAFICAS POR COMPUTADORA

MARSDEB; TROMBA ANALISlS VECTORIAL