alumno ing. leonel hernandez palestino …148.206.53.84/tesiuami/uam5540.pdf · ... y el programa...

75
ALUMNO : MATRICULA : NOMBRE DEL PROYECTO: OBJETIVO: ASESOR : ,) j ( ; * ' ING. LEONEL HERNANDEZ PALESTINO 80214546 EDITOR DE GRAFICAS Diseñar una herramienta computacional, para l a creación interactiva de gráficas por computadora. (2 y 3D) Guillermo Levine

Upload: phamdiep

Post on 22-Sep-2018

215 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

ALUMNO :

MATRICULA :

NOMBRE DEL PROYECTO:

OBJETIVO:

ASESOR :

,) j ( ;* '

I N G . LEONEL HERNANDEZ PALESTINO

80214546

EDITOR DE GRAFICAS

D iseñar una he r ramien ta computac ional , pa ra l a c r e a c i ó n

i n t e r a c t i v a de g r á f i c a s p o r computadora. ( 2 y 3D)

G u i l l e r m o Lev ine

Page 2: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

INTRODUCCION

Este es un proyecto realizado en el lenguaje de programación C version 2.0. Realizado en la Universidad Autónoma Metropolitana de lztapalapa (durante 2 trimestres) y realiza funciones gráficas como:

Editor Grgfico Avanzado. Transformaciones Bidimensionales. Transformaciones Tridimensionales. Recupera y guarda gráficas en discos ( Diskettes). Utiierias de presentación y graficacibn.

Este editor realiza las funciones basicas de edicion gráfica, como son el trazado de lineas y arcos con las teclas del teclado numérico (Home, PgUp, PgDn, End, Flechas ), tiene funciones Fl..FlO donde se eligen diferentes opciones como guardar imagen en disco, recuperar otra imagen antes diseñada, puede cambiar tipo de letra de escritura (AnAlogo al Windows o al Chi-Writer), traza figuras geométricas en 2 dimensiones pudiendo trasladarla, rotarla, escalarla; puede trazar paralelépipedos, esferas, y funciones tridimensionales, además tiene utilerias básicas para trazar lineas, arcos, rellenar areas, elipses y otras funciones que hacen de este editor un sistema especial para graficar todo lo que se pueda hacer en toda la pantalla.

PARTE TEORICA

El diseño de un editor gráfico consiste en realizar funciones basadas en puntos gráficos (en el argot computacional se llaman pixeles) y en líneas todas ellas coordinadas por medio de un ciclo continuo que siempre esta esperando que el usuario teclee una tecla grafica Llamaremos tecla gráfica a las flechas o Home, PgUp, Ins, etc..) o que el usuario teclee una función en especial.

SOTWARE DE GRAFICAS

Se pueden programar utilizando lenguajes de alto nivel, como Basic, Fortran, Turbo Pascal y ahora tambien en lenguaje C. Existen tambien en el mercado computacional diferentes paquetes para grafcación.( Paquetes de CAD, Diseño asistido por computadora )

REPRESENTACION DE COORDENADAS

