Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 1
Depto. Lenguajes y Simulacin - FEC
GRAFICOS EN C 4.1 Introduccin:
Para comenzar esta nueva unidad debemos inicialmente incorporar la biblioteca grfica en Turbo. Para ello hay que dar algunos pasos especiales para acceder durante las etapas de compilacin, encadenacin y corrida. 1. Compilacin: Para poder hacer llamadas a las funciones grficas de Turbo C en un programa, hay que dar primero los prototipos de esas funciones, y definir los tipos y las constantes simblicas usadas como parmetros. Estos prototipos, tipos y definiciones de constantes se encuentran en el archivo encabezado de la biblioteca grfica: graphics.h. Para incluirlo en un programa, hay que establecerlo entre las libreras de la siguiente manera: #include <graphics.h>
El archivo graphics.h debe estar en el directorio de los archivos "include" de Turbo C. La localizacin de este se define en el men Options, submen Directories.
5 Captulo
LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 2 Depto. Lenguajes y Simulacin - FEC
Adems de definir las funciones, tipos de datos y constantes grficas para el compilador, el archivo graphics.h sirve como una referencia rpida para el programador acerca de estas definiciones. 2. Encadenacin: Para encadenar las funciones de la biblioteca grfica que el programa usa, hay que seleccionar una opcin especial en el men de la siguiente manera: Entre al men Options, vaya al submen Linker y ah modifique la opcin Graphics Library para que tenga el valor On. La biblioteca grfica graphics.lib tiene que estar en el directorio Library (especificado en el men Options), submen Directories.
3. Corrida: Turbo C encadena el manejador grfico al programa de forma dinmica, es decir, en el tiempo de corrida. Hay un manejador grfico distinto para cada clase de adaptador. Este manejador puede estar en cualquier directorio, porque el programa especifica el camino donde se le debe buscar cuando llama a la funcin de inicializacin initgraph. Los manejadores grficos de Turbo C son archivos que tienen extensin ".BGI", tal como "CGA.BGI". Las funciones que llevan a cabo los grficos en C permiten generar dibujos y presentaciones de los programas en general (es decir, la forma en que lucen al usuario). Las funciones de salida dependen del adaptador y del monitor que se est utilizando. El controlador seleccionado se carga desde el disco durante la inicializacin de la biblioteca de grficos llamado initgraph(), y se necesita incluir la librera #include<graphics.h>. void far initgraph(int far *driver, int far *modo, int far *path);
LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 3 Depto. Lenguajes y Simulacin - FEC
Esta funcin es usada para cargar o validar un dispositivo grfico y cambiar el sistema de vdeo a modo grfico. La funcin initgraph debe ser llamada antes de cualquier funcin que genere una salida grfica. Existen varios valores a ser usados para el argumento *driver. Si *driver es asignado a DETECT, 0, la funcin detectgraph es llamada, y un dispositivo y modo grfico apropiados son seleccionados. Asignando a *driver cualquier otro valor predefinido inicia la carga del dispositivo grfico correspondiente. Existen varios valores a ser usados para el argumento *modo. Estos valores deberan corresponder al dispositivo especificado en el argumento *driver. El argumento *path especifica el directorio donde los dispositivos grficos estn localizados. La funcin initgraph buscar el dispositivo primeramente en este directorio. Si no es encontrado, la funcin buscar en el directorio de inicio. Cuando el argumento *path es NULL, solamente el directorio de inicio es buscado.
Otra forma para evitar cargar el dispositivo desde el disco cada vez que el programa es ejecutado es ligarlo o enlazarlo al dispositivo apropiado en un programa ejecutable.
La funcin initgraph no retorna ningn valor. Sin embargo, cuando la funcin initgraph es llamada, el cdigo de error interno es activado. Si la funcin initgraph termina con xito, el cdigo es asignado un 0. Si no, el cdigo es asignado as:
-2 grNotDetected La tarjeta grfica no se encontr -3 grFileNotFound El fichero del dispositivo no se encontr -4 grInvalidDriver El fichero del dispositivo es invlido -5 grNoLoadMem No hay suficiente memoria para cargar el dispositivo
Ejemplo:
#include <graphics.h> #include <conio.h> void main() { int driver = EGA; int modo = EGAHI; initgraph( &driver, &modo, C:\\TC20\\BIN ); circle( 300, 200, 80 ); getch(); /* Pausa */ closegraph(); getch(); } Para activar el modo grafico en C, debe de empezar llamando a la funcin initgraph(), que inicializa el paquete de grficos BGI. LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 4 Depto. Lenguajes y Simulacin - FEC
4.2 Estructura de un programa grfico:
1. incluir la librera grfica: #include<graphics.h> 2. inicializar el modo grfico. 3. Dibujar algo. 4. Cerrar el modo grafico.
4.3 Mtodos para inicializar el modo grfico:
Existen dos mtodos para inicializar el modo grafico: 1. MTODO: indicar directamente el adaptador y el modo. #include<graphics.h> #include<stdio.h> #include<conio.h>
void main(void) {
int adap,modo,codigo; adap = VGA, modo=VGAHI; initgraph(&adap,&modo,"c:\\tc20\\bin"); if((codigo=graphresult())!=0) /*regresa un error de la ltima llamada a una funcin grfica de Turbo C un 0 significa que no hubo error*/ { printf("%s",grapherrormsg(codigo)); /*regresa una cadena que contiene la descripcin del error*/ exit(1); } circle(100,100,50); /*dibuja un circulo con centro x,y y radio 50*/ sleep(3); /*genera un retardo de 3 milisegundos*/ restorecrtmode(); /*cierra el modo grfico poniendo el adaptador en modo texto*/ getch(); } 2. MTODO: permitir que C seleccione el adaptador y el modo ms conveniente. #include<graphics.h> #include<stdio.h> #include<conio.h> void main(void) { int adap = DETECT,modo,codigo; initgraph(&adap,&modo,"c:\\tc20\\bin"); if((codigo=graphresult()) !=0 ) LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 5 Depto. Lenguajes y Simulacin - FEC
{ printf("%s",grapherrormsg(codigo)); exit(1); } setcolor(RED); /*fija el color actual del dibujo*/ rectangle(50,50,150,150); /*dibuja un rectngulo con izq. superior 50,50 (x1,y1) y der. inferior 150,150 (x2,y2)*/ restorecrtmode(); getch();
}
4.4 Funciones Grficas para el dibujo de primitivos graficos:
Antes de entrar en detalle hay que conocer que es un primitivo grfico. Un primitivo grfico es un elemento fundamental de dibujo en un paquete grafico tal como un punto, lnea, o circulo; puede ser un carcter, o puede ser una operacin tal como relleno, coloreado o trasferido de la imagen. Este cuenta con 5 grupos de primitivos grficos.
1. Figuras geomtricas: Dibujan las figuras de la geometra clsica: lneas, crculos, rectngulos, arcos, polgonos etc.
2. Relleno: tiene dos formas de realizarse. El primero es con polgonos, donde se definen los vrtices del polgono a ser rellenado segunda es una operacin grafica que busca algortmicamente las fronteras de la regin del relleno.
3. Rasterop: Es una operacin grafica que copia el rea de una imagen para luego dibujarla en cualquier regin de la pantalla.
4. Grficas Matemticas: Dibujan los primitivos barras y sectores para conseguir dibujar las herramientas del sector.
5. Texto Grfico: Sirve para escribir texto en modo grafico, utilizando diferentes fuentes.
1. FIGURAS GEOMETRICAS: putpixel (int x, int y, int col); Dibuja un pixel (punto) en la posicin (x,y) con el color col. El pxel es el rea ms pequea de la pantalla que se pueda controlar. La funcin putpixel no retorna ningn valor.
Ejemplo: LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 6 Depto. Lenguajes y Simulacin - FEC
#include <graphics.h> #include <conio.h> void main() { int driver = EGA,modo = EGAHI,t; initgraph( &driver, &modo, c:\\tc20\\bin ); for( t=0; t<200; t++ ) putpixel( 100+t, 50+t, t%16 ); getch(); closegraph(); } LINEAS line (int x1, int y1, int x2, int y2); Dibuja una lnea desde (x1, y1) hasta (x2, y2) usando el color fijado por setcolor y el patrn y grosor de lnea fijados por setlinestyle. Esta funcin es usada para conectar dos puntos con una lnea recta. El primer punto es especificado por los argumentos x1 e y1. El segundo punto es especificado por los argumentos x2 e y2. La lnea se dibuja usando el estilo de lnea actual, el grosor, y el color actual. La posicin del cursor grfico no es afectada por la funcin line.
La funcin line() no retorna ningn valor.
Ejemplo:
#include <graphics.h> #include <conio.h> void main() { int driver = EGA,modo = EGAHI; initgraph( &driver, &modo, "c:\\tc20\\bin" ); line( 20, 40, 350, 100 ); line( 400, 30, 50, 250 ); LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 7 Depto. Lenguajes y Simulacin - FEC
getch(); closegraph(); }
RECTANGULOS. rectangle (int x1, int y1, int x2, int y2); Dibuja un rectangle con izquierda superior (x1, y1) y derecha inferior en (x2, y2) usando el color fijado por setcolor y el patrn y grosor de lnea fijados por setlinestyle.
CIRCULOS. circle (int x, int y, int rad); Esta funcin se utiliza para dibujar un crculo. Los argumentos x e y definen el centro del crculo, mientras que el argumento radio define el radio del crculo. El crculo no es rellenado pero es dibujado usando el color actual.
LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 8 Depto. Lenguajes y Simulacin - FEC
El grosor de la circunferencia puede ser establecido por la funcin setlinestyle; sin embargo, el estilo de la lnea es ignorado por la funcin circle.
ARCOS void arc (int x, int y, int ang1, int ang2, int rad); Dibuja un arco con centro (x,y), ngulo inicial (en grados) ang1, ngulo terminal (en grados) ang2 y radio rad, usando el color actual y el grosor de lnea fijado por setlinestyle.
Fig. 1 Salida de las funciones putpixel, line y rectangle. LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 9 Depto. Lenguajes y Simulacin - FEC
Esta funcin crear un arco circular. El arco tiene como centro el punto especificado por los argumentos x e y, y es dibujado con el radio especificado: rad. El arco no est rellanado, pero es dibujado usando el color actual. El arco comienza al ngulo especificado por el argumento ang1 y es dibujado en la direccin contraria al de las agujas del reloj hasta llegar al ngulo especificado por el argumento ang2. La funcin arc usa el este (extendindose hacia la derecha del centro del arco en la direccin horizontal) como su punto de 0 grados. La funcin setlinestyle puede usarse para establecer el grosor del arco. La funcin arc, sin embargo, ignorar el argumento trama de la funcin setlinestyle.
La funcin arc no retorna ningn valor.
Ejemplo:
#include <graphics.h> #include <conio.h> void main() { int driver = EGA,modo = EGAHI,radio; initgraph( &driver, &modo, "C:\\tc20\\bin" ); for( radio = 25; radio < 175; radio += 25 ) arc( 320, 175, 45, 135, radio ); getch(); /* Pausa */ closegraph(); }
drawpoly (int puntos, int *vertice); Dibuja una polilnea (una figura de segmentos de lneas unidas) de npuntos vrtices usando el color actual fijado por setcolor y el patrn y grosor de lnea fijados por setlinestyle. Las coordinas de los vrtices estan en el arreglo vrtice que tiene (2 * npuntos) elementos ordenados: x1, y1, x2, y2, . . . xn, yn. Dibuja de (x, y) a (x2, y2) de (x2, y2) a (x3, y3) . . . de (x n-1 , y n-1 ) a (x n , y n ). el primer punto tiene que repetirse al final de la lista para cerrar la figura. LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 10 Depto. Lenguajes y Simulacin - FEC
Ejemplo: Uso de drawpoly para dibujar un pentgono: void main (void) { int penta[ ] = {5,20,15,20,18,12,10,7,2,12,5,20} ; inicializar( ) ; drawpoly(6, penta) ; cerrar_modo( ) ;
}
ELIPSES ellipse (int x, int y, int comienzo_angulo, int final_angulo, int x_radio, int y_radio); Esta funcin es usada para dibujar un arco elptico en el color actual. El arco elptico est centrado en el punto especificado por los argumentos x e y. Ya que el arco es elptico el argumento x_radio especifica el radio horizontal y el argumento y_radio especifica el radio vertical. El arco elptico comienza con el ngulo especificado por el argumento comienzo_angulo y se extiende en un sentido contrario a las agujas del reloj al ngulo especificado por el argumento final_angulo. La funcin ellipse considera este - el eje horizontal a la derecha del centro del elipse - ser 0 grados. El arco elptico es dibujado con el grosor de lnea actual como es establecido por la funcin setlinestyle. Sin embargo, el estilo de lnea es ignorado por la funcin ellipse.
Fig. II.2 salida del programa usando drawpoly LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 11 Depto. Lenguajes y Simulacin - FEC
Fig. 3 Salida de las funciones circle, arc y ellipse.
2. RELLENO: A continuacin se presentan las funciones para fijar e interrogar los atributos asociados con las funciones de dibujo de primitivos grficos de la seccin anterior. Los atributos son las caractersticas no geomtricas de los primitivos, tales como color, patrn de lnea, fuente de caracteres, etc. Tambin se presenta una funcin para leer el valor de un pxel. void setcolor (int col_actual); Fija el color actual de dibujo a col_actual. Este color se usa para los primitivos dibujados por las funciones line, linerel, linito, rectangle, circle, arc, ellipse y drawpoly; sirve para el permetro en las funciones fillpoly, pieslice y bar3d. en realidad, esta funcin fija solamente el valor de pxel con el cual se dibuja, pero el color real que corresponde a este valor de pxel depende del contenido del mapa de color.
int setcolor (void); Devuelve el color actual de dibujo (fijado por setcolor). void setlinestyle (int estilo, unsigned patron, int grosor); Fija los atributos de estilo y grosor de las lneas dibujadas por algunas funciones de dibujo. El parmetro de estilo escoge uno de varios estilos predefinidos tales como punteado, quebrado, etc. El parmetro grosor selecciona un grosor de 1 de 3 bits. La figura II.1 demuestra los estilos predefinidos de lnea, con los dos grosores, el tipo de lnea por defecto es continuo, con grosor normal.
LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 12 Depto. Lenguajes y Simulacin - FEC
Controla el estilo y grosor de las lineas dibujadas con las funciones line, linerel, linito, rectangle, drawpoly, fillpoly y bar3d. En pieslice, fija el patron y grosor de los radios. En en pieslice, circle, arc y ellipse, fija el grosor de la circunferencia, pero esta se dibuja como una curva continua a pesar del valor de patron.
Grosor Estilo NORM_WIDTH THICK_WIDTH SOLID_LINE DOTTED_LINE CENTER_LINE DASHED_LINE USERBIT_LINE Fig. II.1 Estilos y grosores de lneas. int getlinesettings (struct linesettingstype *info); Devuelve a travs de una estructura de tipo struct linesettingstype (definida en GRAPHICS.H) los valores actuales de los atributos de lnea fijados por setlinestyle. int getpixel (int x, int y); Devuelve el valor del pxel que est en la posicin (x, y).
6. COORDENAS ABSOLUTAS Y RELATIVAS La mayora de las funciones de Turbo C trabajan en el sistema de coordenadas absolutas, donde la posicin de un punto se expresa como una distancia desde el origen de la pantalla. Turbo C tambin proporciona un pequeo grupo de funciones grficas que utilizan el sistema de coordenadas relativas, donde la posicin de un punto se expresa como una distancia relativa a una posicin actual. Esta posicin actual tambin se llama puntero grfico (PG), aunque no tiene cursor o marcador visible. El PG puede ser ubicado explcitamente, o implcitamente como efecto colateral al dibujar algo en coordenadas relativas. Las funciones moveto y moverel fijan la posicin del PG, usando coordenadas absolutas y coordenadas relativas respectivamente. Es decir, moveto especifica la nueva posicin del PG relativa al origen, mientras moverel la especifica relativa a la posicin anterior del PG.
Las funciones linerel y lineto dibujan lneas usando el PG como punto inicial y especificando el otro punto terminal, con la diferencia de que linerel usa coordenadas relativas para su punto terminal y lineto usa coordenadas absolutas para este. Ambas funciones dejan el PG en el segundo punto terminal. LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 13 Depto. Lenguajes y Simulacin - FEC
La otra funcin que usa coordenadas relativas es outtext, que ser presentada en la seccin sobre funciones de texto. Adems de estas 5 funciones mencionadas, no hay otras funciones que afecten la posicin del PG. Para obtener las coordenadas (x,y) del PG, existe tambin el par de funciones getx y gety.
Conviene usar el PG cuando queremos definir una figura independiente de la posicin especfica de la pantalla donde ser dibujada. El primer punto se ubica relativo al PG, los dems puntos se ubican relativos al punto anterior.
7. Funciones de Coordenadas Relativas y del Puntero Grfico
void moveto (int x, int y) Mueve el PG a la posicin absoluta (x,y).
void moverel (int dx, int dy) Mueve el PG una distancia (dx,dy) relativa a su posicin actual.
void lineto (int x, int y) Dibuja una lnea desde el PG a (x,y), dejando el PG en (x,y).
void linerel (int dx, int dy) Dibuja una lnea desde el PG a una distancia relativa (dx,dy), dejando el PG en la nueva posicin.
int getx (void) Devuelve la coordenada x del PG.
int gety (void) Devuelve la coordenada y del PG.
8. LAS FUNCIONES DE TEXTO GRFICO
void outtextxy (int x, int y, char *cadena) Imprime el texto cadena justificado con respecto a la posicin (x,y) usando el color, la fuente, la justificacin y el estilo de texto actual. Si la cadena entera no cabe dentro de la pantalla, imprime solamente la parte de la cadena que cabe. Si la fuente es de puntos, imprime los caracteres que caben completamente en la pantalla (sin recortarse), mientras con una fuente de plumados se imprime la parte que cabe, incluso imprimiendo caracteres parciales si estos salen de la pantalla.
void outtext (char *cadena) Imprime la cadena de texto cadena justificada con respecto al PG usando el color, la fuente, la justificacin y el estilo de texto actual. Avanza el PG al final del texto (para poder imprimir otro texto adjunto.) Funciona igual que outtextxy pero con coordenadas relativas, y moviendo el PG.
LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 14 Depto. Lenguajes y Simulacin - FEC
void settextstyle (int nuevoFuente, int direccion, int tamano) Fija la fuente, la direccin de escritura y el tamao del texto a los valores de los parmetros nuevoFuente, direccion y tamano. Hay una fuente de caracteres de puntos y cuatro fuentes de plumados. La direccin puede ser horizontal o vertical. El tamao puede ser un factor integral de agrandamiento en la horizontal y la vertical. Para las fuentes plumadas, se puede optar por una definicin de tamao ms flexible por medio de la funcin usercharsize. La figura II.9 demuestra las fuentes disponible, el control de direccin y el control del tamao. A continuacin se dan los valores predefinidos para cada parmetro.
fuente Clase de Caracteres
DEFAULT_FONT 8 x 8 matriz de puntos TRIPLEX_FONT plumado triplex SMALL_FONT plumado pequeo SANS_SERIF_FONT plumado sans serif GOTHIC_FONT plumado gtico
direccin descripcin
HORIZ_DIR horizontal (de la izquierda a la derecha) VERT_DIR vertical (de abajo hacia arriba)
tamao descripcin
USER_CHAR_SIZE Usa el tamao fijado en la fn. setusercharsize. 1-10 Escala (1=ms chica, 10=ms grande)
Por defecto se usa la fuente DEFAULT_FONT con tamao 1 y direccin horizontal.
void settextjustify (int justhoriz, int justvert)
Fig. II.3 Las Fuentes, Direcciones y Tamaos de settextstyle. LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 15 Depto. Lenguajes y Simulacin - FEC
Fija el tipo de justificacin del texto en las direcciones horizontal y vertical. Se justifica con respecto a un punto de referencia (x,y) en el caso de outtextxy, o con respecto al PG en el caso de outtext. A continuacin se dan los valores predefinidos para los parmetros.
justhoriz Ubicacin Horiz. con Respecto al Punto de Ref.
LEFT_TEXT la izquierda del texto CENTER_TEXT centro horizontal del texto RIGHT_TEXT la derecha del texto
justvert Ubicacin Vertical con Respecto al Punto de Ref.
TOP_TEXT la parte superior del texto CENTER_TEXT el centro vertical del texto BOTTOM_TEXT la parte inferior del texto
Para entender la justificacin del texto, imagine que hay un rectngulo que encierra el texto. La justificacin orienta este rectngulo con respecto al punto de referencia. Por ejemplo, justificacin a la izquierda en la horizontal y al fondo en la vertical ubicar el rectngulo del texto con su esquina izquierda inferior en el punto de referencia. Justificacin del centro en la horizontal y la vertical ubicar el centro del rectngulo sobre el punto de referencia. La justificacin por defecto es (LEFT_TEXT,TOP_TEXT). La figura II.10 demuestra las posiciones de justificacin relativas a una cadena de texto.
void gettextsettings (struct textsettingstype *infoTxt) Carga en la estructura infoTxt los valores actuales de los atributos de texto fijados por las funciones settextstyle y settextjustify. La definicin de la estructura en GRAPHICS.H es: struct textsettingstype { int font; /* fuente */ int direction; /* direccin */ int charsize; /* tamao */ int horiz; /* justificacin horizontal */ int vert; /* justificacin vertical */ };
void setusercharsize (int mulx, int divx, int muly, int divy);
Fig. II.4 Posiciones de Justificacin Horizontal y Vertical de Texto. LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 16 Depto. Lenguajes y Simulacin - FEC
Fija el tamao de los caracteres por un factor de (mulx / divx) en la horizontal y por un factor de (muly / divy) en la vertical. Sirve solamente para fuentes plumadas, y est vigente slo cuando se ha escogido el tamao USER_CHAR_SIZE en la funcin setcharstyle. Por ejemplo, para dibujar texto con la fuente triplex a una escala de 1.5 horizontal x 2.25 vertical (3/2 x 9/4), se hace lo siguiente:
La figura II.11 demuestra algunos caracteres con escalas fraccionarias definidas independientemente en la vertical y la horizontal.
9. Resolucin y Nmero de Colores
int getmaxx (void); Regresa la coordenada mxima en la direccin horizontal para el modo de operacin actual del adaptador.
int getmaxy (void); Regresa la coordenada mxima en la direccin vertical para el modo de operacin actual del adaptador.
int getmaxcolor (void); Regresa el ndice mximo de color para el modo de operacin actual del adaptador. El ndice mnimo es siempre 0. Entonces, se regresa el nmero de colores disponibles menos 1.
Ejemplo II.16: Dibujando Independientemente del Adaptador
/************************ marcos_centricos *************************** Dibuja un marco en los extremos de la pantalla y un rectngulo centrado de tamao un tercio de la altura y del ancho de la pantalla. */
void marcos_centricos () { int maxx = getmaxx (), maxy = getmaxy (); rectangle (0, 0, maxx, maxy); LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 17 Depto. Lenguajes y Simulacin - FEC
Los atributos de relleno son los mismos para los dos mtodos de relleno, el de polgonos y el de inundacin.
void setfillstyle (int pat_rell, int color_rell) Fija el patrn actual de relleno a "pat_rell" y el color actual de relleno a "color_rell". Ntese que el color actual de relleno es distinto del color actual de dibujo. Hay 12 tipos de relleno predefinidos que se dan en la siguiente figura. Includo un patrn vaco (EMPTY_FILL) que no rellena, y un patrn slido (SOLID_FILL). Adems, se permite definir un patrn de relleno propio con la funcin setfillpattern.
void getfillsettings (struct fillsettingstype *info); Regresa los valores actuales del patrn y del color de relleno en la estructura info. La estructura tiene esta definicin en GRAPHICS.H: struct fillsettingstype { int pattern; int color; };
void setfillpattern (char *patrell, int color_rell); Usa el arreglo patrell de 8 bytes como el patrn actual de relleno, y color_rell como color de relleno. Al llamar a esta funcin, los atributos de patrn y color son vigentes hasta llamar a setfillstyle.
Fig. II.5 Los Patrones Predefinidos de Relleno LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 18 Depto. Lenguajes y Simulacin - FEC
Bug: Para usar el patrn del usuario, supuestamente hay que llamar a setfillstyle con el argumento de relleno USER_FILL. Sin embargo, esto no tiene efecto en Turbo 2.0. El patrn de relleno actual es un patrn predefinido o un patrn del usuario segn si se ha llamado ms recientemente a setfillstyle o a setfillpattern, respectivamente.
void getfillpattern (char *patrell); Regresa en el arreglo patrell de 8 bytes el patrn actual de relleno. El patrn regresado puede ser predefinido o definido por el usuario, segn cul haya sido seleccionado ms recientemente.
II.9B RELLENO DE POLGONOS
El mtodo de "relleno de polgonos" usa la lista de vrtices de un polgono para calcular precisamente donde rellenar.
void fillpoly (int npts, int p[]); Dibuja el permetro del polgono definido por los npts puntos en el arreglo p, usando el color actual de dibujo y el estilo actual de lneas (patrn y grosor). Rellena el interior del polgono usando el estilo y color actual de relleno.
Ejemplo II.21: Relleno de Polgono
void tri_rell () { int tri[] = {0,100, 100,100, 50,0};
Fig. II.7 Salida de la Funcin tri_rel. LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 19 Depto. Lenguajes y Simulacin - FEC
Qu pasa con el relleno cuando el polgono tiene aristas que se cruzan con otras? Siempre se rellena el interior del polgono, usando la siguiente definicin: el interior del polgono es cualquier parte de la pantalla a la que se puede llegar desde afuera cruzando un nmero impar (1,3,5,...) de aristas. Las dems partes de la pantalla, a la cuales se llega cruzando un nmero par (0,2,4,...) de aristas, pertenecen al exterior del polgono, lo que no se rellena. Los polgonos en la figura II.15 muestra este concepto. Los dgitos en la figura se refieren al nmero de aristas que se cruzan para llegar en una regin del polgono.
II.9C RELLENO POR INUNDACIN
El algoritmo de relleno por inundacin, empieza en un punto inicial llamado la semilla, y rellena en todas direcciones hasta encontrar una frontera que encierre la semilla. La frontera es una curva continua con complejidad arbitraria, formada de pixeles de un un color determinado. El rea de relleno tambin puede incluir "islas", subregiones que estn dentro de la frontera pero tambin estn encerradas por un permetro del mismo color que la frontera.
void floodfill (int x, int y, int col_frontera); Rellena por inundacin la regin que encierra al punto (x,y) con una frontera de color col_frontera, usando el patrn y el color de relleno seleccionados.
Ejemplo II.22: Relleno por Inundacin
/* rellenar un crculo */
Fig. II.8 Relleno por fillpoly de Polgonos con Lados Cruzados
Fig. II.9 Relleno por Inundacin con floodfill. (a) Regin irregular. (b) Crculo (c) Relleno de elipse bloqueada por lnea LENGUAJES DE PROGRAMACION Elaborado por Prof. Jacqueline Lpez y Tala Flores Pgina 20 Depto. Lenguajes y Simulacin - FEC
/* dibujar un rectngulo y un crculo sobrepuestos y rellenar cada figura y su interseccin con un patrn distinto */ setcolor (maxcol); setlinestyle (SOLID_LINE, 0, NORM_WIDTH); rectangle (100, 100, 160, 140); circle (130, 150, 30); setfillstyle (SLASH_FILL, maxcol - 1); floodfill (101, 101, maxcol); setfillstyle (HATCH_FILL, maxcol - 2); floodfill (130, 135, maxcol); setfillstyle (WIDE_DOT_FILL, maxcol - 3); floodfill (130, 150, maxcol); }.......................................................................
El relleno por inundacin tiene ventajas y desventajas frente al relleno de polgonos. La ventaja es que se puede rellenar regiones que no pueden ser definidas como polgonos, por ejemplo, elipses, intersecciones de figuras geomtricas o regiones de un mapa.
La desventaja del relleno por inundacin es que no siempre cumple con las intenciones del programador. Primero, el relleno se escapa y rellena por afuera de la frontera cuando la frontera tiene una fuga. Segundo, no rellena toda el rea dentro de una frontera cuando hay obstculos inesperados que son del mismo color que la frontera. Por ejemplo, si se dibuja un elipse y hay una lnea del mismo color que cruza la elipse, el relleno rellena solamente la parte de la elipse que contiene la semilla, pero no puede cruzar la lnea.