Vous êtes sur la page 1sur 20

LENGUAJES DE PROGRAMACION

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.

La funcin rectangle() no retorna ningn valor.

Ejemplo:

#include <graphics.h>
#include <conio.h>
void main() {
int driver = EGA,modo = EGAHI;
initgraph( &driver, &modo, "C:\\tc20\\bin" );
rectangle( 20, 20, 400, 300 );
getch(); /* Pausa */
closegraph();
}

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.

La funcin circle no retorna ningn valor.

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();
}



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.

La funcin ellipse no retorna ningn valor.

Ejemplo:


#include <graphics.h>
#include <conio.h>
void main() {

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

int driver = EGA,modo = EGAHI;
initgraph( &driver, &modo, "C:\\tc20\\bin" );
ellipse( 300, 150, 45, 225, 100, 50 );
getch(); /* Pausa */
closegraph();
}


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:

settextstyle (TRIPLEX_FONT, HORIZ_DIR, USER_CHAR_SIZE);
setusercharsize (3, 2, 9, 4);
outtext ("Que Linda!");

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

rectangle (maxx / 3, maxy / 3, 2 * maxx / 3, 2 * maxy / 3);
}
......................................................................
10. ATRIBUTOS DE RELLENO

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};

setcolor (10);
setlinestyle (DASHED_LINE, 0, THICK_WIDTH);
setfillstyle (XHATCH_FILL, getmaxcolor());
fillpoly (3, tri);
}

Fig. II.6 Como Definir un Patrn de Usuario

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

setcolor (maxcol);
setfillstyle (SOLID_FILL, maxcol);
circle (100, 100, 50);
floodfill (100, 100, maxcol);

/* 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.













Fig. II.10
Relleno por Inundacin