Existen diferentes formas de representar las Coordenadas de un sistema gráfico, por lo general e( usuario, puede definirlas, y el programa las estandariza segun sus coordenadas

NORMALIZADAS

En un sistema interactivo es necesario definir las coordenadas, por medio del programa, asi el programa y el usuario evitan contratiempos, las coordenadas que usa el sistema gráfico son las coordenadas que tiene la alta resolución de CGA, os8a de 640 x 200 pixeles.

3

Page 3: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

FUNCIONES GRAFICAS

Un paquete de gráficas de uso general ofrece a los usuarios una variedad de funciones, para crear y manipular imágenes. Estas rutinas se pueden categoriiar en:

SALIDA ENTRADA ATRlBUTOS o PARAMETROS TRANSFORMACIONES VISUAL IZA CION CONTROL GENERAL

PRIMITIVAS DE SALIDA

La estructura básica de todas las imágenes, son las primitias de salida, que en esencia son de dos tipos:

CADENAS DE CARACTERES ENTIDADES GEOMETRICAS

Dentro de las entidades geom&ricas existen

PUNTO LINEA ARCO CIRCULO ELIPSE POLIGONOS

Todas ellas tienen ATRIBUTOS, que son las caracteristicas o las propiedades que pueden ser el color, estilo, ancho, radio, número de vertices, por citar algunos.

PUNTOS (PIXELS) Y LINEAS

La unidad básica de uns sistema gráfico, es el punto,o el pixel( Como se le conoce en argot computacionaí), su representacion en pantalla es un punto luminoso y su tama?m depende del grado de resolución que se este manejando, una extension lógica, es la linea recta, que en esencia es un conjunto de puntos o de pkeles continuos dirigidos en una dirección dada por la pendiente de la línea, en teoria de gráficas existen 2 algoritmos famosos para trazar líneas

ALGORITMO DDA ALGORITMO ERESENHAM

Para los 2 se reciben los valores de entrada, puntos inicial y terminal, y el algoritmo calculan los puntos sucesivos por medio de ingeniosos cálculos, se da un listado del algoritmo Bresenham

4

Page 4: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

#include <doe.h> #include <stdio.h>

~iXEL(x,y,color) /* Imprime un punto en la columna x, renglon y * / int x,y,color; /* utiliza interrupcion Ox10 * /

union REGS inr,outr;

inr. h. ah=12; inr.h.al=color; inr . x . cx=x; inr.x.dx=y; int86(OxlO,Linr,Loutr);

1

ALTA-RESOLUCION() /* Define resoiucion de 640 x 200 para un * /

{

/ * adaptador CGA * /

union REGS in; union REGS out;

in.h.ah=O; in.h.al=ó; int86(0xlC,&in,&out); in.h.ah=ll; in. h. bh=l; in.h.bl=l; int86(OxlO,bin,&out);

1

TERMINA - GRAFIcA() /* Regresa al modo normal Texto 80 x 25 */ { union REGS in,out;

in.h.ah=O; in.h.al=í; int86(0xlO,hin,&out);

1

int SIGNO(X1,XZ) /* Devuelve el incremento que tendra la linea */ int X1,xZ; /* segun la pendiente * / { if(Xl>x2){return(l);} /* Debe ser ascendente la linea * / else if(~i==~2){return(O);} / * LOS puntos estan al mismo nivel */ else return(-1); /* Descendente * /

5

Page 5: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/* AlgOritaK, de Bresenham traza lineas de cualquier puntol con cualquier pendiente que tenga. * / BRESENIUX(Xll~l,X2,~21CO10~) int xl,yl,x2,y2,color; { int Dx,~y, / * intervalos en x y Y +/ incX,incY, /* incrementos en X y Y * / incl,inc2, /* Incrementos segun el algoritmo * / Dl /* Diferencia del siguiente pixel a imprimirse * / XIY, /* Coordenadas del punto actyal * / XEnd,Y€nd; /* Coordenadas de fin de linea * /

Dx=abS(XZ-Xl); Dy=abS(y2-y1); if(Dx >=Dy) /* Pendiente entre -1 y 1 * /

{ D-Z*Dy-DX; incl=2*Dy; incZ=Z*(Dy-Dx); if(xl>x2){

X=x2;Y=y2;XEnd=xl;incY=SIGNO(ylly2); 1

else { X=xl;Y=yl;XEnd=x2;incY=SiGNO(y2,yl);

1 PiXEL(X,~,color); while(x < XEnd)

{ X++; if (=O) {

1 else {

D=D+inc 1 ;

Y=Y+incY; D=D+inc2 ;

1 PIXEL(x,~,color);

} /* while * / } /* if Dx >= Dy * /

else { /* Pendiente mayor a uno * /

iXl=2*DX;

if(Yl>Y2 1

D=Z*Dx-Dy;

inc2==2* (Dx-Dy) ;

x-x2 ; y-2 ; YEnd=y 1 ; incX=SIGNO(x2,xl);

6

Page 6: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

1 else {

X=xl; Y T l ; YEnd=y2 ; incX=SIGNO(xl,x2);

1 ~1XEL(X,~,color); whiie(Y YEnd)

{ Y++; i f ( i % O ) ( D=D+incl;} else { x=x+incx; D==D+inc2;} ~Ix~L(X,~,color);

} /* while * /

} / * Fin de Bresenham * / } / * else Pendiente mayor a uno * /

DIBUJA-LINEAS ( ) í int i; int xc,yc, x, y, r, ang; char apc;

BRESEBEIAM(10,10,629,10,3); BRF.SEXW( 629,10,62 9,189,3) ; BRESEáIEIAM( 629,189,10,189,3) ; BRESEaFBAn(10,189,10,10,3) ; scanf('%cn,&opc); i-50; while(i<=6 O0 )

{ BRESENHAM(i,l50,650-i,50,3); i+=l O ;

1 scanf('%cn,bopc); i=50; while 4 í<=6 O O )

{ BFfESENHAM( i, 150,65 O-i ,50 , O ) ; itrl0;

1 scanf("%c",&opc); BRESElHAM(320,100,640,100,3): BF¿ESE%ñAM ( 32 O, 1 O O, 6 4 O, 1,3 ) ; BRES~HAn(320,100,320,1,3); BRESEZEIAM( 320,100,1,1,3 ) ; BFtES5li.W ( 32 O, 1 O O, 1,100,3 ) ; BRESEa~A~(320,100,1,200,3); BRESI318An(320,100,320,200,3);

7

Page 7: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

BRESENBAH(320,100,640,200,3); ecanf(’%cn,&opc); xc=320;yc=100;ang=0;r=50; while(ang <=360){

x=xc+r*((int)cos(ang*O.O1745)); y=yc+r*((int)ain(ang*0.01745)); BRESE”AM(xc,yc,x,y,3); ang++;

1 1

PARA APUCACIONES INTERACTIVAS DE GdFlCAS

Cuando el usuario es el encargado de dirigir el sistema gráfico, se debe contar con un dispositiw de entrada de datos, como:

TECLADO PLUMAS LUMINOSAS MOUSE

También se debera contar con un editor gráfico y una sene de menÚs que lo guien durante su sesión, los dispositivos de salida,seran por lo general

MONITOR GñAFlCADOR IMPRESOR4 BRAZO ELECTRONIC0 CON LASER

es obvio que las operaciones de entrada, se emplean para controlar y procesar los datos que vienen de los dispositivos de entrada. Un paquete de gráficas debera contar con rutinas de mantenimhto, como borrado de la pantalla, guardar y recuperar imagenes, tambien exiSten operaciones de control que son las que dirigen el programa, las teclas de funcion (Fl..FlO) pueden servir para controlar el sistema interactivamente.

ASPECTO6 TECNICOS

Existen diferentes tipos de hardware gráfico, por lo que hay que buscar lo más estandar en el mercado, las PCs en general tienen un adaptador gráfico, llamdo CGA (Conocido tambien como la tarjeta gráfica Color Graphics dispaiy Adapter). Para este tipo se tienen dos tipos de resolución para modo gráfico, el de alta resolución tiene 640 x 200 pixeles con dos colores posibles,pacticamente es solo uno por que uno es el fondo, el atro mod0 es el 320 x 200 pixeles eneste se tienen 4 paletas de colores diferentes, solo se puede usar una,cada una tiene tres colores, pero tambien solo es distinguen 2 colores por que uno es el color de fondo.

El modo gráfico accesa una zona de la memoria de la computadora y el programa puede acteSar a esa zona con ayuda de un programa que maneje interrupciones, como la lOh, o que el kmguaje tenga un kernel (Núcleo) gráfico, o tambien libreria, para el Turbo C 2.0 se debe inclür la libreria graphics.h

8

Page 8: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

TRANSFORMACIONES BIDIMENSIONALES

Existen basicamente 3 funciones de transformación, rotación, escalación y traslación de objetos en dos dimensiones, la extensión se aplica a tres dimensiones. Solo se transformaran los puntos que definen a la figura, en este caso los vertices de los poligonos son los que definen una figura estos se guardaran en dos arreglos x, y.

TRAS LAC ION

Se traslada cada vertice o punto de la figura p(x,y) a otro punto nuevo, agregando DISTANCIAS DE TFiASIAClON b y ty.

x '=x+b y'=y+tY

Siendo (Rty) el vector de traslación, o vector de cambio.

ESCALACION

Este puede modificar el tamaño del objeto, se piden los factores de escalación sx y sy para producir (x',~').

x'=x*sx y'=y*sy

El proceso se simplifica tomando un punto de referencia, como (xf,yf), el algoritmo puede calcular el punto medio del polígono, y asignarle estos valores.

x'.=xf + (x- @*sx y'+ +(y-yf)*sy

ROTACION

Esta transformación cambia los puntos de un objeto situados en trayectorias circulares. Se determina el angulo de rotacion 8, tambien se debe tener un punto pivote donde gire el objeto puede ser el punto medio, un vertice un punto externo, se le denotara (xr, yr)

x' =xr + (x - xr)*cos(O) - (y - yr )*sen@) y '=yr + (y - yr)*cos(e) + (x - xr)*sen(O)

Todas estas transformaciones se pueden realizar punto por punto,pero existe una forma más eficiente de lograrlo.

REPRESENTACION MATRlClAL

Se requiere una matriz (3 x3) para hacer las multiplicaciones de matrices, por vectores de (1 ..3)

9

Page 9: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

TñASLAClON

ESCALACION

ROTACION

/* ZONA DE TRANSFORMACIONES BIDIMENSIONALEC * /

/* MENU Bidimensional * /

void bidirno { struct viewporttype vp; int ax,ay,bx,by; int op, k; float sx, sy, tempx; char *s=NULL;

/* Empieza * / Msg(" Cuantos vertices... " ) ;

do{ lee - cadena(c,l); }while( (n=atoi(s))==O); marca-vertices(n); do { getviewsettings(&vp); ax=vp.left; ay=vp.top; bx=vp.right;by=vp.bottom; / * Guarda la zona actual * / Msg(* [l]ESCda [2]Rota [3]Traslada [I]Calir]:"); lee - cadena(s,3); op=atoi ( s ) ; switch (op) { case 1: escala( ) ; break; case 2 : rotation( ) ; break;

.

70

Page 10: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

,

case 3: traslada(); break; default: Titulo(" TURBO EDITOR GRAFICO " ) ;

1 Activa-Ventana(); setviewport(ax,ay,bx,by,l);/* Restura posicion actual * / if(ni=O) /* Existe figura borrarla * /

{ setcolor(getcolor0-1); di bu j a ( n ) ; setcolor(getcolor()+l); 1

for(k=O;k<n;k++) /* Transforma * /

tempx = (x[k1*m[ol[o1)+(y[k]*m[l1[01)+m[21[01; ~ [ k l = (xikl*m[Ol [ ~ l ~ + < ~ ~ k l * m [ ~ l ~ ~ l ) + m ( Z ~ [I]; x[k] = tempx; 1

dibuja(n); }while(opi=l); 1

/* Dibuja: Un poligono en dos dimensiones con los puntos dados * / void dibuja(int 1) { int k=O;

for(k=O;k<l-l;k++){

1ine((int)x[1-1],(int)y[1-l],(int)x[0],(int)y[0]): Return( ) ;

line((int)x[k),(int)y[k],(int)x[k+l],(int)y[k+l]);}

1

void inicial ( ) {int r , c ; /* Inicializa matriz m * / for(r=ü;r<3;r++)

for(c=O;c<i;c++){ if(r==c){ m[r][c]=l.O;) else { m[r][c]=O.O;)} m[o][o]=i.O;/* Para asegurar esta asignacion * /

1

/* Marca los vertices del poligono a transformarse * / void marca-vertices(int n) { int i; /* Marca vertices * / char * s = N U U ; char *buff=NEL;

11

Page 11: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

eprintf(buff," Dar coordenadas [x,y] ** $d puntos **",n); Msg(buff); for (i=O; i< n; ++i)

sprintf(buff," x[ %d ] =",i+l); Msg(buff); lee - cadena(s,l); x[i]=atof(s); sprintf(buff," y[ %d ] =",i+l); Msg(buff); .

lee-cadena ( s , 1 ) ; y[i]=atof(s);

1 Msg("Figura creada " ) ;

dibuja(n); 1

/ * Procedimiento que escala poligonos * / void escala( )

{ float sx,sy,templ,temp2; char *s=NULL; int xr,yr,i;

inicial(); Hsg("Fact0r de escalamiento sx: " ) ;

lee cadena ( s , 1 ) ; sx=atof ( e ) ; Msg("Pact0r de escalamiento sy: " ) ;

lee - cadena(s,l); sy=atof(s); / * Determina el punto medio de la figura * / templ=O;temp2=0; for ( i=O; i<n; ++i)

tempi +=x[i]; temp2 +=y [ i ] ;

-

1 xr=(int) templ/n; yr=(int) temp2/n;

m[O][O]=sx;m[l][l]=sy; m[2][0]=(1.0-sx)*xr; m[2][i]=(l.O-sy)*yr;

1

/* Procedimiento que rota el poligono * / void rotation() { float a,ea,ca,templ,temp2;

12

Page 12: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

int xr,yr,i; char *a=NUU;

inicial(): Hsg("Dar Angulo: " ) ; lee cadena ( 6 , 1 ) ; a=atof(s); /* Determina el punto medio de la figura */ templ=O;temp2=0; for (i=O; i<n; ++i)

temp1 +=x[i]; temp2 +=y[i];

1 xr=(int) templ/n; yr=(int) temp2/n;

-

a=(double)(a*P1)/180.0; ca=cos(a); sa=ain(a); m[O][O]=ca; m[O][l]=sa; m[l][O]=-sa;rn[l][l]=ca; m[2][0]=((double)(xr))*(l.O-ca)+((double)(yr))*sa; m[2)[1]=((double)(yr))*(l.O-ca)-((double)(~))*sa;

}

/* Procedimiento que traslada el poligono marcado */ void traslada()

int dx , dy; char *s=NULL; inicial ( ) ; Msg("Tras1ada T x . . " ) ;

lee - cadena(s,l); dx=atoi(s); Hsg("..Ty " ) ;

lee - cadena(6,l); dy=atoi(s); m[2J[O]=(double)dx;m[2][l]=(double)dy:

1

13

Page 13: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

DISEÑO DEL EDITOR

En esencia el editor es el núcleo del sistema, este es un ciclo continuo que esta esperando que el usuario, teclee una letra,un tecla gráfica, una tecla función respectivamente el sistema, pondra el caracter en pantalla, avanzara a donde se le indico o ejecutara el módulo señalado.

El algoritmo esencial de un editor

Inicializa ( ) Pon-cursor() do { lee-tecla() Borra-Cursor() if( Tecla= funcion) ( Ejecuta-Funciono )

else ( escribe(x,y,caracter)) Pon-cursor() }while( tecla= ECC )

Uno de los puntos claves es la creación de un cursor, este es un indicador que muestra donde se encuentra el programa, y donde aparezera la proxima salida del monitor. El cursor esta hecho tambien de pixeles, el del sistema tiene un tamaño de 3 x 3.0tro aspectos importantes es la correcta inicialización de los parametros del editor, como son la distancia que avanza cada trazo. El radio de los arcos que se trazan de forma automática, el cambio de los atributos de las líneas que seran el tipo de línea, el ancho, tambien el tipo de letra que esta usando.

/* Rutina Edicion Grafica * / void Edita() { static int a,b; /* Para el trazo de arcos */ int paso=i,radio=lO; /* Distancia y radio de trazado * / int angider,angfder,angiizq,angfizq; /* Variables para los angulos izq

struct arccoordstype arcinfo; /* Estructura para mover el cursor

int k,x,y,i; /* Variables auxiliares para el editor Grafico * / int modo,color; int tip lin,áncho; char buffer [ 2 ] ; char *s=NULL; struct viewporttype viewinfo;

y Der*/

grafico */

/ * Inicializa variables para el editor * / buffer[l]=*\O'; Haz cursor(); - getviewsettings(&viewinfo); angiizp0; /* Inicio de angulos para el trazo de arcos * / angider=ló 5 ; zona-aux=malloc(imagesize(O,O,149,149));

14

Page 14: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

Tipo-Letra(0,BORIZ - DIR,l);i=O;/* Modo normal de escritura * / Menu - Multiple(3,20,20,180,150,&i); x=getmaxx()/2;y=getmaxy()/2; moveto(x,y); Pon-Cursor(x,y); / * Pon cursor en origen * /

/* ciclo continuo * / do { k=getch(); / * Leer tecla normal o Funcion * / if(ESc==k) { / * Usuari abandona eeeion * / Msg("*** Guarda Imagen Actual Teclee[l]***"); if(getch()=='l') salva - Img(); clearviewport();exit(l); break; }

if (k==O) { k=getch();/* Teclas Fl..PlO o <Flechas> o HOME,PgUp,.. * / Borra - Cursor(getx(),gety()):

' if( k!='R') { angiizq=O; } /* Incializa continuamente * / if( k!='s') { angider=165;} /* angulos para los arcos * / ewitch(k) {

/* Teclas Gráficas para el trazo de lineas y arcos utiliza las flechas,Home,End,PgUp,PgDn,Ins,Deiete * /

case 'H':if(gety()+paso > viewinfo.top) (linerel(0,-paso);} break: /* Trazo Arriba * /

case *P':if(gety()+paso < viewinfo.bottom) {linerel(O,paso);} break; /* Trazo Abajo v * /

case *K':if(getx()-paso > viewinfo.left) {linerel(-paso,O);} break; /* Trazo Izq < * /

case "':if(getx()+paso < viewinfo.right) {linerel(paso,O);} break; /* Trazo Der > * /

case eGg:if(gety()-paso > viewinfo.top C h

getxo-paso > viewinfo.left )

{linerel(-paso,-paso):} break; /* Trazo Diag Home*/

. case 'I':if(gety()-paso > viewinfo.top L C

getx()+paso < viewinfo.right) {linerel(paso,-paso);}

pgup* / break; / * * e * * @ * * * *

Page 15: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

case s~g:if(getx~)-paso > viewinfo.left L L

gety()+paso < viewinfo.bottom) {linerel(-paso,paso);} break; /* e * * * * * * * * End * /

case *~*:if(getx()+paso < viewinfo.right & &

getyo+paso < viewinfo.bottom) {linerel(paso,paso);} break; / * w * ( a * * * * * PgDn* /

/* Traza un arco a la izq de 15 grados c/vez con un radio=paso, paso es la magnitud del trazo actual * / case 'R': if(angiizq==O){

a=getx()-radio; b=gety( 1 ; angfizq=45;} arc(a,b,angiizq,angfizq,radio); if(angfizq==360){ angfizq=O;} angiizq=angfizq; angfizq =angiizq+l5;break;

/* Traza arcos a la Der. malogo al anterior * / case 'S':if(angider==165){

a=getx()+radio;

angfder=l80;} arc(a,b,angider,angfder,radio); if(angfder==lS){ angfder=375; } / * =360+15 * / if(angider==O) { angider=330; } / * =315+15 * / angider =angider-15; angfder =angfder-15; break;

b=gety ( 1 ;

/* ZONA DE TECLAS DE FüNCION [FI..FlO] * /

/ * F1 * / case ';':x=getx();y=gety();i=O; Menu - Multiple (3,20,20,180,150, i) ; moveto(x,y); break;

/* F2 * / case ' c ' : Msg("*** Guarda Imagen Actual Teclee(l]***"); if(getch()=='l') Salva-Img ( ) ; clearviewport ( ) ; Titulo(" Editor Grafico U.A.M.1 ");i=O; Menu - Multiple(3,20,20,180,15O,i); Msg(" [ P1 ] Menu de Funciones"); moveto(getmaxx()/2,getmaxy()/2);

16

Page 16: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

break;

/ * 1 3 * / case *=':/x=getx();y=gety(); Titulo(" Mundo Tridimensional"); tridim( ) ; moveto(x,y); break;

/* F4 * / case '>':x=getx(); y=gety(); Titulo(" nundo Bidimensioanl"); bidim( ) ; moveto(x,y); break;

/ * F5 */ case *?*:X=getX();y=gety(); Hsg(" Efectos Especiales " ) ; Efectos(x,y); moveto(x,y); break;

/ * F6 */ case *@':x=getx();y=gety(); Msg(" Recupera Imagen de diskette"); Recupera-Img(); moveto(x,y); break;

/* F7 */ case 'A':x=getx();y=gety(); Hsg(" Guarda Imagen en diskette"); salva - Img(); moveto(x,y); break;

/ * F8 */ case OB*: /* cambia Color de trazo * / if(getcolor()==O) (setcolor(WH1TE);) else setcolor(BLACK); break; /* Pen Up / Pen Dn * /

/ * F9 * / case 'c*:x=getx();y=gety(); color=getcolor(); Msg("Tip0s [l]NOrmal [2]Triplex [3]Atornica [Qlsans Serif [5]Gotica [opcion ? : I " ) ;

leecadena(s,3); modo=atoi(s); cambia - tipo(modo); moveto(x,y); setcolor(co1or); break;

17

Page 17: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/ * PlO * / case ‘D’:x=getx();y=gety(); Msg(” Modifica Parametroe del editor”); Menu - Muitipie(5,20,20,150,14O,&i); switch(i){ case l:Msg(”Distancia de trazo ...[ l..20]”);

lee - cadena(a,l); paso=atoi ( s ) ; if(paswO)paeo=7; if(paso>20)paso=20; break;

lee - cadena ( B , 1 ) ; radio=atoi(e); if(radio<O)radio=lO; if(radio>20)radio=20; break;

Msg(”Dar Tip0 de linea [Olsolida [l]Punteada [2]Centrada[3]RayadaW); lee - cadena(a,l); tip-iin=atoi(a); Msg(”Dar ancho de la linea [OINormai [3]Triplen); lee - cadena(s,l); ancho=atoi(s); if( ancho 1=0 L& ancho !=3)

setlinestyle(tip-lin,O,ancho); break;

case Z:Msg(”Radio de arco ...[ l..20]”);

case 3:

anc ho=O ;

1 moveto ( x, y ) ; default : ;

1

if ( k== R ‘ I I k==’s’) { /* Trazo un arco, ir al principio o fin del arco * /

getarccoords(&arcinfo); if(k==’R’)

else moveto(arcinfo.xend,arcinfo.yend);

moveto(arcinfo.xstart,arcinfo.ystart); 1 Pon-Cursor(getx(),gety());

1 / * if k==O ‘then Tecla - Funcion * / else(

/ * Editor de Texto-Grafico * / Borra-Cursor(getx(),gety()); settextjustify(LEFT-TEXT,CENTER-TEXT); buffer[ O]=k;

78

Page 18: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

if(k==l3)/* return * / { if( gety()c viewinfo.bottom) moveto(viewinfo.left+textwidth("W"),gety()+te~theight(~H~)+2);

1 if(textwidth("W")+getx() > viewinfo.right) /* salto de linea * / { if( getyo< viewinfo.bottom) moveto(viewinfo.left+textwidth(nWw),gety()+textheight(n~~)+2);

1 if(k-8) / * Utiliza el Bksp para marcar */

{ tempx=getx(); tempy=gety(); / * Marca zona rectangular * / ox=getx( ) ; oy=gety(); /* Nuevo origen Tridimensional * / 1

if(k i=13 6 6 ki=8) outtext(buffer);

Pon - Cursor(getx(),gety()); 1

}while(l); / * Ciclo continuo * / /* Sale con FlO=ESC 'D' * / 1 /* Fin d e l editor grafico * /

void Borra - Cursor(int oldx,int oldy) { /* Pone la imagen que estaba antes de poner el cursor * /

1 putimage(oldx,oldy,save - image,COPY'PüT);

void Pon-Cursor(int x,int y) { /* Pone el cursor antes... */ getimage(x,y,x+3,y+3,save-image); /*guarda la imagen que va ocupar * / putimage(x,y,cursor,COPY*PUT); /* pone el cursor en esa zona * /

1

/ * crea una vez la imagen del cursor guardandola en cursor * / void Haz-Cursor() { int i;

save~~ge=malloc(imagesize(O,O,2,2));/* Guarda la zona ocupada por el

cursox =malloc(imagesize(O,0,2,2));/* Cursor tipo flecha 3x3 pixels * / setbkcolor(0); / * Hacemos el cursor con pixeles y... * / putpixei(O,O,WHITE); putpixel ( 1,1, WHITE) ; putpixel(O,l,WHITE); for(i=O;ic3;++i) pUtpixel(i,2,WHITE);

cursor*/ *

19

Page 19: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

getirnage(OI0,2,2,cursor); /* guardamos la imagen * / clearviewport ( ) ; aetcolor(WH1TE); / * Borra escena y restaura color * /

1

void Editor(void) { /* Editor Grafico U.A.M.1 Dieenado por A.C.C. * /

Ventana(' TURBO Editor Grafico u.A.M.I."); Msg(" Hov.Cursor Flechas(Tec1ado Numerico).ESC salir"); Edita();/* Edita es el nucleo del editor grafico * /

1

20

Page 20: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

DISEÑO DEL MENU

En un ambiente interactivo los menÚs y los procedimiertos de captura de datos son vitales para el perfecto desarrollo, y deberan ser de excelente presentación y validados en exceso, porque son kx que Wan contacto directo con el us& y pueden provocar fallas, cuando aparece un menú sobre la pantalla, se debe guardar la zona en buffer temporal, un pseudocodigo para esto seria:

menu( ) { Tomamedidas-zona() Reserva-Espacio() Guarda Zona() Poner-Menu() Esperar-option() Borra-Menu() Regresa-Imageno Libera-Espacio()

-

1

La zona de captura de datos es similar, pero tiene la diferencia que regresa una cadena de caracteres para despues transformarla al valor deseado.

/* Menu de opciones general para todos los procedkientos Parametros: modo> Tipo de menu a mostrar(Menu G r a i , Tridh,Bidim)

posx> posicion inicial en x posy> posicion inicial en y tamx> tamano del menu en x tamy> tamano del menu en y *op > Regresa la opcion seleccionada */

Menu - Hultiple(int modo,int posx,int posy,int tamx,int tamy,int fop) {int h,ax,ay,bx,by,color; struct viewporttype vp; char *msgl,*msg2,*msg3,*msg4,*msg5, *msg6,*msg7,*msg8,*msg9,*msglO,*msgll,*msgl2; char *s=NULL;

zona - temp=malloc(imagesize(O,O,tamx,tamy)); getviewsettings(ávp); ax=vp.left; ay=vp.top; bx=vp.right;by=vp.bottom; Activa Ventana ( ) ; getimage(posx,posy,posx+tamx,posy+tamy,zona-temp): setviewport(posx,posy,posx+tamx,poay+tamy,l); setfillstyie(SOL1D - FILL,WHITE); b a r ( 2 , 2 , g e t m a x x ( ) - 2 , g e t m a x y ( ) - 2 ) ; Marco( ) ;

h=teXtheight ( "H")+3;

-

Tip0 Letra(SMALL - FONT,BORIZ - DIR,4);

27

Page 21: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

color=getcolor(); setcolor(BLACK); settextjustify(LEFT - TEXT,TOP - TEXT); switch(modo){ case l:/* Menu uno * /

mcgl="Gráficas F(x,y,z)"; mcg2= "1 x-2/a-2-y^2/b-2=z/cU; msg3= "2 x-2/a-2+y-2/b-2=z/cn; msg4= "3 y-2/a-2-x-2/b-2=czU; msg5= "4 z=senx"; msg6- " 5 z=seny"; msg7= "6 z=cosx"; mcg8= "7 z=cosy"; mcg9= "8 z=tanx"; msgl0="9 z=tany-; msg11-"10 z=cte"; mSgl2=" OPCION:"; break;

mcgl="Gráficas ~(x,y,z)"; msg2="l ~-2/a-2-y'2/b-2=~-2/~-2~; msg3="2 x-2/a-2+y'2/b-2+z-2/c-2=ln; msg4="3 x-2/a-2+y'2/b-2-z-2/c-2=ln; mcg5="4 x-2+y-2+z^Z=r-Z"; ms 96 =I ; mcg7=""; ms g 8="" ; me 59 =I ; me g 1 O=" ; msgll=""; msgl2=" OPCION:"; break;

case 3: mSgl=" E D I T O R "; msg2=" F 1 [H e n u ] "; msg3=" F 2 [inicia 1"; mcg4=" F 3 [Tridimensional 1"; msg5=" F 4 [Bidimensional I"; m ~ ' 5 6 = ~ F 5 [Efectos 1"; mcg7=" F 6 [Recupera Imagen]"; mcg8=- F 7 [Guarda Imagen 1"; mcg9=" F 8 [ > Color]"; mscjlO=" F 9 [ > Tipo]"; mSgll=" F 10 [ Parametros 1"; msgl2=" Teclee RETURN ";

case 4: msgl=" Efectos Especiales ";

case 2:/* Menu dos * /

break;

mcg2=" 1 [Linea ] "; msg3=* 2 [circulo ] "; msg4=" 3 (Arco ] "; msg5=" 4 [Rectangulo ] ";

22

Page 22: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

msg6=" 5 [Rellena ] "; msg7=- 6 [Elipses ] "; msg8=" 7 [Rellena Area ] "; msg9'"" ; msgl0=""; msgl l=" " ; msgl2=" Dar opcion '; break;

case 5:msgl=" M e n u "; msg2=" ; msg3=" Parametros del Editor "; msg4="";, msg5=" 1: Distancia "; msg6=" ; msg7==" 2: Radio "; msg8=" ; msg9=" 3: Tipo de Linea "; msg 1 O = " " ; msgll=""; break;

1 outtextxy(i,h,msgl); outtextxy(7,2*h,msg2); outtextxy(7,3*h,msg3); outtextxy(7,4*h,msg4); outtextxy(7,5*h,msg5); outtextxy(7,6*h,msg6); outtextxy(7,7*h,msg7); outtextxy(7,8*h,msg8); outtextxy(7,9*h,msg9); outtextxy(7,1O*h,msglO); outtextxy(7,11*h,msgll); outtextxy(7,12*h,msg12); /*leer opcion * / InVeTS0(7,13*h," OPCION... ",WHITE,BLACK); if(modo==3){ while(ikbhit()); }

else{ lee - cadena(s,3); *op=atoi(s); 1

Activa - Ventana(); putimage(posx ,posy ,zona4emp,COPY'~~~) ; setviewport(ax,ay,bx,by,l); setcolor(co1or); free(tona-temp);

O clearviewport ( ) ;

1

/ * Procedimiento de captura de datos */

23

Page 23: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/* Lee de la ventana, escribe en modo grafico, y pone un titulo segun el modo: modo 1:Valor modo 2:Nombre modo 3:OpciOn * / lee - cadena(cadena,modo) char *cadena;int modo: { int letra,ax,ay,bx,by; int th,tw,color; char buff[2]; struct viewporttype vp; zona - aux=malloc(imagesize(O,O,l79,29));

buff[l]=*\O8; getviewsettings(&vp);

ax=vp . left ; ay=vp . top; bx=vp.right:by=vp.bottom; / * Guarda la zona actual */ Activa-Ventana(); getimage(300,150,479,179,zona - aux); setviewport(300,150,479,179,1); cetfiiistyle(SOL1D - FIU,BLACK); bar(2,2,getmaxx()-2,getmaxy()-2); Marco ( ) ; Tipo Letra(SHALL FONT,RORIZ DIR,4); Sett~XtJUStify(LEFT - TEXT,TOP - TEXT) ; switch(&o) { case l:Invers0(5,5,~ Dar valor: ",W?iITE,BLACK);break; case 2:Inverso(5,5," Dar Nombre: ",WHITE,BLACK);break; case 3:1nvers0(5,5,~ Dar Opcion: ",WHITE,BLACK);break; 1 th=textheight("H"); tw=textwidth("w"); moveto ( 7 , th+7 ) ; color=getcolor(); setcolor(k-BITE) ; setfiiistyle(SOL1D - FILL~BLACK); while((letra=getch())l=EOL & h ietrai=RET){ buff [ O]=letra; if(letra=8)/* Bksp * / { moveto(getx()-tw,gety()); ba~(getxo,gety~),getx~)+tw,gety~)+th); *cadena--= letra ; 1 else { outtext (buff ) ; * c adenact= le tr a; 1 } *cadena=NULL; clearvievport(); /* Borra zona de captura */ Activa-Ventana( ) ;

24

Page 24: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

putimage(300,150,zona~aux,CW~~PUT); aetviewport(ax,ay,bx,by,l);/* Reatura poaicion actual * / eetcolor(co1or); free(zona-aux);

1

25

Page 25: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

ASPECTO TRIDIMENSIONAL

Las gráficas en tres dimensiones (3D), son las más interesantes del proyecto, tiene sólidos fundamentos en las matemáticas como el cálculo vectorial, geometría análitica, trigonometría y otros tópicos como las superficies cuadráticas. En general se debwi resolver dos problemas importantes:

1) REPRESENTACION TRIDIMENSIONAL. 2) ALGORIMOS PARA GRAFICAR FUNCIONES EN 30.

VISTA TRIDIMENSIONAL

Las vistas tridimensionales o proyecciones pueden ser de 2 t i p

1) Proyección en paralelo 2) Proyección en perspectiva

Se recomienda usar uno de los planos xy, xz, yz como paralelo al piano de la computadora, no necesariamente, pero si simplifica los cálculos. Cada una de la representaciones tiene ventajas y desventajas, la proyección en paralelo preserva dimensiones, pero no es realista, en cambio la proyección en perspectiva produce vista realistas, pero no presenta las dimensiones, para nuestro sistema el más conveniente es la proyección en perspectiva u oblicua.

PROY ECCl ON ES OBLICUAS

Son las que forman un angulo, con la linea de proyección, las coordenadas se dan en modo p(x,y,z) el trazo en el monitor se da por (xp,yp)

XP= x + L*cos(e) yp= y + L*sen(B)

PROYECCIONES EN PERSPECTIVA

Se define un planode proyección sobre la pantalla y se cfacula una distancia d ai monitor, el punto p(x,y,z) sera graficado en el plano del monitor en (xp,yp).

XP= x(dh+d) YP= Y(dlt+d)

Este método produce profundidad de la escena.

SISTEMAS DE CORDENADAS TRlDiMENSlONALES

Los ejes xyz deben definirse en base a un plano paralelo con la pantalk Asi las tecnicas de despliegue visual seran mas sencillas. El sistema usado por el proyecto, es un sistema oblicuo, con un ángulo de 45 grados y recibe cualquier punto p(x,yz) y b grafh en las coordenadas plot o de monitor (xp,yp).

26

Page 26: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

xp=ox+y+x*cos(45) yp = oy-(z-x*sen(45))

Donde lac coordenadas ox, oy son las coordenadas de origen del sistema xyz. inarso se puede realizar un algoriimo general como

Plotxyz(int a, int b, int c,double ang) { xp = ox +c - a*cos (ang) yp = oy -(b - a*sen(ang)) PutPixel(xP,YP)

El siguiente paco es graficar lineas en 3D esta es una extension logica del anterior.

linea3d( int xl, yl, 21, x2, y2, 22 )

{ xpl= ox + zl - xl *cos(ang) ypl=oy - ( y1 - xl* sen(ang)) xp2= ox + 22 - x2*cos(ang) yp2= oy - ( y2 -x2*sen(ang)) linea(xp1, Y P ~ , X P ~ , Y P ~ )

1

Con esto se tienen las 2 funciones básicas, para hacer póligonos tndimensionales, de hecho un paralelépipedo se puede generar solo dando los 2 puntos extremos, dada la simetria del cuerpo el algoriimo genera los puntos restantes.

Sdo se llama a la función cubo( x l ,y1 ,z1 ,x2,y2,22 )

ALGORITMOS PARA GENERAR GRAFICAS TRIDIMENSIONALES

Existen 2 formas diferentes de trazar gráficas en 3d, utilizando las fómUlas matemáticas, pueden ser en forma paramétrica o su ecuación cuadrática

ECUACIONES PARAMETRICAS

expresar las 3 coordenadas cartesianas en forma paramétrica es mediante la función vectorial. Se les llama a las ecuaciones que se definen en base a parametros fijos, una f m de

Estos parámetros varian de ( 0..1 ). Una esfera tridimensional se puede trazar am un algoritmo que varie los parametros u y v de 0..1 en incrementos de aproximadamente 0.05

x (u,v) = P sen (Pi*u)* cos(2*Pl*v)

y(u,v) = f sen(Pl*u)*sen(2*Pl*v)

z( u,v) = r cos(Pl*u)

27

Page 27: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

Donde r es el radio de la esfera, se recomienda valores de 20..100

Existe otra forma de graficar en 3ü. Esta forma es más directa, solo se requiere de algunos trucos para que el algoritmo funcione conectamente, se puede graficar cualquier función de la forma:

El algoritmo varia x y y, graficando z, esto lo hace con dos ciclos for

for( ix= - limx..limx,++x) for( y = -limy..limy, ++y)

{ 2 = f(X,Y) xp=. . . yp=. . . if ( x == - limy ) mueve(xp,yp) linea-a(xp,xp)

3

El otro truco es invertir los ciclos for y vambiar la condición por y== - ling esto hace que se forme un enrejado tridimensional, las ecuaciones pueden ser

Z = Wa2 (+/- ) yUb2 z= sen(x) Z=COS(y) z=tan(x) z=constante

y otras más que estan incuidas en el programa

Las otras funciones son las que son de la forma z=sqrt( f(x,y) ) en este caso se necesita calcular de la misma forma los ciclos for para la rak positiva y en segundo lugar otro doble ado for para la parte negativa de I a raiz,Se pueden graficar funciones como:

Z= q r t ( ~2 /a2 (+/ - ) y2/b2)*C z = r 2- (x 2 + y2)

y algunas más...

/ * €"CIONES TRIDIMENSIONALES +/

Plotxyz(int a,int b,int c,double ang) { / * Dibuja un pixel en 3D representandolo en modo PLOT * / int xp,yp; xp=ox+b-a*cos(ang); yp=oy-(c-a*sin(ang)); putpixei(xp,yp,WHITE);

1

lineaxyz(int x,int y,int z )

28

Page 28: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

{ /* Dibuja una linea recta dirigida al p(x,y,z) * / double x1,yl; xl=(double)ox+y-(double)x*cos45; yl=(double)oy-(z-(double)x*cos45); lineto ( xl , y1 ) ;

1

/* Funciones que calculan p(x,y,z) -> p(xp,yp) * / /* warnigs 1:2 Por autodocumentacion del programa mandamos los parametros en ese orden, uno no se usa en una funcion pero

convertirlos a (xp,yp) es conveniente esto. * / . si en la otra, como los ciclos mandan puntos (x,y,z) para

int xpi(int a,int b,int c,double ang) { return(ox+c-a*cos(ang));}

int ypi(int a,int b, int c,double ang) { return(oy-(b-a*sin(ang)));}

/* Traza un paralelepipedo tridimensional * / /* Solo se dan los 2 puntos opuestos y el * / /* algoritmo determina los restantes. */

cubo (.int al, int a2, int a3, int bl, int b2, int b3 ) {int i; for(i=O;i<l;i++) /* Asigna los valores de zl y 22 * / { pxyz[i].z=a3; /* 21 */ pxyz[i+l].z=b3;} /* 22 */

/* Asigna los valores de xl y x2 * / { if(i=olli==3lli==41li==7) pxyz[i].x=al; /* xl * / else pryt[i].x=bl;/* x2 * / 1

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

for (i=O;i< 8; i++) / * Asigna los valores de y1 y y2 * /

{ if(i=olli==iIli==411i==5) pxyz[i].y=a2; /* y1 * / else pxyz[i].y=b2;/* y2 */ 1

/*Transforma a puntos en dos dimensiones * / for ( i=ü; i< 8; i++) {

29

Page 29: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

~ x y t ~ l . x - x ~ i ( ~ x y z [ ~ l ~ x , ~ ~ ~ t ~ ~ ~ ~ , ~ ~ ~ [ ~ l ~ ~ , ~ ~ g ~ ; ~ x y [ i l . y r ~ i ~ p x y z [ i ] . x , ~ x y ~ t ~ ~ . ~ , ~ ~ z [ i ~ . ~ , a n g ~ ; 1 / * Traza el cubo tridimensional * / linea3(0,l);linea3(1,2);linea3(2,3); linea3(4,5);linea3(5,6);linea3(6,7); linea3(3,0);linea3(7,4);linea3(0,4); iinea3(1,5);linea3(2,6);linea3(3,7); 1

/* Casquetes esfericos */ /* z=r'2-xm2-y-2 +/

casquetes() { / * Grafica los casquetes esfericos * / int a=50,b=50,2=50; int x,y,xp,yp,concavo; char *s=NULL;

Msg(" Dar parametro a..[20..50]"); leecadena ( s , 1 ) ; a=atoi(s); if(a>=20 hh a<= 5 0 ) a=50; Msg(" Dar parametro b..[20..50]"); lee - cadena(a,l); b=atoi(s); if(b>=20 ch bc= 50) a=50; Msg(" D a r parametro 2..[20..50]"); lee - cadena(a,l); z=atoi(s); if(z>=20 ch bc= 50) z=50; Msg(" Concava [l] Arriba [2]Abajo [ 3 ] Ambos " ) ; lee - cadena ( s , 1 ) ; concavo=atoi(s); moveto (ox, oy ) ; if(concavo==i I I concavo ==3)

{ /* Dibuja hacia arriba el casquete * / for(y=-b;y < b;y+=5) for(x=-a;x<a;x+=S) { Z=2500-(~*~)-(y*y); if (z>O) z=(int)sqrt(z); else z=O; xp=ox+y-x*cos45; yp=oy-(z-x*cos45); if(x==-a)moveto(xp,yp); lineto( xp, YP) ; 1

for (x5-a; xca; x+=5 )

30

Page 30: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

for ( y=-b; y < b; y+=5 ) { z=25oo-(x*x)-(y*y); if(z>O) z=(int)eqrt(z); else z=O; xp=ox+y-x*Cos45; yp=oy-(z-x*Cos45); if(y==-b)moveto(xp,yp); lineto(xp,yp); 1 1 if(concavo==2 I I concavo==3) { / * Traza figura hacia abajo * /

if(concavo==3)

else{ oy=80;} for(y=-b;y < b;y+=5) for(x=-a;x<a;x+=5) {

if (z>O) z=(int)sqrt(z); else z=O; 2'-2;

{ oy=oy+30;)

~=2500-(X*x)-(y*y);

xp=ox+y-x*cos45; yp=oy-(z-x*cos45); if(x==-a)moveto(xp,yp); lineto(xp,yp); 1 for(x=-a;x<a;x+=S) for(y=-b;y < b;y+=5) {

if(z>O) z=(int)sqrt(z); else z=O; z=-2; xp=ox+y-x*cos45; yp=oy-(z-x*Cos45); if(y==-b)moveto(xp,yp); lineto(xp,yp); 1 1

Z=2500-(X*~)-(y*y);

1

e jesxyz ( ) { / * Traza los ejes coordenados x,y,z con un angulo de 45 * / /* segun el origen actual ox,oy * / int i;

moveto(ox,oy);

31

Page 31: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

for(i=O;i<=9O;i++) lineaxyz(i,O,O);

outtext(" x " ) ; moveto(ox,oy); for(i=O;i<=180;i++) lineaxyz(O,i,O);

outtext(" y " ) ;

moveto(ox,oy); for(i=O;i<=90;i++) lineaxyz(O,O,i);

outtext(" z " ) ;

1

esfera( ) { /* Traza una esfera tridimensional segun su ecuacion parametrica

x(u,v)=r*sen(PI*u)*cos(2*PI*v) y(u,v)=r*sen(PI*u)*sen(2*PI*v) z(u,v)=r*cos(~~*u) */

double x,y, z ; double u=0.0,v=0.0,a,b,c,tempx=O,tempy=O; int r,i; char *s=NüLL;

Mag(" Dar radio de la esfera[20..100] " ) ; leecadena(6,l); r=atoi(s); if( r< 20 L L r ~ 1 0 0 ) r=50;/* valida el radio */ /* se mueve al origen de coordenadas */ moveto(ox,oy); setcolor(getcolor()); for(u=0.0; u <= 1; u=(double)u+0.05){ for(v=O.O;v <= 1; v=(double)v+0.05)

{ a=(double)PI*u; b=(double)r*sin(a); c=(double)Z+~I*v; x=(double)0.988*b*cos(c); y=(double)0.979*b*sin(c); z=(double)0.987*r*cos(a);

xp=(double)(ox+(double)y-(double)(x*cos45)); yp=(double)(oy-((doub1e)z-((double)x*Cos45)));

if (v==O) { if(tempxi=O L L tempyl=O)lineto(tempx,tempy); moveto(xp,YP); tempx=xp;tempy=yp; 1

lineto(xp,yp); 1

32

Page 32: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

1

for(v=O.O;v e= 1; v=(double)v+O.OS){ for(u=0.0; u <= 1; u=.(double)u+0.05)

moveto(ox,oy);

{ a=(double)PI*u; b=(double)r*ain(a); c=(double)2*PI+v; x=(double)0.988*b*cos(c); y=(double)0.979*b*ein(c); z=(double)0.987*r*cos(a);

xp=(double)(ox+(double)y-(double)(x*coa45)); yp=(double)(oy-((double)z-((double)x*cos45))); if(u==0.0)

moveto(xp,YP); lineto(xp,yp);

1 1

1

cubos ( ) { /* Traza paralelepipedos trdimensionalea * /

char *a=NULL; int px,py,pz,qx,qYlqz;

Hsg(" Dar Pl[x,y,z] ... " ) ;

HSg("DU X..."); lee-cadena(s,l); px=atoi (s ) ; Msg("Dar y..."); leecadena ( s , 1 ) ; py=atoi(a); Hsg("Dar z . . . " ) ; leecadena ( s , 1 ) ; pz=atoi (a ) ; Hag(" D a r P2[x,y,z] ..."); Hsg("Dar x..."); leecadena ( a, 1 ) ; qx=atoi ( I ) ; Msg("Dar y.. . " ) ; lee - cadena ( a , 1 ) ; qy=atoi (8 ) ; Msg("Dar 2.. .");

leecadena ( a, 1 ) ; qz=atoi (s ) ;

cubo(Px,PYlPz,qx,qy,qz); 1

Tipo-um(int num) /* Grafica funciones z=f(x,y) */ 33

Page 33: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

{ int lUnX, limy; double char *a-NUu;

i , j , XP * YP * a * b , c , z ;

Msg(" Dar limite x . . . ");leecadena(e,l); limx=atoi e); Msg(" Dar limite y... -);lee-cadena(e,l); limy=atoi 8 ) ;

/* valida si hubo error en conversion o en el usuario * / if(1imx e O ) limx=lOO; if(1imy e O ) limy=lOO; if(num==i ilnum==2llnum==í){ Msg(" Dar parametro a.."); lee cadena ( s , 1 ) ; a=atof(e); * s = N U U ; Msg(" Dar parametro b.."); leecadena(s,l); b=atof(s); s =NULL ;

/* valida parametros Minimo y Maximo * / if( a <=O) a=5; if( b <=O) b=9; if( a > 50) a=50; if( b > SO) b=50; 1 if( num"=illnum==2l Inum==il/num==i~)

-

{ ' Msg(" Dar parametro c... " ) ; lee cadena ( s , 1 ) ; czatof (s ) ; * s=NULL; if( c <==O) c-9; 1

-

/* Traza Grafica Tridimensional * / for(i=-limx;i e=limx;i=i+lO) for(j=-limy;j<=limy;j=j+lO) c

suitch(num) { case l:z=c*( (i*i) / (a*a) - (j*j) / (b*b) );break; case 2:z=c*( (i*i) /(ata) + (j*j)/(b*b) );break; case 3:Z=( (j*j)/(a*a) -(i*i) /(b*b) )/c; break; case I:z=sin(i);break; case 5:z=sin(j);break; case 6 : Z=COS ( i ) ;break; case 7:z=cos(j);break; case 8:z=tan(i);break;

34

Page 34: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

came 9rz=tan(j);break; came lO:z=c;break; default:z=O;

xp=ox+j-i*cos45; yp=oy-(z-i*cos45); if(j==-limy)moveto(xp,yp); lineto(xp,yp);

1

1

for(j=-limy;j<=limy;j=j+lO) for(i=-limx;i <=limx;i=i+lO) {

switch(num) { case l:z=c*( (i*i) / (ata) - (j*j) / (b*b) );break; case 2:z=c*( (i*i) /(a*a) + (j*j)/(b*b) );break; case í : z = ( (j*j)/(a*a) -(i*i) /(b*b) )/c; break; case I:z=sin(i);break; case 5:z=sin( j);break; case 6:z=cos(i);break; case 7 : z=cos ( j ) ;break; case 8 : z=tan ( i ) ;break; case 9:z=tan(j);break; case 10 : z=c; break; default :PO;

xpox+j-i*~os45; yp=oy-(z-i*cos45); if(i==-limx)moveto(xp,yp); lineto ( xp, yp ) ;

1

1 1

Tipo - dor(int num) /* Grafica funciones z=eqrt(f(x,y)) * / c int liix,limy,op,dx,dy,

char *.=NULL; double z ;

i, j xp, yp, a, b, c, r;

Msg(" Dar limite x... ");leecadena(s,l); limx=atoi ( s ) ; Msg(" D a r limite y... ");leecadena(s,l); limytatmi ( s ) ; /* Valida si hubo error en conversion o en el usuario */ if (limx e O ) limx=lOO; if(1imy O ) limy=lOO; if( num !=a){ Msg(" Dar parametro a..");lee-cadena(s,l); a=atoi ( 8 ) ;

35

Page 35: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

Msg(" Dar parametro b..");lee-cadena(6,l); b-atof(.); /* Valida parametros */ if( a <=O) a=5; if( b <=O) b=9; if( num==ll Inum==2l Inum==3){

Msg(" Dar parametro c... " ) ;

leecadena(8,l); c=atoi(o); if( c <=O) c=9; 1

1 if(num==4) {

Msg(" Dar radio r... " ) ; lee - cadena( s,l) ; r=atoi(a);if(r<5 & & r> 5 0 ) r=SO; 1

/* Traza Grafica Tridimensional */ for(i=-1imx;i <=limx;i=i+lO) for(j=-limy;j<=limy;j=j+lO) {

switch(num) { case 1: z=c*( (i*i) / (a*a) + (j*j) / (bib) );

if(z>O){ z=sqrt(z);) else z=O; break;

case 2: z=(c*c)*(l- (i*i) / (a*a) + (j*j) / (b*b) ); if(z>O){ z=sqrt(z);) else z=O; break;

case 3 : z= ( ( (j*j)/(a*a) + (i*i) /(b*b) )-1); if(z>O){ z=sqrt(z)*c;> else z=O; break;

case 4:z=(r*r-i*i-j*j); if(z>O){ z=sqrt(z);} else z=O; break;

1

xp=ox+j-i*cos45; yp=oy-(z-i*cos45); if(j==-limy)moveto(xp,yp); lineto(xp,yp);

1

36

Page 36: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

mwitch(num) { case 1: z=c*( (i*i) / (a*.) + (j*j) / (b*b) );

if(z>O){ z=sqrt(z);} elre t = O ; break;

case 2: z=(c*c)*(l- (i*i) / (a*a) + (j*j) / (b*b) ) ; if(z>O){ z=sqrt(z);} else 2 3 0 ; break;

case 3: z=( ( (j*j)/(a*a) + (i*i) /(b*b) )-1); if(z>O){ z=sqrt(z)*c;} else z=O; break;

case 4:z=(r*r-i*i-j*j); if(z>O){ z=sqrt(z);} else z=O; break;

1

xp=ox+j-i*~os45; yp=oy-(z-i*cos45); if(i==-limx)moveto(xp,yp); lineto(xp,yp);

1 Msg(" Otra parte [l]Normal [2] desplazada [3]Sin graficar ") ;

lee - cadena(s,3); op=atoi(s); if(op==i 1 1 op==2){ if(op==2){

Msg(" Dar desplazamiento en x [O..lOO]"); lee-cadena(s,l); dx=atoi(s); if( dx >O && &<loo) ox +I&;

Msg(" Dar desplazamiento en y [O..SO]"); lee-cadena(s,l); dy=atoi(s); if( dy>O e& dy<50) oy +=dy; 1

/* Grafica parte z=-sqrt(f(x,y)) */ for(i=-1imx;i <=limx;i=i+lO)

for(j=-limy;j<=limy;j=j+lO) { switch(num) {

case 1: z=c*( (i*i) / (a*a) + (j*j) / (b*b) ); if(z>O){ z=sqrt(z);} else z=O; break;

case 2: z=(c*c)*(l- (i*i) / (a*a) + (j*j) / (b*b) ); if(z>O){ z=sqrt(z);}

37

Page 37: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

olae z-O: break;

case 3: z = ( ( (j*j)/(a*a) + (i*i) /(b*b) )-1); if(z>O){ z=sqrt(z)*c;} else z=O; break;

case 4:z=(r*r-i*i-j*j); if(z>O){ z=sqrt(z);} else z=O; break;

1 z=-z;

xpl.ox+j-i*cos45; yp=oy-(z-i*cos45); if(j==-limy)moveto(xp,yp); lineto(xp,yp);

1

for(j=-limy;j<=limy;j=j+lO) for(i=-1imx;i <=limx;i=i+lO) { switch(num) {

case 1: z=c*( (i*i) / (a*a) + (j*j) / (b*b) ) ;

if( z>o) { z=sqit ( 2 ) ; else 2-0; break;

case 2: z=(c*c)*(l- (i*i) / (a*a) + (j*j) / (b*b) ); if(z>O){ z=sqrt(z);} else 2-0; break;

case 3: z=(( (j*j)/(a*a) + (i*i) /(b*b) )-1); if(z>O){ z=sqrt(z)*c;} else z=O; break;

case 4:z=(r*r-i*i-j*j); if(z>O){ z=sqrt(z);} else z=O; break;

1 z=-z;

xp=ox+j-i*cos45; yp==oy-(~-i*cos45); if(i==-limx)moveto(xp,yp); lineto(xp,yp);

> 1

1

38

Page 38: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

BlBUOGRAFlA

Gráficas por computadora Heard Baker, Prentice Hall (Pascai) Gráficas por computadora Demel/Miller,Mc Graw Hill( BASIC y FORTRAN) Interactive Microcomputer Graphics. Chan.S.Park, AddisonWesley Co. Interactive 3D,Computer Graphics, Leedert Ammeraal, John Wiley / Sons.(Turbo C) Computer GraphicsSystems and concepts Salmon and Slatter,The Benjamin / Cummings

Principles of interactive computer graphics, William M. Newmad Robert F. Sproull Mc Graw Hill. Computer Graphics, Harrington, Mc Graw Hill Computer Graphics with Pascal, Marc Berger, The Benjamin Cummings Co.(Pascal)

Publishing Co. Inc.

PR OG RAMACIO N

Lenguaje C.Bibiloteca de funciones, Kris Jmsa, Mc Graw Hill. ' El lenguaje de programación C, Kemigan and Ritchie,Prentice Hall Manual: Reference Guide Turbo C 2.0 Manual: User Guide Turbo C 2.0 Turbo Pascal. Biblioteca de programas, Jamsa and Nameroff, Mc Graw Hill

BASES MATE MA TICAS

Calculo Vectorial, Marsden and Tromba, F.E.I.. Calculo con geometría analitica, Earl W. Swokowski, W.I.I.

41

Page 39: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/* */ I* *I /* */ I* */ I* */ I* *I /* *I I* */ /* UNIVERSIDAD AUTONOMA METROPUTANA-IZTAPALAPA */ /* */ /* PROYECTO DE INVESTIGACION I I */ /* *I /* */ I* ALUMNO: ADAN SANTOS CARDONA */ /* */ /* ASESOR: PEDRO FLORES *I /* */ /* EDITOR GRAFICO *I I* */ I* */ I* *I /* Proyecto Final: > Editor Grafico

: > Bi-tridimensional : > Tortuga grafica : > Almacena y Recupera lmagenes de disco : > Efectos y Presentacion

: En Turbo C, Version 2.0 : usa el <graphics.h> y los archivos : *.bgiy*.chr */

#ifdef TINY- /* Identifica el modelo de memoria Tiny */ #error%yecto no corre en el modelo TINY. #endif

I* Librerias Utilizadas */ #include cdos.h> #include cmath.h> #include <conio.h> #include < stdio. h > #include cstdlib.h> #include <stdarg.h> /* Libreria grafica */ #include <graphics.h>

/* Definiciones Miles *I #define round(x) ((int) (x+ 0.5)) #define trunca(x) ((int)(x)) #define es-digito(x) ((x>=V && xc =9)?1:0) #define es-blanco(x) ((x= =I ??l :O)

Page 40: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

#define BELL putcharm; #define a-decimai(x) (x-'0') #define EOL In' #define N W N E In' /* Definiciones de constantes */ #define ESC 0x1 b XdefineBkSp Ox08 XdefineRET OxOd XdefineTRUE 1 #define FALSE O #define PI 3.1 41 59 XdefineON 1 XdefineOFF O #define Cos45 0.7071 /* cos(45)=sin(45)=0.7071 */

I* Tridimensional */ struct PTSXYi (int x, y, 2 ; ) ;

struct PTSxy (int x, y;3;

/* Tipos para la transformaciones Bidimensionales *í typedef float matriz[3][3]; typedef fkrat puntos[20]; /* Maximo de puntos */

/* Variables de inicializacion */ int GraphDriver; /* Tipo de adapta& */ int GraphMode; I* Tipo de modo grdco */ double AspectRatio; I* Aspecto del pixel */ int MaxX,MaxY; I* Coordenadas Maximas */ int MaxCdors; /* Todos los colores posibles */ int ErrorCode; /* Detecta errores graficos */ int tipo=O; /* Tipo de fondo */ I* Variabies para transformaciones Bidimensionales */ matriz m; puntos x,y; /* Arreglos de puntos x, y */ static n=q

/* Matriz para transformaciones */

/* Numero de vertices de la fig. */

/* Variable para graficacion tridimensional */ int ox=32O,ay=lOO; /* Puntos de origen para el sistema tridimensional */ double wyp; double ang=45.0; I* Angulo entre los ejes 3-d *I int i,j,cont; /* otras variables */ /* Variables para efectos especiales */ int tempx,iempy; /* Marca un punto */

/* Puntos plot para simular 3-D */

/* Estructuras para paraleiepipedos tridimensionak */ struct PTSXYi pxyz[8]; struct msxy pxyI81;

/* /* Tipos de Funciones

Page 41: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

P *I

void Iniciiar(void); void Presentaciono; void Editor(); void Haz-Cursor(void); void Pon-Cumr(int x, int y); void Borra-Cursor(int oldx, int oldy); void *cursor; I* Apuntadores a zonas de memoria para */ void *save image; I* manejo de espacio dinamico, guardar *I void *zon<aw; I* y recuperar imagenes, y para respaldar */ void *zona-temp; /* zonas donde aparecen los menus. */ void *zona-rell; void Restaura(void); void Ventana(char *header); void Msg(char *msg); void Tituio(char *msg); void Activa-Ventanao; void Menu(char *msg); void Marco(void); void T¡po-Letra(int font, int direction, int charsize); void outfmext(int x,int y,char 'fmt,...); void Inverso(int x,int y,char *text,int back-color,int fore-&); void overwrite(int x,int y,char 'text); I* Transformaciones Bidimensionales */ void bidirno; void dibujaont I); void marca-verticeso; void escalao; void rotaciono; void traslada();

/* /* Main Principal /*

int main0 {

lnicialuaro; I* lnicializa modo grafico */ Presentaciono; /* Presentacion del Editor Editoro; /* Editor Grafico-Texto *I closegrapho; I* Fin de modo grafico *I

*/

return(0); 1

void Iniciaiiiar(void) {

int xasp, yap; /* Para detectar el aspect ratio */

GraphDriver = DETECT; initgraph( BGraphDriver, &GraphMode, " );

I* Auto-Detecta el Adaptador Grafito*/

Page 42: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

ErrorCode = graphresuto; /* Checa h Kiiciaiiiacion*/ /* Error ocurrido al iniciar if( EmorCode ! = grOk ){

1

*/ pnntfr Error en Sistema Grafico: %s\n', graphenormsg( ErrorCode ) ); exit( 1 );

/* Constantes generales segun el tipo de resducion */ MaxCdors = getmaxcoloro + 1 ; /* Maxim de Colores*/

MaxX = getmaxxo; MaxY = getmaxyo; /* Tamano maximo de la escena */

getaspectratio( hasp, &yasp ); /* Lee el aspect ratio */ AspectRatio = (doub1e)xasp / (doub1e)yasp; /* Hace la m e c i o n */ ox=getmaXx0/2; oy= getmaxy012;

1

/* Activa toda la ventana para establecer las coordenadas absolutas */ void Activa-Ventana0 t

1 setviewport(O,O,MaxXIMaxY,l);

cambia-tipo(int modo) { /* Cambia d tipo de letra para el editor */

switch(modo) { case 1 : ripo~Letra(DEFAULT~FONT,HORlZ~DlRll);tipo=O;break; case 2: ripo~Letra~RiPL~~FONT,HORIZ~DIRll);tipo= 1 ;break; case 3: ~ipo_Letra(SMAU~FOM,HORIZ_DIR,4);tipo=2;break; case 4: l@o-Letra(SANS-SERiF~FONTlHORIZ-DIR,1);tipo=3;break; case 5: ~ipo~Letra(G0~iC~F0~,H0RlZ~DlR,1) ; t ¡~=4;break; default:{

ripo-Letra(DEFAULT-FONTIHORIZ-DIR,l); tipo=O;break; 1

1 1

/* Rutina Edícmn Grafica */ void Edita0

{ static int a,b; ht paCO='l,radiO=lO; int angider,angfder,angiizq,angf¡zq; /* V a r i a s para los angulos Uq y Der / struct arccoordstype arcinfo; int k,x,y,i; /' Variabies auxiliares para el editor Grafko */ int modo,wior; int tip-lin,ancho;

/* Para el trazo de arcos */ /* Distancia y radio de trazado */

/* Estructura para mover el cursor grafico */

Page 43: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

char bufíer[2]; char *s=NUU; struct viewpomype viewinfo;

/* Inicializa variables para el editor */ buffer( 1 ] =Iü; Haz-Cursor();

getviewsettings(&viewinfo) ; angiizq=O; /* Inicio de angulos para el trazo de arcos */ angider= 165; zona-aux=malloc(imagesize(O,0,149,149)); Tipo_Letra(O,HORIZ_DIR,l);i=O;/* Modo normal de escritura */ Menu~MuRiple(3,20,20,180,1 SO,&¡);

x= getmaxxOi2;y=getmaxy0/2; moveto(x, y); PonCursor(x.y); . /* Pon cursor en origen */

/* Ciclo continuo */ do { k=getchO; /* Leer tecla normal o Funcion */ if(ESC==k) { /* Usuari abandona sesion */

Msg('*** Guarda Imagen Actual Teclee[l]***'); if(getch0 = =I1 ')

Salva-lmgo; clearviewportO;exit( 1); break;}

if(k==O){ k=getchO;/* Teclas Fl..FlO o <Flechas> o HOME,PgUp,.. */ Bona-CurWgetxO, gety O ) ; if( k!=R') { angiizq=O; } /* lncializa continuamente */ if( k! =S') { angider= 165;) /* angulos para los arcos */ switch(k) {

/* Teclas Graficas para el trazo de lineas y arcos utiliza las flechas,Home,End,PgUp,PgDn,Ins,Delete */

case 'H':if(getyO+paso > viewinfo.top) {linerel(O,-paso);} break; /* Trazo Arriba */

case 'P':if(getyO+paso < viewinfo.bottom) (linerel(0,paso);) break; /* Trazo Abajo v */

{linerel(-paso,O);) break; /*Trazo Izq */

case 'M':if(getxO +paso < viewinfo.right) { linerel (paso, O) ; ) break; /*TrazoDer > */

getxo-paso > viewinfo.left )

case 'K':if(getxO-paso > viewinfo.left)

case U':if(getyO-paso > viewinfo.top &&

Page 44: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

{linerel(-paso,-paso) ;} break; /* Trazo Diag Home*/

cas8 l':if(getyO-paso > viewinfo.top && getxo + paso < vieWinf0.right)

{ linerel(paso,-paso) ; } break; /* -PgUp*/

getyo+paso e viewinfo.bottom) {linerel(-paso, paso);} break; /* End */

case O':if(getxO-paso > viewinfo.left &&

case Y)':if(getxO+paso < viewinfo.right 88 getyo +paso < viewinfo.bottom)

{ linerel(paso, paso) ;} break; /* -PgDn*/

I* Traza un arco a la uq de 15 grados civez con un radio=paso, paso es la magnitud del trazo actual */

case 'R: if(angiizq= =O){

b=getyO; a= getxo-radio;

angfiuq =45; } arc(a, b, ang iizq, angfizq, radio) ; if(angfizq= =360) { angfizq=O;} angiizq = angfizq; angfizq = angikq + 15; break;

/* Traza arcos a la Der. Analog0 al anterior */ case S':if(angider= = 165){

a=geb@ +radio; b=getyO; angfder= 180;)

arc(a, b, angider,angfder, radio) ; if(angfder==15){ angfder=375; }/* =360+15 */ if(angider==O) { angider=33ü; }/* =315+15 */ angider =angider-l5; angfder =an@&-1 5;break;

/* ZONA DE TECLAS DE FUNCION [FI..FlO] */

I* F1 */ case ';':x=getxO;y=getyO;i=O; Menu~MuRiple(3,20,20,18üI1 50,i); moveto(x,y) ; break;

/* F2 */ case 'e': Msg(.*** Guarda Imagen Actual Teclee[l]***');

if(getchO= =I11

clearviewport0; Titulo(' Editor Grafko U.A.M.1 ');¡=O;

MsgC [ F1 ] Menu de Funciones'): m o v e t o ( g e t r n ~ 0 / 2 , g e t m ~ O / ~ :

Salva-l mg 0 ;

Men~-MuRiple(3,20,20,180,150,i);

Page 45: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

break;

Titulo(' Mundo Tfidirnensional'); tridimo;

break;

TiiuloC Mundo Bidimensioanr); bidimo;

break;

MsgC Efectos Especiales 9; Efectos(x, y);

break;

Msgr Recupera Imagen de diskette'); Recupera-lmgo ; moveto(x,y); break;

MsgC Guarda Imagen en diskette'); Saka-lmg 0 ; moveto(x,y); break;

if(getcoiorO==O) (setcoior(WHm);)

else setcolor(BLACK) ;

break; /* Pen Up / Pen Dn */

color=getcolorO; Msg('Tipos [l]Normal [2]Tnplex [3]Atomica [4] Sans Serif [SJGotica [Opcion ?:I@);

lee cadena(s,3); modo=atoi(s); cam bia-t i po( modo) ; moveto(&)'); setcolor(cdor) ; break;

Msg(' Modifica Parametros del editor'); Menu~Mu~iple(5,20,~,150,1 SO,&¡); switch(¡){ case 1:MsgCDistancia de trazo ...[ 1..20]');

r F3 */ c a ~ e '=':~=getxO;y=setyO;

moveto(%!/);

P F4 */ case '>':x=getxO; y=gefyO;

moveto(x,y);

/* F5 */ c a ~ e T:x=g~O;y=getyO;

mov~o(>ly);

/* F6 */ case @':x=geixO;y=getyO;

/* F7 */ case 'A:x=getxO;y=getyO;

P F8 */ case 8': /* Cambia Cdor de trazo */

I* F9 */ case C:x=getxO;y=getyO;

/* F10 */ case 'D:x=getxO;y=getyO;

lee-cadena(s, 1); . paso = ato¡ (s) ; if@aso<O)pas0=7; if@aso>2o)paso=20; break;

case 2:Msg('Radio de arco ...[ l..20]');

Page 46: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

lee cadena(s,l); rad%= ato@) ; if(radio<O)radio= 10; if(radi0 > 20)radio= 20; break;

case 3: Msg(‘Dar Tipo de linea [OISolida [lJPunteada [2]Centrada[3)Rayadam);

lee-cadena(s, 1); tip-lin = atoi(s);

MsgpDar ancho de la linea [OINormal [3]fnpie*); lee-cadena( s, 1 ) ; ancho= atoi(s); if( ancho !=O 88 ancho !=3) ancho=o; setlinestyle(tip-lin,O,ancho) ; break;

1 moveto(x, y) ;

defauit:; 1

if(k= = I R ’ I I k= =Sl) { /* Trazo un arco, ir al principio o fin del arco */ get arccoords (&arc¡ nfo) ;

moveto(arcinfo.xend, arcinfo. yend); else moveto(arcinfo.xstart, arcinfo. ystari);

if(k= =IR9

1 Pon-Cursor(getx0,getyO);

1 /* if k= =O then Tecla-Funcion */ else{

P Editor de Texto-Grafico */ Bona-Cursor(getxO,getyO): s e t t e x t j u s t i r y ( L E F , C E ~ E R - ~ ; buffer [O] =k; B(k= = 13)/* return */

if( getyo e viewinfo.bottom) rnoveto(viewinfo. left + textwidth(‘W) ,getyo + textheig ht (“3 +2); 1 ü(textwidth(.W) +getxO > viewinfo.nght) r Saito de linea */

if( getyo < viewinfo.bottom) mweto(viewinfo.left+texh”v\r),getyO +textheight(‘”)+2); 1 I(k= =8) /* Utiliza el BkSp para marcar */ { tempx=getxO;

tempy=getyO; /* Marca zona rectangular */

Page 47: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

ox=getxo;

1 oy=geiyO; /* Nuevo origen Tridimensional */

if(k !=13 && k!=8) outtext (buffer) ;

Pon-Cursor(getxO,getyO); 1

)whiie(l); /* Ciclo continuo 1

*/ /* Sale con FlO=ESC 0 */

/* Fin del editor grafico */

void Borra-Cursor(int oldx,int ddy) { /* Pone la imagen que estaba antes de poner el cursor */ putimage(oldx,oldy,save~image,COPY-PUT) ; 1

void Pon-Cursor(int x,int y) { /* Pone el cursor antes ... */ getimage(x,y,x+3,y+3,save-image); /* ..guarda la imagen que va ocupar */ putimage(x,y,cursor,COPY-PUT); /* pone el cursor en esa zona */

1

/* Crea una vez la imagen del cursor guardandola en cursor */ void Haz-Cursor0 { inti;

save-image=malioc(imagesize(O,O,2,2));/* Guarda la zona ocupada por el cursor/ cursor =mailoc(imagesize(0,0,2,2));/* Cursor tipo flecha M pixels */ set bkcoior(0) ; putpixel(O,O,WHm); putpixei(l,l, WHITE) ; putpixel(0,l ,WHITE); for(i=O;k3; + + i) putpixel(i,2,WHm); getimage(0,0,2,2,cursor); /* guardamos la imagen */ clearviewpono; setcolor(WHm);

/* Hacemos el cursor con pixeles y... */

/* Borra escena y restaura color */ 1

void Editor(void) {

/* Editor Grafico U.A.M.1 Disenado por A.S.C. */

Ventana(‘ TURBO Editor Grafico U.A.M.1.’); MsgC Mov.Cursor Flechas(Tec1ado Numerico).ESC salif);

Page 48: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

Edita();/* Edita es el nucleo del editor grafiko */

} /* Termina editor grafcos */

/* Procedimiento Recupera una Imagen de disco */ Recupera-lmg 0 { void 'zonapot; FILE * f l ; char *nombre= NULL; int i,j; int ax,ay,bx,by; struct viewpomype vp;

Msg('Dar nombre del archivo:..'); lee-cadena (nombre,2) ;

/* Lee Imagen del disco */ f l =fopen(nombre,'W);/* Es un archivo binario(8ytes) */ if (fl = =NULi){Msg('Error No existe Archivo');} else { zona-proi=malloc(imagesize(O,O,l9,19));/* Lee zonas de 20 x 20 */ fseek(f1 ,&SEEK-SET); /* Se posiciona al inicio del archivo */ Msg(' Leyendo imagen de disco'); getviewsettings(&vp); /* Guarda parametros actuales */

bx=vp. right; by =vp.bottom; cleardeviceo; Activa-Ventana(); /* Guardara toda la pantalla */ for(i=O;i<32;i=i+l)

ax=vp.left;ay=vp.top;

/* Borra todas las ventanas abiertas */

for(j=O;jclO;j=j+l) { fread(zonagrot,l,66,fl); /* Lee 66 bytes por cada bloque */ if(ferror(fl)!=O){ Msg('Error de Disco: Archivo malo 3;

putimage~*2O,j*2O,zona~prot,COPY~P~; break;}

fclose(fl);

setviewport(ax,ay,bx,by,l); Titulo(' TURBO EDITOR GRAFICO U.A.M.1 *); Msg(' [ f l ] Menu de opciones ');

/* Cierra archivo,libera zona */ f ree (2mpot ) ;

/* restaura ventana grafca */

1 1

/* Procedmiento Salva una imagen en disco */ Salva-lmgo {

Page 49: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

void *zm,Plot; FILE *f1; char *nombre = NULL; int i,j; int ax,ay,bx,by; struct viewporttype vp;

Msg('Dar nombre del archivo:..'); lee cadena(nombre,2); TiU?o(..); Msg('3;

/* Salva Imagen en disco */ f l =fopen(nombre,'wb'); /* Es un archivo binario(6ytes) */ if (fl = =NULL)(MsgCError No hay espacio..');} else .( zona-prot=malloc(imagesize(O,O,l9,19));/* Lee zonas de 20 x 20 */ getviewsettings(&vp) ;

bx=vp.right;by =vp.bottom; /* Pide espacio y guarda parametros */ Activa-Venlanao ; fseek(f1 ,OLSEEK-SW; /* Posicion inicial */ for(i=O;i<32;i= i+ 1)

ax=vp.left; ay =vp.top;

foro= 0;j < 1 O;j= j + 1) { /* Copia zona de pantalla y la manda al buffer zonagrot */ getimagefi*20,j*20,(i*20) + 19,(j*20) + 19,zonagrot); /* escribe 66byies=imagesize(zona-prot */ fwrite(zonagrot,l,66,fl); ¡f(ferror(fl)!=O)( Msg('Error de Disco: No hay espacio.. I);

setviewport(ax,ay,bx,by,l): break;}

1 fclose(f 11; free (zonagrot) ; setviewpwt(ax,ay,bx, by, 1);

/* Cierra, libera, restaura ... *I

1 1

I* Muestra b tipos de rellenos que se tienen */

Rellenos(int *op) { int ax,ay,bx,by,style; int w,h,x,y,i,j; struct viewporttype vp; char *s=)ilULL;

zona-rell=malloc(imagesize(O,0,639,199));

getviewsettings(&vp); /* Crea espacio para toda la imagen actual */

Page 50: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

ax =vp. left; ay =vp. top; bx=vp. right; by =vp.bottom;

I* guarda parametros actules */ Activa-Ventana0 ; getimage(0,0,639,199,zona-reli); clearviewport();

sehriewport(5O,5O,450,2oO, 1); seffillstyle(SOUD-FIL1BLAC~; bar(0,OI400,15O); Marcoo;

getviewsettings(&vp) ; setcdor(WHm); settextjustify (LEFT-TEXT,TOP-TEXT);

/*Guarda toda la imagen actual */

/* Crea una nueva ventana de salida */

I* Pone rellenos *I w=2*((vp.right+ 1)/13); h=2*((vp.bottom-l0)/1 O); x = w/2; y = h/2; style=O; for(j=Qje3; + +jj

t fOr(i=O;i<4;+ +¡)

seffllstyle(style,MaxColors-l); bar(x,y,x+w,y+ h); rectangle(x,y,x+ w,y + h); outfmttext(x+ (w/2),y+ h+4; %d ',style); + +style; x + =(w/2)*3; 1

x = W E ; y + = (h/2)*3; 1

*op = atoi(s) ; iee-cadena(s,l); /* Pide opcion */

dearviewport0;

Activa-Ventana0 ; putimage(O,O,zona-rell,COPY-PUT); free(zoria-relí); setviewport(ax,ay,bx, by, 1); Marcoo; Titulo(' Editor Grafico U.A.M.I. 3; MsgC IF11 Menu de Opciones ');

/* Borra todos los rellenos y...*/

/* Vueive al estado anterior */ 1

Efectos(inr x,int y)

Page 51: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

P Crea los Efectos para el editor *I

int op,radio,angi,angf,fill,xradio,yradio; char *s=NULL;

Men~-Muttipie(4,20,20,170,1 sO,&op); switch(op) { case 1 :Msg(TTraza Linea');

line(tempx,tempy,x, y) ; break;

case 2:Msgpraza circulo.Dar radio...'); íee-cadena(s, 1);

circie(x,y,radio); break;

lee-cadena(s, 1);

MsgC Angulo final ...'); lee-cadena (s, 1 ) ;

MsgC Dar radio ... '); lee-cadena(s, 1);

arc(x, y, angi, angf, radio) ; break;

radío=atoi(s);

case 3:Mcgflraza un arco. Dar angulo inicial.. 3;

angi=atoi(s);

angf = ato¡ (s) ;

radio = ato@) ;

case 4:MsgC Traza Rectangulo ..:); rectangie(tempx, tempy ,x, y) ; beak;

case 5:Msg(7ipo de Relleno'); Reilenos(&fill) ; se!ñllstyle(fill,getcolorO ); Wtempx,tempy,x,y); break;

case 6:MsgCElipses. Dar radio eje x..'); lee-cadena(s, 1); xradio= atoi(s); MsgC I radio en y ...'); lee cadena(s,l); yra¿lio=atoi(s); Relienos(&fill); setfMyie(fil1,getcolorO ); fillellipse(x, y,xradio, yradio) ; break;

Rellenis(&fili); seffill~le(fill,getcolorO ); floodfS+,y,getcolorO + 1); break;

)I* switch *I

case 7:MsgC' Rellena Figura Cerrada ');

if( op !=I) </* Desperece la marca */ iempx =x; tempy =y;

Page 52: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/* void Presentacion(void)

Presenta Editor Grafico version 2.0 */

{ int seed = 1958; int i, x, y, h, w, color; struct vewpomype vp; int style,fiñ; void *zoM_plot; FILE * f l ; int j;

/* Lee Imagen del disco */ f l [email protected]','rtS);/* Es un archivo binario(Bytes) */ if (fl ==NüLL){MsgCFalta archivo UAM.TlF);} else

zonagrot=malloc(imagesize(0,0,19,19));/* Lee zonas de 20 x 20 */ fseek(f1 ,wSEEK-SET); /* Se posiciona al inicio del archivo */ Activa-VmaO; /* Guardara toda la pantalla */ for(i=O;ic32;i=i+ 1) for(i=O;jc lO;j=j+ 1) { fread(zonagtotl1,66,fl); /* Lee 66 bytes por cada bloque */ if(ferror@)!=O){ Msg('Error de Disco: Archivo malo ');

putimage(i*20,j*20,zona-prot,COPY-PUT); 1 fclose(fl); free(zonagr0t) ; Titulo(' TURBO EDiTOR GRAFICO U.A.M.1'); Msg('

1 getcho; clearviewport 0 ; Activa-Ventana0 ; Ventana( 'Presentacion del TURBO EDITOR GRAFICO' ); Tipo Leóa(3,HORIZ-DlRl3); settc%justrfy (LEFT-TUCT,TOP-TEXl); outtextxy(l5,l O,' TURBO Editor Grafico '); outteXky(l5,50,' Alumno: Adan Santos Cardona'); Inverso(15,100; P R O Y E C T O F I N A L',WHiTE,BLACK); getviewsa(tings( &vp ); h = vp.bOtt~m - vp.top; w = vp.rigM -vp.left;

break;}

/* Cierra archivo,libera zona */

Autor : ADAN SANTOS CARDONA 3;

Page 53: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

wand( seed );

for( ¡=O ; i<5OOO ; ++i){ x = l +random(w-l) ; y = l +random(h-1); color = random( MaxColors ); putpixel( x, y, color );

1

wand( seed );

for( i=O ; ¡<so00 ; + +i ){ x= l+random(w-1) ; y = l + r a n d o m ( h - l ) ; color = Setpixel( x, y ): if( color = = random( MaxColors ) )

sleep(1);

putpixel( x, y, O 1;

Msg('Tec1ee RETURN ');getchO; clearviewport(); Ventana(' UAMI-ASC '); Tipo_Letra(3,HORIZ_DIR,3); outtextxy(l50,SO;Editor Grafico'); outtexby(l50,lOo; U.A.M. IZTAPAUPA '); Tipo Letra(1 ,HORIZ-DIR,4); outt&txy(200,130,' Alumno: Adan Santos C:); Msg(' TECLEE RETURN...'); getcho; clearvieuporto ; Restaura0 ;

/* Pausa para continuar */ void Restaura(void) .( static char msg[] = 'Esc Termina o presione una tecla.....'; int c;

Msg( msg 1; c = getcho; if( ESC == c){ closegaph 0 ; exit( 1 };

) if( o == c)( c = gercho;

1 cleardevice();

Page 54: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/* Pone la ventana Grafka principal */ void Ventana( char *header )

int tam;

cleardevice0 ; setcolor( MaxCdorc - 1 ); Activa-Ventana0 ;

tam = textheight( 'H' ):

Tipo-Letra( DEFAULT-FONT, HORIZ-DIR, 1 ); settextjustrfy( CENTERTEXT, TOP-TUCT ); outte*( MaxXI2,Z header ); setviewpwt( O, tam+7, MaxX, MaxY-(tam+i), 1 ); Marcoo; Activa-Ventana0 ; setviewport( 1, tam+8, MaxX-1, MaxY-(tam+6), 1 );

/* Pone la tinea de mensajes [ Pie de pagina ] */ void Msg( char *msg )

i# tam;

Activa-Ventana0 ; setcolor( MaxColors - 1 ); Tipo-Lefra( DEFAULT-FONT, HORIZ-DIR, 1 ); settextjMrfy( CENTER-TEXT, TOPJEXT ); setlinestyle( SOUD-UNE, O, NORMWIDTH ); setfillstyle( EMPTY-FILL, O );

tam = tmhegM( 'H'); bar( O, kY-(tam+4), MaxX, MaxY ); rectangkrf O, MaxY-(tam+4), MaxX, MaxY ); outtextxy( M W 2 , MaxY-(tam+2), msg ); setviewpott( 1, tam+8, MaxX-1, MaxY-(tam+G), 1 );

/* Titulo ck cabecera para el editor */ void Titulo( char *msg ) { int tam;

Activa-WntanaO ; setcOlW MP~COIOTS - 1 );

Page 55: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

Tipo-letra( DEFAULT-FONT, HORIZ-DIR, 1 ); settextjustify( CENTER-TEXT, TOP-TEXT ); setlinestyle( SOLID-UNE, O, NORMWIDTH ); setfillstyle[ EMPTY-FILL, O );

tam = textheight( 'H'); bar( O, 1, MaxX, tam*2); rectangle( O, 1, MaxX, tam*2 ); outtextxy( MW2,tam, msg ); setviewport( 1, tam+8, MaxX-1, MaxY-(tam+G), 1 );

/* Imprime una cadena formateada a texto */ /* Ej : outfmttext(320,100,7itulo %s %d ','Graficador',lOO); */

void outfmext(int x,int y,char 'fmt,...) { va-list arggtr; char t [255l; va-stan(arggtr,fmt) ; vsprintf(t,knt,arggtr) ; va-end(arg-ptr) ; outtew&,yJ); 1

I* Dibuja el Marco de la ventana Grafka*/ void Marco(void) {

struct viewporttype vp; setcolor( MaxColors - 1 ); setlinestyfe( SOLID-UNE, O, NORMWIDTH ); getviewmings( bvp ); rectangle( O, O, vp.right-vp.left, vp.bottom-vp.top );

/* Pone color en white */

void Tipo-letra(int font, int direction, int charsize) {

/* Cambé el Tipo de Letra, checando que no Ocurra error

int ErrorCode; o faite memoria para continuar */

graphremito ; /* Inicializa la funcion */ settextstyb(fom, direction, charsize); Errorcode = graphresuito; /* Checa el resulatdo */ if( ErrorCode != grOk ){ /* si error entonces *I closegraph O; printf(' ñror en sistema Grafico : %s\n', grapherrormsg( Errorcode) );

Page 56: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

exit( 1 ); 3

1

/* Imprime una cadena en fondo inverso */ /* Ej: Inverso(lO,lO,Titulo ',WHITE,BiACK); *I void Invem(int x,int y,char *text,int back-color,int fore-color) {

struct textsettingstype txtinfo; int th,tw;

gettextsettings(&txtinfo) ; th =textheight(text); tw = textwidth (text); if(txtinfo.font) th++; seffillstyle(SOLID-Fl~~-color); bar(x,y,x+tw-1 ,y +th-1); setcolorflore-color) ; i f (txtinf o.íont) { outtextxy(x,y-th/4, text) ;} else {ouiiexbcy(x,y,text);} setcolor(1);

1

{ Return0

MsgC Tedee RElURN .... 3; W ;

}while(getchO!=l3); 1

/* ZONA DE TRANSFORMACIONES BIDIMENSIONALES *I

/* MENU Bidimensional */ void bidim

struct viewporttype vp; int ax,ay,bx,by; int op, k; float sx,sy,tempx; char *s=WU;

/* Empieza*/ Msgr Cuantos vertic es... 3; do{ lee-cadena(s,l);

}while( (n=atoi(s))= =O); marca-vertices( n) ;

Page 57: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

do{ gehr*Settings(&vp) ; ax=vp.left ; ay =vp.top; bx=vp.right;by=vp.bottom; /* Guarda la zona actual */ Msgr [l]Esmla [2]Rota [BITraslada [4]Salir] :'); lee-cadena(q3) ; op= atoi(s); switch(op){ case 1: escala();

case 2: rotaciono;

case 3: traslada();

break;

break;

break; default:

3 Titulo(' TURBO EDITOR GRAiiCO ');

Activa-VemmaO ; setviewport(~ay,bx,by,l);/* Restura posicion actual */ if(n!=O) /* W e figura borrarla */

{ setcoior(getcolor 0-1); dib@a(n); setcolor(getcoloro+ 1);

for(k=O;kcn;k+ +) /* Transforma */ 3

/* Dibuja: Un poligono en dos dimensiones con los puntos dados */ void dibuja(¡¡ 9 { int k=O;

for(k= O; k<Ci;k+ +){ iine((int)x[ k],[i)y(k], (int)x[ k + 1 ],(it%) y [ k+ I I);} iine((int)x[i-1).(int)y[i-l],(int)x[O],(int)y[0]); Return();

void inicial0 { int r,c; /* lnicializa matriz m */

for(r =O;r< 3;r + +) for(c=O; c < 3; c + +) {

#(r= = c) { m[ r] [c] = 1 .O; 1 eke { m[r](c]=O;O;)) m[O][O] = 1 .O;/* Para asegurar esta asignacion */

Page 58: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/* Marca ks vertices del poligono a transformarse */ void marca-vertices(int n) { int i; /* Marca vertices */ char *s=NUU; char *buii=NULL;

sprintf(bdf,' Dar coordenadas (x,y] ** %d puntos **',n); Msg(buff); for(i=O;i< n;++i)

sprintf(bM; x[ %d ] =',i+ 1); Msg(bun); m-ca-(s, 1); x[i]=atof(s);

mmlJf9;

y[¡] =atof@); 1

sprintf(M; y[ %d ] =',i+ 1);

lee-cadena( s, 1) ;

Msg('Figura Creada '); dibuja(n); 3

/* P r o c e d m i o que escala poiigonos */ void e- ) { float sx,sy,templ ,temp2; char *s=NULL; int xr,yri

i*ialo; MsgrFactor de escalamiento sx: '); lee-cadena(s, 1); sK=atof(s); MsgCFactor de escalamiento sy: '); k-cadena(s, 1); sy= atof (s) ; P Determina el punto medio de la figura */ temp1 =0;temp2=0; for(¡= O;¡< n; + + i) Lempl +=xi¡]; m p 2 +=y[¡]; 1 IS= (int) temp1 /n; y= (int) tempan;

mfü] [O] =sx;m[ 11 [ 1 ] =sy; epl2f [O] = (1 .O-sx)*xr; *2] [ 1 ] = (1 .O-sy)*yr;

Page 59: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

/* Procedimiento que rota el poligono */ void rotaciono { float asa,ca,templ ,temp2; int xr,yr,i; char *s= NULL;

inicial 0 ; Msg('Dar Angulo: '); lee-cadena@, 1); a= atof(s);

/* Determina el punto medio de la figura */ temp1 = O;temp2= O; fOr(i=O;i< il; + +i) { temp1 +=x[i]; temp2 +=y[¡]; 1 xr= (int) templ/n; yr= (int) tempan;

a=(douMe)(a*PI)/180.0; ca= cos( a) ; sa = sin (a) ; m[O] [O] =ca; m[O] [ 1 ] =sa; m[ 11 [O] =-sa;m[ 11 [ 11 =ca; m [2] [O] = ((double) (xr)) (1 .O-ca) + ((double) (yr))*sa; m [ 2) [ 1 ] = ((double) (y r))* (1 . O-ca) -( (dou ble) (xr))*sa;

1

/* Procedimiento que traslada el poligono marcado */ void traslada0 {int dx,dy; char *s=NUii;

inicialo; Msg('Trasiada Tx.. '); lee-cadena(s, 1) ; dx = atoi(S) ; MsgC..Ty 3; lee-cadena( s, 1) ; dy = atOi(s); m [ 21 [O] = (dou b1e)dx; m[ 21 [ 1 ] = (double)dy ;

1

/* Menu de opciones general para todos los procedimientos

posx> posicion inicial en x posy> posicion inicial en y tamx> tamano del menu en x tamy> tamano del menu en y

Parametros: modo> Tipo de menu a mostrar(Menu Gral, Tridim,Bidim)

Page 60: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

*op > Regresa la opcion seleccionada *I

Menu Mdipk(int modo,int posx,int posy,int tamx,int tamy,int *op) { int h&,ay, bx, by, color;

char *msgl ,*msg2, *msg3, *msg4,*rnsg5,

char *s=NüLL;

struct viewportty Pe VP;

*msg6.C msg7, msg8, *msg9, *msg 1 O, *msg 1 1, msg 1 2;

zona-temp= malloc(imagesize(O,O,tamx,tamy)); getviewseitings(&vp) ;

bx = vp. right; by = vp. bottom; Activa-Ventana0 ; getimagewx, posy, posx+ tamx, posy+ tamy ,zona-temp); setviewport@osx, posy, posx+ tamx, posy + tamy, 1) ; setfiIlstyle@OUD-FiLL, WH iTE) ; bar(2,2,gelmaxx()-2,getmaxy 0 -2); Marco0 ; Tipo-Letra(SMALL_FONT,HORIZ-DIR,4); h =text height ("') + 3; color=getcoiorO; setcolor(BtACK) ; sett extjustüy (LEFT-TEXT,TOP-TEXQ ; switch( modo) { case l:/* Menu uno */

ax =vp.leh; ay = vp.top;

msgl ='Graficas F(x,y,z)'; mq2= '1 x^2/a'2-yA2/b^2=z/c'; nsg3= '2 x^2/a^2+y^2/ba2=z/c'; msg4= 3 y'2/aa2-x'2/b'2=cz'; msg5='4 z=senx'; msg6= '5 z=seny';

msg9= '8 z=tanx'; msglO='9 z=tany'; m g l l ='lo z=cte'; mSg12=' OPCION:'; break;

case 2:P Menu dos */ msgl ='Grafkas F(x,y,z)'; rrisg2='1 x^2/a^2-~^2/b'2=~^2/c^T; msg3='2 x^2/a'2+y^2/b^2+~^2/~^2=1'; msg4='3 xA2/a^2+y^2/b^2-z^2/c^2=1'; m g 5 = '4 xa2+y'2+z^2= r-2; m596 = "; msg7="; m 8 = " ; mSg9="; nag1 O="; m g l l =";

m ~ g 7 = '6 Z=COS~'; msg8= '7 z=cosy';

niagl2=' OPCION:';

Page 61: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

break;

msg2='Fl [Menu ] ' ; msg3='F 2 [Inicia 1'; msg4=' F 3 rridimensional 1'; msg5=' F 4 [Bidirnensional 1';

msg7=' F 6 [Recupera imagen]'; msg8=' F 7 [Guarda imagen 1'; msg9=' F 8 [ > Color]';

msgll =' F 10 [ Parametros 1';

c a ~ 8 3: msgl-' E D I T O R ';

q O = ' F 5 [Efectos 1';

m ~ g l O = ' F 9 [ > Tipo]';

m~g12=' Teclee RETüRN '; break;

case 4: msgl =' Efectos Especiales '; msg2=' 1 [Linea ] '; msg3=* 2 [Circulo ] '; msg4=' 3 [Arco ] '; msg5=' 4 [Rectanguio ] '; msgO=' 5 [Rellena ] '; msg7=' 6 [Elipses ] '; msg8=' 7 [Rellena Area ] '; msg9 = "; mSglO="; msgl 1 ="; msg12=' Dar Opcion ';

break; case 5:msgl =' M e n u ';

mSg2="; msg3=' Parametros del Editor '; msg4="; msg5=' 1: Distancia I;

msgO="; msg7=' 2: Radio '; msg8="; msg9=' 3: Tipo de tinea *; msgl O="; msgl l ="; break;

1 outtextxyp,h msgl); outtextxy(i12*h ,msg2); outtextxy(i,3*h ,msg3); Outtextxy(7,4*h ,msg4); outtextxy(7,5*h ,rnsg5); outtextxy(i,6* h ,msg6); outtextxy(i,7*h ,msg7); outtextxyC7,8* h ,msg8) ; outtextxy(i,9*h ,msg9); out teW,lO*h ,msglO); outteXay(7,l l *h ,msgll);

Page 62: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

outtextxy(i,lPh ,msg12); /*leer opcion */ Inverso(7,l3*hI' OPCION ... ',WHiTE,BLACK); if(modo==3)( while(!kbhitO); } else{

lee-cadeOa(sl3); *op = ata (s) ; 1

clearviewporto; Activa-Ventanao ; putimage@osc,posy,zona-temp,COPY-PlJT) ; setviewport(Pcay,bx,by, 1); setcolor(cob) ; f ree(zona-temp) ; 1

/* Procedimierrto de captura de datos */ /* Lee de b ventana, escribe en modo grafico,

y pone un titulo segun el modo: modo 1 :Valor modo 2:Nombre modo 3:Opcion */

lee-cadena(cadena,modo) char *cadena;int modo; { int letra,ax,ay,bx,by; int th,tw,cdor; char buff[2]; struct wewpomy Pe VP; zona-aw= malloc(imagesize(O,O, 1 79,29));

buff[l]=lO; getviewsettings( &vp) ;

ax=vp.left; ay=vp.top; bx=vp.right;by=vp.bottom; /* Guarda la zona actual */ Activa-Ventana0 ; getimage(300,150,479,179,zona-aux); setviewport(300,150,479,179,1); setriiistyie(sOUD~Fi~BLACK); bar(2,2, getmaxx09,getmaxy 0 -2) ; Marcoo; Tipo_Letra~~iL-FOMIHORIZ-DIR,4); sett extj ust iíy (LE FT_TEXT,TO P-TEXT) ; switch(modo) { case 1 :Inverso(5,5,' Dar valor : case 2:lnverco(5,5,' Dar Nombre : case 3:inverso(5,5,' Dar Opcion : 1 th = text height CH') ; tw=textwidthCV\P); moveto(7,th+7); color= getcdoro; setcolor(WHm);

'(WHITE, BLACK) ;break; ',WHITE, BLACK); break;

',WHITE, BLACQ ; break;

Page 63: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

setfillstyie(SOUD-FllLBiACK); while((letra=getchO)! = EOL && letra! =R€i)(

buii[O] =letra; #(letra= =8)P BkSp */ { moveto(geaO-tw,getyO); bar(geb(0 ,wty O ,gehO + tw,sety O + th) ; *cadena-=letra;

else { outtext@uff);

3 3 *cadena=NULL; clearviewpotto; /* Borra zona de captura */ Activa-Ventana0 ; putimage(300,l SO,zona-aux,COPY-PUT); setviewport(ax,ay,bx,by,l);/* Restura posicion actual */ setcolor(cdor); f ree(zona-am) ; 1

*cadena+ +=letra;

/* FUNCIONES TRIDIMENSIONALES */

Plobcyz(int ahi b,int c,double ang) { /* Dibuja un pixel en 3D representandolo en modo PLOT */

int xp,yp; xp=ox+ba*cos(ang); y p= oy-(ca*sin(ang)) ; putpixehxyp,WHTTE);

1

lineaxyz(int qint y,int z) { /* Dibuja una linea recta dirigida al p(x,ylz) */ double x l ,y1 ; x l = (doubie)ox + y-(dou ble)x*Cos45; y1 = (doub&)oy-(z-(double)x*Cos45); lineto(x1 ,yl); 1

/* Funciones que calculan p(x,y,z) -> p(xp,yp) */ I* Warnigs 1 :2 Por autodocumentacion del programa mandamos los

parametros en ese orden, uno no se usa en una funcion pero si en la ma, como los ciclos mandan puntos (x,y,z) para convertirks a (xp,yp) es conveniente esto, *I

int xpi(int a,& b,int c,double ang) { return(ox+ c-a*m(ang)); 1

Page 64: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

I* Traza un paralelepipedo tridimensional */ I* Solo se dan ios 2 puntos opuestos y el */ I* algoritmo determina los restantes. */

cubo(int al.int a2,int a3,int bl ,int b2,int b3) (int i; for(¡ = 0;i e 4;i + +) /* Asigna los valores de z l y 22 */ ( pxyz[i].z=a3; I* z l */ pxyz[i+4].z=b3;) I* 22 */

for(i=O;ie 8;i+ +) I* Asigna los valores de x i y x2 */ ( if(i==oI ii==31 li==sl li==n

pxyz[i].x=al; /* x l */ else pxyzfil.x=bl;/* x2 */ 1

for(i=O;ie 8;i+ +) I* Asigna los valores de y1 y y2 */ ( i f ( i==Oll i==i I li==sl li==5)

pxyz[i].y=a2; /*y1 */ else pxyz[i].y=b2;/* y2 */

/*Transforma a puntos en dos dimensiones */ for(i=O;i< 8 ; b +) { PXY iil .x=xPi(pxy~Iil .x, pxyz[il .y, pxyzIi1 .z,ang) ; pxy[iI.y = ~ p i @ ~ ~ ~ I ~ l . ~ ~ ~ x y ~ ~ ~ l . ~ ~ ~ x y ~ ~ ~ l . ~ , ~ ~ g ~ ; 1 /* Traza el cubo tridimensional */ linea3(0,l);ha3(1 ,2);Iinea3(2,3); line~(4,5);~a3(5,6);linea3(6,7); iirie~(3,0);~nea3(7,4);1inea3(0,4); linea3( 1 , 5);ñnea3(2,6) ; linea3(3,7) ; 1

I* Casquetes esfericos */ /* z=ra2-x^2-y’2 */

casquetes0 (/* Grafica bs casquetes esfericos */ int a=50,b=50,z=50; int x,y,xp,yp,concavo;

Page 65: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

char *SI WU;

MsgC Dar parametro a.[2ü..So]'); lee-cadena@, 1); a = ato¡ (s) ; if(a> =20 88 a c E 50) a=%; Msg(' Dar pafametro b..[20..50]'); lee-cadena(s,l ); b= ato¡($; ií(b>=20 && be = So) a=%); Msg(' Dar parametro z..[20..50]'); lee-cadena@, 1); z=atoi(s); if(~>=20 88 b<= 50) ~ = 5 0 ; MsgC C o m a [l] Amba [2]Abajo [3] Ambos 3; lee-cadena@, 1); concavo=atoi(s); movet o (o~oy) ; if(concavo= =1 I I concavo ==3) { /* Dibuja hacia arriba el casquete */

for(y=-b;y < b;y+=5) for(x=-a;xea;x+=5) { z = 2500-(x*x)-(y*y); W(Z>O) 2 = (int)sqrt (2) ;

xp=m+y-x*cos45; yp= oy-(z-x*Cos45); if(x==-a)moveto(xp,yp); Iineto0,yp);

1

else z=O;

for (x= -w< a;x+ = 5) for(y=*;y < b;y+=5)

z=2500-(x*x)-(y*y); ¡f(z>q z=(int)sqrt(z); else z=O; xp= ox+y-x*cos45; yp=~-(Z-x*Cos45); #(y= =-b)moveto(xp,yp); linetWp,yp);

1 1

if(concava==2 I I concavo==3) { /* Trazafigura hacia abajo */

¡f(CWKXvO= =3) { oy=oy+30;3

ebei( o y = w for(y=-hj c b;y+=5) for(x=-ap<<a;x+ =5)

Page 66: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

2 =25oo.(x*x)-(y*y); n(z > O) r=(int)sqrt(z);

xp= ox+y-x*cos45;

if(x= =-a) moveto(xp,yp) ; lineto(xp,yp);

else z=O; z=-z;

yp= Oy-(Z-X*COS45);

3

for(x= -a;xc a;x+ = 5) for(y=-b;y < b;y+=5) { z=2500-(x*x)-(y*y); ¡f(z>O) z=(int)sqrt(z);

xp= ox +y-x*Cos45; yp=oy-(z-x*Cos45); ¡f(y= =-b)moveto(xp,yp); lineto(xp,yp);

1

else z=O; z=-2;

3 3

ejesxyzo {/* Traza los qes coordenados x,y,z con un angulo de 45 */ /* segun el origen actual ox,oy int i:

*/

rnoveto(ox, oy) : for(i=O;i< =W;i+ +)

lineaxyz(i,O,O); outtext(. x 3; moveto( ox, q) ; for(¡= O;¡< = 1 8Qi+ +)

outtext(. y 3; rnoveto (ox, cy) ; for(i=O;i< =9O;i++)

lineaxyz(O,O, í) ; outtext(. z 3;

li neaxyz (O, i, O) ;

esfera0 { /* Traza una esfera tridimensional segun su ecuacion parametrica

x(u,v) =r*sen(Pl*u)*cos(2*PI*v)

Page 67: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

y(u,v) -Psen(Pl*u)*sen(2*Pl*v) z(u,v) = Pcos(Pl*U) */

double x,y,z; double u= O.O,v=O.O,a,b,c,tempx=0,tempy=O; int r,i; char *s=NULL;

Msg(' Dar radio de la esfera[20..100] 3; lee-cadena(s,l);

if( re 20 && r >loo) r=50;/* Valida el radio */ /* Se mueve al origen de coordenadas */ moveto(ox, oy) ; set color( getcdoro) ; for(u=0.0; u <= 1; u=(double)u+0.05)(

r = atoi(s);

for(v=O.O;v <= 1; v=(double)v+0.05)

b= (double)r*sin(a); c= (double)2*PI*v; x= (double)0.988* b*cos(c); y = (double) O. 979* b*sin(c) ; z = (double) O. 987*r*cos(a);

( a=(double)PI*u;

xp= (double)(ox+ (doubie)y-(double) (x*Cos45)); yp= (double)(oy-((double)z-((double)x*Cos45)));

if(v= =O)( if(tempx! =O && tempy! =O)lineto(tempx,tempy); moveto (xp, y p) : tempx=xp;tempy=yp; 1

lineto(xp,yp) ; 1

3 moveto(ox,oy) ;

for(v=O.O;v < = 1; v=(double)v+0.05)( for(u=0.0; u <= 1; u=(double)u+0.05)

- ( a=(double)PI*u; b= (doubie)Psin(a); c= (double)2*Pl*v; x= (double)0.988*bfcos(c); y = (double)0.979* b*sin(c) ; z= (double) 0.987*r*cos( a);

xp= (double)(ox+ (double)y-(double)(x*Cos45)); yp= (double)(oy-((douMe)z-((double)x*Cos45))); ¡f(u==O.O)

moveto(xp,yp): lineto(xp,yp);

1

Page 68: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

3

3

cubos0 { /* Traza paraielepipedos trdimensionales */

int PxtPY,Pz,qx,qy,qz; char *S = NULL;

Msg(' Dar Pí (x,y,z] ... '); Msg('Dar x..'); lee-cadena@, 1); px=atoi(s); Msg('Dar y...3; lee-cadena@, 1); py = ato¡ (s) ; Msg('Dar z..?; lee-cadena@, 1); pz= atoi(s); Msg(' Dar P2[xly,z]..:); Msg('Dar x ..? ; lee-cadena(s,l); qx= atoi(s); Msg('Dar y...'); lee-cadena(s,l); q y = atoi(s); Msg('Dar z..?; lee-cadena@, 1); qz = ato¡( s) ; CUbO(PXl PYl PZIqx, w ,qZ) ; 3

pausa0 P Hace una pausa y borra imagen */ { getch0;dearviewportO;)

Tipo-uno(ii num) /* Grafica funciones z=f(x,y) */

int limx,Rmy; double i ,~ , yp ,a , b,c,z; char *s=NULL;

Msg(' Dar iimite x... ');ice-cadena(s.1);

Page 69: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

lim=atoi(s); MsgC Dar ñmiie y.,. ');ke-cadena(s,l); limy =atoi(s); /* Valida si hubo error en conversion o en el usuario */ if(1imx < O ) lim=lOo; if(limy < O ) limy=lOo; if(num==l I Inum==21 Inum==3){ MsgC Dar parametro a.:); lee-cadena(s, 1); a= at of (s) ;

Msgr Dar parametro b..?; lee-cadena@, 1);

*s=NULL;

b = at of (s) ; *s=NUU; /* Valida parametros Minimo y Maximo */ if( a <=O) a=5; if( b <=O) b=9; if( a > SO) a=W; if( b > So) b=%;

if( num==í I (num==21 Inum==31 Inum==lO) {

c = atof (s) ;

if( c <=O) c=9; 1

MsgC Dar parametro c... '); lee-cadena(s, 1);

*s=NUU;

/* Traza Grafica Tridimensional */ for(¡=-liwi < =limx;i=i+lO)

for(j=-limy;j< =limy;j=j+lO)

switch(num) { case 1 :z=c*( (¡*o 1 (a*a) - pj) 1 @*b) );break; case 2:z=c*( (¡*o /(a*a) + (i*i)/(b*b) );break; case 3:2=( (j*j)/(a*a) -(¡*o /(b*b) )/c; break; case 4:2= sino; break; case 5:z=sinQ;break; case 6:z=cos(i);break; case 'I:z=cosQ;break; case 8:z=tan(i);break; case 9:z= tan@; break; case 1 O:z=c;break; deíauit:z=O;

xp=ox+j-¡*Cos45; yp=oy-(z-i*cos45); ¡fQ= =-limy)moveto(xp,yp); lineto(xp,yp);

1

3

Page 70: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

foro = iimy ; j< =limy; j = j+ 1 O) for(i=-limx;i < =limx;i=i+lO) {

switch(num) { case 1 :z=c*( (Pi) / (a*a) - (j*j) / @*b) );break; case 2:z=c*( (Pi) /(a*a) + o*j)/(b*b) );break; case 3:2=( o*j)/(a*a) -(Pi) /(b*b) )/c; break; case 4:z=sin(i);break; case S:z=sin@;break; case 6:z= cos(¡); break; case ir:z=cosh];break; case 8:z=tan(i);break; case 9:z=tan@;break; case lO:z=c;break; defauW:z= O;

xp=ox+ j-i*Cos45; yp=Oy-(z-i*Cos45); if(¡= = -limx)moveto(xp,yp); lineto(xp,yp);

1

3

1

Tipo_dos(int num) /* Grafica funciones z=sqrt(f(x,y)) */ {

int linglimy,op,dx,dy, ~,j,w,yp,~b,c,~;

char *s=NUU double z;

MsgC Dar limite x... ?;lee-cadena(s,l); lim= ato@); MsgC Dar limite y... ');lee-cadena(s,l); limy= atoi(s); /* Valida si hubo error en conversion o en el usuario */

if(limy < O) fimy=lOü; if( num !=4){ MsgC Dar parametro a..');lee-cadena(s,l); a= atoi(s); Msgr Dar parametro b..');lee-cadena(s,l); b= atoi(s); /* Valida parametros */ if( a <=a) a=5;

if( num==l I I num= =2 I I num= =3){

if(limx < O) fimx=100;

if( b <=o) b=9;

MsgC Dar parametro c... 3; lee-cadena(s, 1);

Page 71: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

c=atui(s); it( c <=O) c-9; 3 3

Y(num==4) { MsgC Dar radio r... '); iee-cadena(s,l); r=atoi(s);ií(r<fí && r> 50) r=W; 3

/* Traza Grafca Tridimensional */ for(i=-iimx;i < =limx;i=i+lO)

for(j= 4imy;je = limy;j= j+ 1 O)

switch(num) { case 1: z=c*( (Pi) / (a*a) + (i*i) / (b*b) );

#(z> O){ z=sqrt(z);} else z=O; break;

case 2: z=(c*c)*(l- (Pi) / (a*a) + (j*j) / (b*b) ); if(z>O)( z=sqrt(z);} else z=O; break;

case 3: z=(( (j*j)/(a*a) + (Pi) /(b*b) )-1); if(Z>O){ z=sqrt(z)*c;} else z=O; break;

case 4:z= (r*r-i*i-j*j); #(z > O) { z= sqrt(z) ;} else z =o; break;

3

xp=ox+ j-ifCos45;

A(j= =-limy)moveto(xp,yp); yp=oy-(z-i*Cos45);

lineto(xp,yp); 3

for(j=-limy;jc =limy;j=j+ 1 O) for(í=-iimx;i <=limx;i=i+lO)

switch(num) { case 1: z=c*( (Pi) / (ata) + (i*i) / (b*b) ):

if(z>O){ z=sqrt(z);} else z=O; break;

case 2: z=(c*c)*(l- (Pi) / (a*a) + (j*n / @*b) ); #(Z > O) { z = sqn (2) ;} else z = O; break;

case 3: z=(( (j*j)/(a*a) + (¡*o /(b*b) )-1); if(z >O) { z= sqrt(2) *c;}

Page 72: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

else z=O; break;

case 4:2= (r*r-i*i-j*j); if@ > O) { z= sqrt(2);) else z=O; break;

1

xp=ox+j-i*CWS;

if(¡= =-limx)moveto(xp,yp); yp=oy-(z-i*Cos45);

iineto(xp,yp); 1

Msg(' Otra parte [l]Normal [2] desplazada [3]Sin graficar 3; lee_cadena(s,3) ; op=atoi(s); if(op==l I I op==2){

if(op= =2){ Msg(' Dar desplazamiento en x [0..100]'); lee-cadena(s, 1); dx=atoi(s); if(dX>O&&dX<loo) ox+=dx;

Msg(' Dar desplazamiento en y [O..SO]'); lee-cadena(s,l); dy = ato¡ (s) ; if( dy>o && dy<50) oy +=dy;

/* G r a b parte z=-sqrt(f(x,y)) */ for(i=-limx;i < =limx;i=i+lO)

for(j = -limy; j < =limy ;j= j+ 1 O) {

case 1: z=c*( ( i * i ) / (a*a) + U*i) / (b*b)); switch(num) {

if@> O)( z= Sqrt(2);) else 2-0; break;

case 2: z=(c*c)*(l- (¡*o / (a*a) + (i*i) / @*b) ); if(Z>O){ z=sqrt(z);) else z=O; break;

case 3: z=(( (j*j)/(a*a) + (Pi) /(b*b) )-1); if(z > O){ z = sqrt(z)*c;) else z = O; break;

case 4:2= (r*r-i*¡-pj); ¡f(z>O){ z=sqrt(z);) else z=O; break;

1 Z= -2;

Page 73: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

foro= -1irny;jc =limy;j= j+ 1 O) for(i=-limx;i c =limx;i=i+lO) .( switch(num) {

case 1: z=c*( (¡*o / (a*a) + Q*j) / (b*b) ); if(z>O)( z=sqrt(z);} else z=O; break;

case 2: z=(c*c)*(l- (¡*o / (a*a) + o*j) / (b*b)); if(z>O)( z=sqrt(z);} else z=O; break;

case 3: z=(( (j*j)/(a*a) + (¡*o /(b*b) )-1); if(z >O)( z=sqrt(z)*c;} else z=O; break;

case 4:2= (f r-i*i-j*j); ¡f(z>O)( z=sqrt(z);) else z=O; . break;

3 2=-z; xp=ox+j-ifCos45; yp= oy-(z-i*Cos45); if(¡= =-limx)moveto(xp,yp); lineto(xp, y p) ;

1 1

1

/* Mundo Tridimensional */

tridimo

int ax,ay,bx,by; int op,opcion,dx; int color; char *s = NULL; struct viewporttype vp; tona~aux=malloc(imagesize(O10,1491149));

i

getviewsettings(&vp) ; ax=vp.M; ay =vp.top; bx=vp.right; by =vp.bottom;

Page 74: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

Act iva-Vent ana0 ; getimage(S0,50,149,149,zona-aux); setViewpori(50,50,1 49,149,l); setfillstyle(EMPTY-Fl11,BLACK); bar(O,O,getmaxx0,getmaxyO); Marcoo; Tipo Letra(SMAU-FONT,HORIZ-DIRI4); setcolor(BLACK); setiextjustiíy(LEfl-TEXT,TOP-TEm ; Inverso(l2,l O,' Menu Tridimensional ',BLACK,WHiTE); Inverso(12,20,' 1:Tipo uno ',WHITE,BUCK); Inverso(l2,30,' 2:Tipo dos ',WHITE,BLACK); Inverso(l2,40,' 3:Ejes xyz ',WHITE,BiACK); Inverso(l2,50,' 4:Esfera ',WHITE,BIACK); Inverso(l2,60,' 5:Cubos ',WHITE,BIACK); Inverso(l2,70,' 6:Casquetes ',WHITE,BIACK); Inverso(l2,80,' 7:Mueve C(x,y)',WHITE,BLACK); Inverso(l2,90,' OPCION : ',BLACK,WHITE); op=getchO; clearviewporto; Activa-Ventana0 ; putimage(50,50,zona-aux,COPY-PüT) ; free(zona-aux); setViewpOrt(ax,ay,bx,by,l); switch(op) { case 'l':Menu-Muitiple(l,50,50,1 50,12O,&opcion);

case 2:Menu~Mutiple(2,50,50,150,120,&0pcion);

case 3':ejesxyzO;

case '4':

Tipo-uno(opcion) ; break;

ripo_dos (opcion) ; break;

break;

color=getcolorO; esfera& setcolor(color) ; break;

case '5':cubosO;break; case '6':casquetesO;break; case T:

MsgC Dar desplazamiento en x f 3 00..300]...B); lee-caáena(s, 1); dx=atoi(s);

MsgC Dar desplazamiento en y[-80..80]..:); lee-cadena(s, 1);

break;

l (dx >300 && dx < 300) OX +=dx;

dX=atoi(s); %(dx >SO&&dx < 80) ~y +=a;

default: BELL; 1

Page 75: ALUMNO ING. LEONEL HERNANDEZ PALESTINO …148.206.53.84/tesiuami/UAM5540.pdf · ... y el programa las estandariza segun sus coordenadas NORMALIZADAS En un sistema interactivo es

Tiiulo(' Mundo Tridimensional 3; MsgC [ F3] = MundoTridimensional'); 1