Primit i Vas

download Primit i Vas

of 98

description

grafica

Transcript of Primit i Vas

  • PRIMITIVAS DE SALIDA Curso de graficacin I

  • ContenidoDibujo de puntosAlgoritmos comunes de trazo de rectasAlgoritmos comunes de trazo de crculosOtras primitivasBibliotecas grficas en C y JavaUso de primitivas de bibliotecaPrincipios de animacinMejora de la animacin

  • La pantalla grficax = 0, y = 00Mxima x 1Mxima y 10x = Mxima x 1y = Mxima y 1

  • Dibujo de puntos en C y JavaCLa funcin putpixel(int x, int y, int color) dibuja un punto en la coordenada x,y con el color especificado.Ejemplo: putpixel(50,25,7) dibuja un punto color gris en la coordenada 50,25.

    JavaEn Java se dibuja en un objeto de la clase Graphics. No tiene una funcin para dibujar puntos pero puede usarse:Graphics g;g.drawLine(50,25,50,25);

  • Ejemplo 1#include #include

    using namespace std;

    int main(int argc, char *argv[]){ int i; initwindow(400, 300); for(i = 0; i< 1000; i++){ putpixel(rand()%400,rand()%300,rand()%15+1); } system("PAUSE"); closegraph(); return EXIT_SUCCESS;}

  • Trazo de lneas rectas paralelas a los ejesLa lnea recta es la ms fcil de dibujarLas lneas rectas paralelas a los ejes se pueden trazar un un simple lazo for.

    El siguiente cdigo traza un lnea horizontal desde x a x+ancho.

    for(i = x; i < x+ancho; i++) putpixel(i,y,color);

    De forma similar se traza un lnea vertical

  • Ejemplo#include #include

    using namespace std;

    void lineaH(int x1, int x2,int y, int color){ int dx; dx = x2>x1?x2-x1:x1-x2; for(int i=0;i

  • TareaEscriba funciones en C para dibujar a) una lnea vertical y b) una lnea diagonal a 45 grados, utilizando la primitiva para dibujar un punto.Ponga los parmetros adecuados en cada caso.

  • Una lnea recta debe dibujarse como una sucesin de pxeles.

    Efecto de escalera que se produce cuando se genera una lnea como una serie de pxeles. Dibujo de Lneas Rectas

  • Algoritmos para trazo de lneas rectas Algoritmo DDA, algoritmo incremental bsico con aritmtica de punto flotante.Algoritmo de Bresenham, algoritmo incremental complejo con slo aritmtica entera.

  • Algoritmo DDAEcuacin bsica de la recta m es la pendiente y b la interseccin con el eje y

  • Para cualquier intervalo Dx de x a lo largo de la recta, se puede calcular el Dy correspondiente como:Si la pendiente es positiva y menor que 1, se toman variaciones de x iguales a 1 y se calcula y con: Las rectas con pendiente mayor que 1, se invierten los papeles de x y de y.

  • void dda(int x1,int y1,int x2,int y2,int color){ int dx,dy,steps,k; float x_increment,y_increment,x,y; dx = x2-x1; dy = y2-y1; if(abs(dx)>abs(dy)) steps = abs(dx); else steps = abs(dy); if(steps==0)steps = 1; x_increment = (float)dx/steps; y_increment = (float)dy/steps; x = x1; y = y1; putpixel((int)x,(int)y,color); for(k = 1;k
  • Algoritmo de lnea de BresenhamSeccin de una pantalla de despliegue donde se desplegar un segmento rectilneo, comenzando desde la posicin (10, 10). Las posiciones de los pixeles se representan por las reas rectangulares numeradas.

  • Seccin de una pantalla de despliegue donde se desplegar un segmento rectilineo con pendiente negativa, comenzando desde la posicin (10, 12). El siguiente pixel que se grafique en cada uno de estos ejemplos ser aquel cuyo valor de y esta ms prximo a la posicin real de y sobre la recta.

  • Seccin de una retcula de la pantalla donde se desplegar una lnea que pasar por: De aqu se tiene que: Definimos:

  • la diferencia es Definimos pi como:donde c es: Obtenemos pi+1 de pi como:

  • Restando pi+1 y pi:Simplificando:El parmetro inicial es:

  • 1. De como entrada los extremos de la lnea. Almacene el punto del extremo izquierdo en (x1, y1) y el derecho en (x2, y2).2. El primer punto que se selecciona para desplegar es el punto del extremo izquierdo(x1, y1).3. Calcule Dx = x2 - x1, Dy = y2 - y1 y p1 = 2 Dy - Dx. Si p1 = 0, el siguiente punto ser (x1 +1, y1), sino ser (x1 +1, y1 +1).4. Incremente x en 1. Se seleccionar yi o yi +1 dependiendo si pi 0 o pi 0. En el primer caso

    y en el segundo

    5. Repita hasta que x llegue a x2.

  • void BresLine(int x1,int y1,int x2,int y2,int color){ int xerr,yerr,deltax,deltay,dist,incx,incy,i; xerr = 0; yerr = 0; deltax = x2-x1; deltay = y2-y1; if(deltax>0) incx = 1; else if(deltax==0) incx = 0; else incx = -1; if(deltay>0) incy = 1; else if(deltay==0) incy = 0; else incy = -1;Funcin en C para dibujar rectas con cualquier pendiente.

  • deltax = abs(deltax); deltay = abs(deltay); if(deltax>deltay) dist = deltax; else dist = deltay; for(i = 0; idist){ xerr -= dist; x1 += incx; } if(yerr>dist){ yerr -= dist; y1 += incy; } }}

  • Primitivas bsicas en CDefine el color de la plumavoid setcolor (int color); Regresa el color de la pluma actualint getcolor (void); Pone color de fondovoid setbkcolor(int color); Regresa el color de fondo actualint getbkcolor(void);

    Borra el puerto de visin actualclearviewport (void);

  • Primitivas de lneas en CDibuja lnea entre (x1,y1) y (x2,y2)void line (int x1, int y1, int x2, int y2); Dibuja lnea relativa al cursor grficovoid linerel (int dx, int dy); Dibuja lnea desde el cursor grfico a (x,y)void lineto (int x, int y); Mueve cursor grfico en forma relativavoid moverel (int dx, int dy);

    Mueve cursor grfico en forma absolutavoid moveto (int x, int y);

  • Polgono con linevoid poligono(int x, int y, int r,int c, int n){/*dibuja un polgono regular de n lados con centro en x,y inscrito en un crculo de radio r y de color c*/ float PI = 3.1415926535; float a = PI/2-PI/n; int x1 = (int)(x-r*cos(a)); int y1 = (int)(y+r*sin(a)); putpixel(x,y,c); setcolor(c); for(int i = 2; i
  • Polgono con linerelvoid poligono(int x,int y,int n, int d,int color){int x0=x,y0=y,x1=x,y1=y,k; double a=0,da=2*3.14159265358979/n; moveto(x0,y0); for(k = 0;k
  • TareaEscriba una funcin que dibuje una estrella de 5 picos. Ponga como parmetros las coordenadas del centro, la distancia del centro a uno de los picos y el color.Ayuda: note que los picos son vrtices de un pentgono.x, yDistancia centro pico

  • ProyectosHacer las siguientes primitivas con funciones en C. Utilice las primitivas de lnea de graphics.h.

  • Algoritmos de generacin de circunferenciasLa ecuacin de la circunferencia en coordenadas rectangulares esDe sta se puede despejar y como sigue:

  • Funcin en Cvoid PlotPoint(int xc, int yc, int x, int y,int c){ putpixel(xc + x,yc + y,c); putpixel(xc - x,yc + y,c); putpixel(xc + x,yc - y,c); putpixel(xc - x,yc - y,c); putpixel(xc + y,yc + x,c); putpixel(xc - y,yc + x,c); putpixel(xc + y,yc - x,c); putpixel(xc - y,yc - x,c);}void CircleSimple(int xc, int yc, int r,int c){ int x,y; double yr; x = 0; y = r; yr = r; PlotPoint(xc,yc,x,y,c);/* se cicla hasta trazar todo un octante */ while (x < yr){ x = x + 1; yr = sqrt(r*r-x*x); y = (int)round(yr); PlotPoint(xc,yc,x,y,c); }}

  • Crculo bsico en Javavoid CircleSimple(Graphics g, int xc, int yc, int r){ int x,y; double yr; x = 0; y = r; yr = r; PlotPoint(x,y); /* se cicla hasta trazar todo un octante */ while (x < yr){ x = x + 1; yr = Math.sqrt(r*r-x*x); y = (int)Math.round(yr); PlotPoint(x,y); }}

  • Algoritmo de circunferencia de BresenhamSe supone (xi, yi) la posicin ms prxima a la trayectoria, la siguiente posicin es por tanto (xi+1, yi) o bien (xi+1, yi-1).

  • Una medida de la diferencia de coordenadas puede definirse como:Definiendo pi como la diferencia de d1 y d2 tenemos

  • El valor de pi+1 es:Simplificandop1 se obtiene de (x1, y1) = (0, r)

  • 1. Seleccione la primera posicin como

    2. Calcule el primer parmetro como

    si pi

  • Algoritmo de punto medio para la circunferencia El mtodo de trazo del punto medio de la circunferencia se basa en la definicin de la funcin circunferencia: Un punto (x,y) arbitrario cumple con lo siguiente

  • Para decidir entre el punto (xk+1, yk) y (xk+1, yk-1) se utiliza la frmula anterior evaluada en el punto medio entre los dos pixelesSi pk
  • oSi pk
  • Punto medio en Cvoid CircleMidPoint(int xc, int yc, int r, int c){ int x, y, p; x = 0; y = r; p = 1 - r; PlotPoint(xc,yc,x,y,c);/* se cicla hasta trazar todo un octante */ while (x < y){ x = x + 1; if (p < 0) p = p + 2*x + 1; else { y = y - 1; p = p + 2*(x - y) + 1; } PlotPoint(xc,yc,x,y,c); }}

  • Punto medio en Javavoid CircleMidPoint(Graphics g, int xc, int yc, int r){ int x, y, p; x = 0; y = r; p = 1 - r; PlotPoint(g,xc,yc,x,y);/* se cicla hasta trazar todo un octante */ while (x < y){ x = x + 1; if (p < 0) p = p + 2*x + 1; else { y = y - 1; p = p + 2*(x - y) + 1; } PlotPoint(g,xc,yc,x,y); }}

  • Crculos en CDibuja un crculovoid circle (int x, int y, int r); Dibuja un arco de circuloVoid arc (int x,int y,int stangle,int endangle,int radius ); Dibuja una elipsevoid ellipse(int x, int y, int stangle, int endangle, int xradius, int yradius); Regresa las coordenadas del ltimo arco dibujadovoid getarccoords(struct arccoordstype *arccoords); Estructura utilizada por getarccoordsstruct arccoordstype { int x, y; int xstart, ystart, xend, yend; };

  • #include #include

    using namespace std;

    main(){ arccoordstype arco; initwindow(300,300); circle(100,100,50); ellipse(200,100,45,270,50,100); arc(200,200,0,135,50); getarccoords(&arco); cout

  • Dibujo de una compuerta andCentro de la compuerta: x, yx 2*tamanioy 2*tamaniox 2*tamanioy + 2*tamaniox +2 *tamanioy +2 *tamaniox + 2*tamanioy 2*tamanioArco con centro en: x + 2*tamanio, y Radio de:2*tamanio de 0 a 90 grados.Arco con centro en: x + 2*tamanio, y+1 Radio de:2*tamanio de 270 a 360 grados.x + 4*tamanio, yx + 6*tamanio, yx 4*tamanioy tamaniox 2*tamanioy tamaniox + 4*tamanioy + tamaniox + 2*tamanioy + tamanio

  • Dibujo de una compuerta andvoid dibujaAnd(int x, int y, int size){ int x1 = x-2*size; int y1 = y-2*size; line(x1,y1,x1,y1+4*size); line(x1,y1,x1+4*size,y1); line(x1,y1+4*size,x1+4*size,y1+4*size); line(x+4*size,y,x+5*size,y); line(x-2*size,y+size,x-3*size,y+size); line(x-2*size,y-size,x-3*size,y-size); arc(x+2*size,y,0,90,2*size); arc(x+2*size,y,270,360,2*size);}

  • Dibujo de una compuerta orCentro de la compuerta: x, yx 2*tamanioy + 2*tamaniox, y +2 *tamaniox,y 2*tamanioArco con centro en: x, y+2*tamanio Radio de:4*tamanio de 0 a 90 grados.viewport(x,y-2*tamanio,x+6*tamanio,y)x + 4*tamanio*cos(30), yx + 4*tamanio*cos(30)+tamanio, yx +2*tamanioy +tamaniox 4*tamanioy tamaniox 2*tamanioy tamaniox + 4*tamanioy + tamanioCirculo con centro en: x-4*tqamanio, y Radio de:4*tamanio.viewport(x-2*tamanio,y-2*tamanio, x+6*tamanio,y+2*tamanio)Arco con centro en: x, y - 2*tamanio+1Radio de:2*tamanio de 270 a 360 grados.viewport(x,y,x+6*tamanio,y+2*tamanio)x 2*tamanioy 2*tamanio

  • Funcin para dibujar compuerta orvoid dibujaOr(int x, int y, int size){ arccoordstype arco; int x1 = x-2*size; int y1 = y-2*size; int xp,yp; line(x1,y1,x1+2*size,y1); line(x1,y1+4*size,x1+2*size,y1+4*size); //arco superior delantero setviewport(x,y-2*size,x+4*size,y,true); arc(0,4*size,0,90,4*size); //arco inferior delantero setviewport(x,y,x+4*size,y+2*size+1,true); arc(0,-2*size+1,270,360,4*size); //arco trasero setviewport(x-2*size,y-2*size,x,y+2*size,true); xp = -(int)sqrt(4*size*4*size-4*size*size); circle(xp,2*size,4*size); setviewport(0,0,getmaxx(),getmaxy(),true);

  • //conexiones traseras xp = x1+xp+(int)sqrt(4*size*4*size-size*size); line(xp,y1+size,xp-size,y1+size); line(xp,y1+3*size,xp-size,y1+3*size); //conexione delantera xp = x+(int)(4*size*cos(30*pi/180)); yp = y-2*size+(int)(4*size*sin(30*pi/180)); line(xp,yp,xp+size,yp);}

  • Tarea1. Basndose en las primitivas de compuertas and y or escriba funciones para dibujar estas compuertas con diferentes orientaciones: hacia arriba, hacia la izquierda y hacia abajo.2. La primitiva drawOval(int x, int y, int w, int h) de Java dibuja una elipse enmarcada en un rectngulo como se muestra en la figura (las lneas punteadas no se dibujan). Defina una primitiva equivalente para dibujar una elipse en C utilizando la primitiva ellipse.x, ywh

  • Otras primitivasRectngulos rellenos: Los rectngulos rellenos pueden generarse fcilmente haciendo un barrido de lneas de rastreo desde la primera coordenada y a la segunda. El siguiente cdigo hace este trabajo:void Rectangulo(int x1,int y1,int x2,int y2){ int i; for(i = y1;i
  • Relleno de polgonos: el relleno opera calculando los tramos que se hallan entre la arista de la izquierda y la derecha del polgono. El algoritmo requiere conservar una lista ordenada respecto a y de las aristas activas en cada fase del proceso.Recorte de crculos: Se puede recortar todo el crculo respecto a un rectngulo. Si el crculo lo intercepta, se divide en cuadrantes y se aplica la prueba de aceptacin o rechazo trivial para cada uno. Tambin se aceptar y rechazar a nivel de pxel..Texto: el texto puede definirse mediante mapas de bits para cada conjunto de caracteres. Se dibuja usando la funcin CopyPixel del sistema.

  • Otras primitivas en Cvoid bar (int left, int top, int right, int bottom); void bar3d (int left, int top, int right, int bottom, int depth, int topflag); void drawpoly (int numpoints, int *polypoints); void fillellipse (int x, int y, int xradius, int yradius); void fillpoly (int numpoints, int *polypoints); void floodfill (int x, int y, int border); void pieslice (int x, int y, int stangle, int endangle, int radius); void rectangle (int left, int top, int right, int bottom); void sector (int x, int y, int stangle, int endangle, int xradius, int yradius); void setfillpattern (char *upattern, int color); void setfillstyle (int pattern, int color); void setlinestyle (int linestyle, unsigned upattern, int thickness);

  • Algoritmo pastelAlgoritmo para dibujar un diagrama de pastel.1. Iniciar ang = 02. Sum = suma de valores a representar3. Para todos los valores hacer4. Poner color del sector5. Dibujar sector desde ang/suma*360 hasta (ang + valor) /suma*3606. Incrementar ang en valor7. Fin para

  • #include void pastel(int n, float *a, int x, int y, int r){ float suma = 0,ang = 0; int i; for(i = 0; i
  • Primitivas de texto en CDespliega una cadena de texto en la posicin del CP void outtext (char *textstring); Despliega una cadena en la coordenada x,y void outtextxy (int x, int y, char *textstring); Define el tipo de justificacin para el texto void settextjustify (int horiz, int vert); Define la fuente, direccin y el tamao del texto void settextstyle (int font, int direction, int charsize); Define el tamao del texto void setusercharsize (int multx, int divx, int multy, int divy); Regresa el alto de una cadena de texto int textheight (char *textstring); Regresa el ancho de una cadena de texto int textwidth (char *textstring);

  • Primitivas de texto en C cont.Constantes de textoJustificacin vertical:

    LEFT_TEXT, CENTER_TEXT, RIGHT_TEXT

    Justificacin horizontal:

    BOTTOM_TEXT, VCENTER_TEXT, TOP_TEXT

    Fuentes:

    DEFAULT_FONT, TRIPLEX_FONT, SMALL_FONT, SANS_SERIF_FONT, GOTHIC_FONT, SCRIPT_FONT, SIMPLEX_FONT, TRIPLEX_SCR_FONT, COMPLEX_FONT, EUROPEAN_FONT, BOLD_FONT

  • Primitivas de texto en C cont.Tipos

    struct textsettingstype{ int font; // la fuente en uso int direction; // direccin del Texto int charsize; // tamao del carcter int horiz; // justificacin Horizontal int vert; // justificacin Vertical};

    void gettextsettings(struct textsettingstype *texttypeinfo);

  • Primitivas de texto en C cont.Otras formas de desplegar texto

    Flujo de salida grfico:

    std::ostringstream bgiout;

    Igual a outtext:

    outstream(std::ostringstream& out=bgiout);

    Igual a outtextxy:

    outstreamxy(int x, int y, std::ostringstream& out=bgiout);

  • Ejemplo Demo justificacin texto

  • ejemplo/* outtext example */ #include int main(void){ /* request autodetection */ int midx, midy; /* initialize graphics and local variables */ initwindow(300,100); midx = getmaxx() / 2; midy = getmaxy() / 2; /* move the CP to the center of the screen */ moveto(midx, midy); /* output text starting at the CP */ outtext("This "); outtext("is "); outtext("a "); outtext("test."); /* clean up */ getch(); closegraph(); return 0;}

  • /* settextstyle example */ #include /* the names of the text styles supported */char *fname[] = { "DEFAULT font", "TRIPLEX font", "SMALL font", "SANS SERIF_font", "GOTHIC_font", "SCRIPT font", "SIMPLEX font", "TRIPLEX SCRIPT font", "COMPLEX font", "EUROPEAN font", "BOLD font"};int main(void){ /* request autodetection */ int style, midx, midy; int size = 1; /* initialize graphics and local variables */ initwindow(600,200); midx = getmaxx() / 2; midy = getmaxy() / 2; settextjustify(CENTER_TEXT, CENTER_TEXT); for (style=DEFAULT_FONT; style
  • TareaEscriba una funcin en C para dibujar un diagrama de barras de un conjunto de hasta 10 datos. Incluya como parmetro un arreglo de cadenas para las leyendas.

    Escriba una funcin en C para dibujar un diagrama de pastel con sectores resaltados de un conjunto hasta de 10 datos. Incluya como parmetro un arreglo de cadenas para las leyendas.

  • TareaHaga una pequea animacin utilizando alguna de las tcnicas revisadas.

  • Atributos de las primitivas en bgiAtributos de lneaAtributos de rellenoAtributos de caracteres

  • Atributos de lneasEn bgi existen tres atributos para las lneascolorgrosorpatrn

  • ColorEl color se establece con setcolor(int color).Existen 16 colores predefinidos, del 0 al 15:BLACKBLUEGREENCYANREDMAGENTABROWN LIGHTGRAY DARKGRAYLIGHTBLUELIGHTGREENLIGHTCYANLIGHTREDLIGHTMAGENTAYELLOWWHITELa funcin COLOR(r, g, b) permite obtener cualquier color dados los valores las componentes de rojo, verde y azul.la funcin converttorgb(c) convierte a RGB de Windows.RED_VALUE(v) regresa el valor de rojo de un colorGREEN_VALUE(v) regresa el valor de verde de un colorBLUE_VALUE(v) regresa el valor de azul de un colorIS_BGI_COLOR(v) regresa verdadero si el color es BGIIS_RGB_COLOR(v) regresa verdadero si el color es RGB

  • Grosor y patrnExisten dos grosores de lnea predefinidos, pero puede usarse cualquier valor:NORM_WIDTH 1THICK_WIDTH 3Los patrones de lnea son:SOLID_LINE, DOTTED_LINE, CENTER_LINE, DASHED_LINE, USERBIT_LINELa funcin:setlinestyle(int linestyle,unsigned upattern,int thickness );Establece el tipo de lnea. El patrn definido por el usuario se establece con el entero sin signo upattern, cada bit de este entero de 16 bits especifica si se pinta o no un pixel.

  • ActividadDefina los siguientes patrones de lnea y dibuje algunas lneas con estos patrones:

  • Patrones de relleno de reasPara relleno de reas existen los siguientes patrones predefinidos:

    EMPTY_FILL, SOLID_FILL, LINE_FILL, LTSLASH_FILL, SLASH_FILL, BKSLASH_FILL, LTBKSLASH_FILL, HATCH_FILL,XHATCH_FILL, INTERLEAVE_FILL, WIDE_DOT_FILL,CLOSE_DOT_FILL, USER_FILL

    La funcin setfillstyle(int pattern,int color) define el patrn de relleno y el color.El relleno definido por el usuario se establece con setfillpattern( char *upattern,int color) el patrn de 8x8 se define mediante un arreglo de 8 caracteres. El siguiente ejemplo rellena con corazoncitos:

    char pattern[] = {0x66,0x99,0x81,0x81,0x42,0x24,0x18,0x00};setfillpattern( pattern, 15 );bar(200,200,300,300);

  • Actividad Defina los siguientes patrones de lnea y dibuje algunas figuras con estos patrones:

  • Funciones de manejo de ventanasSe pueden crear varias ventanas de despliegue. La funcin initwindow(), regresa un entero que permite identificar cada ventana.Para establecer la ventana actual se utilizasetcurrentwindow(int window);Para determinar la ventana que est en uso se utiliza:getcurrentwindow();

  • ActividadEscriba un pequeo programa que cree dos ventanas y deibuje algunas primitivas en cada una de ellas.

  • Manejo de imgenesSe pueden manipular reas de la pantalla mediante las siguientes funciones:imagesize( int left, int top, int right, int bottom ); - determina el tamao en bytes de una regin de la ventana.getimage( int left, int top, int right, int bottom, void *bitmap ); - lee una regin rectangular de la pantalla y almacena su contenido en la variable bitmap, se debe reservar espacio para almacenar la imagen.putimage( int left, int top, void *bitmap, int op ); - despliega la imagen previamente almacenada en bitmap. op puede ser: COPY_PUT, XOR_PUT, OR_PUT, AND_PUT, NOT_PUTreadimagefile(const char* filename=NULL, int left=0, int top=0, int right=INT_MAX, int bottom=INT_MAX); - lee un archivo de imagen en cualquier formato bmp, gif, jpg, ico, emf y wmf y lo muestra en el recuadro especificado.writeimagefile(const char* filename=NULL,int left=0, int top=0, int right=INT_MAX, int bottom=INT_MAX, bool active=true, HWND hwnd=NULL); - Escribe el recuadro de la imagen en un archivo bmp.Si el nombre del archivo es NULL se abre ventana de dilogo.

  • Ejemplo de imgenes#include

    main(){ initwindow(600,600); setactivepage(0); readimagefile("Creek.jpg",0,0,600,600); setactivepage(1); readimagefile("Desert Landscape.jpg",0,0,600,600); setactivepage(2); readimagefile("Forest.jpg",0,0,600,600); setactivepage(3); readimagefile("Humpback Whale.jpg",0,0,600,600); int p=0; char c; while(true){ c = getch(); if(c == '1') p =0; if(c == '2') p =1; if(c == '3') p =2; if(c == '4') p =3; if(c == 27) return 0; setvisualpage(p); }}

  • Demo de getimage putimagevoid PutImageDemo(void){ static int r = 20; static int StartX = 100; static int StartY = 50;

    struct viewporttype vp; int PauseTime, x, y, ulx, uly, lrx, lry, size, i, width, height, step; void *Saucer; int MaxX,MaxY; MaxX = getmaxx(); MaxY = getmaxy(); outtextxy(getmaxx()/2,0, "GetImage / PutImage Demonstration"); getviewsettings( &vp );

  • /* Draw Saucer */ setfillstyle(SOLID_FILL,getmaxcolor()); fillellipse(StartX, StartY, r, (r/3)+2); ellipse(StartX, StartY-4, 190, 357, r, r/3); line(StartX+7, StartY-6, StartX+10, StartY-12); circle(StartX+10, StartY-12, 2); line(StartX-7, StartY-6, StartX-10, StartY-12); circle(StartX-10, StartY-12, 2); getch(); /* Read saucer image */ ulx = StartX-(r+1); uly = StartY-14; lrx = StartX+(r+1); lry = StartY+(r/3)+3; width = lrx - ulx + 1; height = lry - uly + 1; size = imagesize(ulx, uly, lrx, lry);

  • Saucer = malloc(size); getimage(ulx, uly, lrx, lry, Saucer); putimage(ulx, uly, Saucer, XOR_PUT);

    /* Plot some "stars" */ for ( i=0 ; i

  • while ( !kbhit() ) { putimage(x, y, Saucer, XOR_PUT);/* draw image */ delay(PauseTime); putimage(x, y, Saucer, XOR_PUT);/* erase image */ step = rand()%( 2*r ); //mover if ((step/2) % 2 != 0 ) step = -1 * step; x = x + step; step = rand()%( r ); if ((step/2) % 2 != 0 ) step = -1 * step; y = y + step; if (vp.left + x + width - 1 > vp.right) x = vp.right-vp.left-width + 1; else if (x < 0) x = 0; if (vp.top + y + height - 1 > vp.bottom) y = vp.bottom-vp.top-height + 1; else if (y < 0) y = 0; } free( Saucer ); getch();}

  • ActividadHaga un programa que lea dos imgenes seleccionadas por el usuario y las muestre en ventanas separadas.

    Haga un programa que dibuje la siguiente figura y copie y pegue 10 copias de la figura en posiciones aleatorias de la pantalla.Color rosar = 255, g = 170, b = 170

  • Animacin simpleUna animacin simple puede lograrse como sigue:DibujarEsperar N msBorrarActualizar

  • main(){ initwindow(400,300); int x=rand()%400,y = rand()%50, vx = 5,vy = 5; while(true){ setcolor(WHITE); setfillstyle(1,WHITE); fillellipse(x,y,5,5); delay(30); setcolor(BLACK); setfillstyle(1,BLACK); fillellipse(x,y,5,5); x += vx; y += vy; if(x>400 || x300 || y
  • ActividadHaga una animacin que mueva 5 objetos a distintas velocidades rebotando en la pantalla. Los objetos deben dibujarse en diferentes colores.Los objetos podran ser, por ejemplo un cuadro, un crculo hueco, un tringulo, etc.

  • Dibujo de un carro(x, y)(x 3s, y s)(x 2s, y s)(x s, y 2s)(x + 2s, y s)(x + 3s, y s)(x + 3s, y)(x 3s, y)(x + s, y 2s)(x 2s, y + s/3)(x + 2s, y + s/3)

  • Dibujo de un carrovoid carro(int x, int y, int size){ moveto(x-3*size,y-size); linerel(size,0); linerel(size,-size); linerel(2*size,0); linerel(size,size); linerel(size,0); linerel(0,size); linerel(-6*size,0); linerel(0,-size); circle(x-2*size,y+size/2,2*size/3); circle(x+2*size,y+size/2,2*size/3);}(x, y)

  • ActividadUsando la tcnica anterior con linerel haga una funcin para dibujar alguna de las siguientes figuras.La figura debe poder dibujarse de cualquier tamao y en cualquier posicin.

  • Animacin con un fondoEsperar N msActualizarDibujar fondoDibujarBorrar pantalla

  • void carro(int x, int y, int size){ moveto(x-3*size,y-(size)); linerel(size,0); linerel(size,-size); linerel(2*size,0); linerel(size,size); linerel(size,0); linerel(0,size); linerel(-6*size,0); linerel(0,-size); circle(x-2*size,y+size/2,2*size/3); circle(x+2*size,y+size/2,2*size/3);}

  • void fondo(){ int x = 0; int d[] = {30,60,50,80,30,30,50,30}; int h[] = {70,100,140,30,80,30,60,70}; for(int i=0;i
  • main(){ initwindow(400,400); int x=0,d=3; char c; while(true){ cleardevice(); setcolor(WHITE); fondo(); carro(x,200,8); delay(30); x += d; if(x 400) d =-d; if(kbhit()){ c = (char)getch(); switch(c){ case 27:return 0; default: d =-d; } } }}

  • Dibujo de un carro rellenovoid carro(int x, int y, int size){ int p[16]; setcolor(WHITE); setfillstyle(SOLID_FILL,RED); p[0] = x-3*size; p[1] = y-size; p[2] = x-2*size; p[3] = y-size; p[4] = x-size; p[5] = y-2*size; p[6] = x+size; p[7] = y-2*size; p[8] = x+2*size; p[9] = y-size; p[10] = x+3*size; p[11] = y-size; p[12] = x+3*size; p[13] = y; p[14] = x-3*size; p[15] = y; fillpoly(8,p); setcolor(BLACK); setfillstyle(SOLID_FILL,BLACK); fillellipse(x-2*size,y+size/3,2*size/3,2*size/3); fillellipse(x+2*size,y+size/3,2*size/3,2*size/3);}(x, y)Se requiere usar fillpoly para rellenar el carro.

  • ActividadModifique la figura de la actividad anterior para que se dibuje con un relleno.

  • Dibujo de edificiosvoid fondo(){ int x = 0; int d[] = {30,60,50,80,30,30,50,30}; int h[] = {70,100,140,30,80,30,60,70}; for(int i=0;i
  • Fondo #1 while(true){ cleardevice(); setcolor(WHITE); fondo(); carro(x,200,8); delay(30); x += d; if(x 400) d =-d; if(kbhit()){ c = (char)getch(); switch(c){ case 27:return 0; default: d =-d; } } }Esperar N msActualizarDibujar fondoDibujarBorrar pantalla

  • Mejora de animacin con un fondoEsperar N msBorrarActualizaDibujar fondoDibujar

  • Fondo #2 while(true){ setcolor(WHITE); fondo(); carro(x,200,8); setcolor(BLACK); delay(30); carro(x,200,8); x += d; if(x 400) d =-d; if(kbhit()){ c = (char)getch(); switch(c){ case 27:return 0; default: d =-d; } } }

  • Doble bufferEl doble buffer hace uso de dos ventanas de salida, una visible y otra no visible. Las funciones en C son:

    setvisualpage(int n); establece la pgina visualsetactivepage(p); establece la pgina activaswapbuffers( ); intercambia la pgina visual y activaint getactivepage( ); obtiene la pgina activaint getvisualpage( ); obtiene la pgina visible

  • Animacin con doble bufferPoner pgina activa y visibleDibujar fondoDibujarIntercambiar pginasActualiza

  • while(true){ //dibuja en la pgina oculta setvisualpage(1-p); setactivepage(p); cleardevice(); fondo(); carro(x,200,8); delay(10); swapbuffers( ); p = 1-p; x += d; if(x 400) d =-d; if(kbhit()){ c = (char)getch(); switch(c){ case 27:return 0; default: d =-d; } }}Poner pgina activa y visibleDibujar fondoDibujarIntercambiar pginasActualiza

  • Implementacin en Cmain(){ initwindow(400,400); setactivepage(1); /* lee la imagen desde un archivo y la dibuja en la pantalla invisible*/ readimagefile("PGS_img01.jpg",0,0,400,400); size = imagesize(0, 0, 400, 400); /* reserva memoria para la imagen */ img = malloc(size); /* guarda le imagen en memoria */ getimage(0,0,400,400,img);// fondo(); int x=0,d=6,p=0,size=10; char c;

  • while(true){ setcolor(WHITE); //dibuja en la pgina oculta setvisualpage(1-p); setactivepage(p); setbkcolor(WHITE); cleardevice(); fondo(); carro(x,200,size); delay(30); swapbuffers( ); p = 1-p; x += d; if(x 400) d =-d; }}

    ********************************************************************