Bismarck Salvador Traña López__________________________________________ UNI Introducción a la Programación grafica en C
Views 207 Downloads 5 File size 2MB
Bismarck Salvador Traña López__________________________________________ UNI
Introducción a la Programación grafica en C. Para la mejor comprensión de este tutor hemos realizado un análisis de las Funciones que se suelen utilizar con mucha frecuencia al programar en el modo grafico de C, dando como resultado la librería conio.h, dos.h, stdlib.h, y evidentemente graphics.h. En este pequeño tutor solo haremos énfasis en estas librerías, puesto que al final del libro se encuentran las demás librerías que comúnmente encontramos con frecuencia en el programa. Muchos libros nos marean dándonos conceptos los cuales se aprenden conforme programando; esto no significa, que no sean importan tantees los ejercicios que aquí te enseñamos te ayudaran a darte todo el conocimiento así como también te los daremos conforme avancemos así que dejemos de hablar y aventurémonos en el mundo de la programación grafica. Lo primero que debemos saber al realizar una grafica son las dimensiones del ordenador (Monitor) en modo texto las dimensiones de este es 25X80 esto dependiendo de la versión de video instalada. En el modo grafico estas dimensiones cambian dependiendo del tipo de macro de inicialización se realice(ver Macro modos). Quedando la mas común de 640X480 modo VGA.
A la hora de desarrollar un programa gráfico se debe tener en cuenta los siguientes cuatro puntos: 1. Especificar el fichero o librería graphics.h # include
2. Inicializar el modo grafico correspondiente mediante la Función initgraph; Initgraph(&adaptador,&modo,”dirección de los archivos bgi”);
3. Crear y manipular las figuras graficas. /*Desarrollo del programa*/ 4. Restaurar el modo de video antes de salir del programa(restaurar el modo texto) closegraph() o restorecrtmode()
Juan Carlos Gutiérrez Barquero____________________________________________
1
Bismarck Salvador Traña López__________________________________________ UNI Otra de las cosas importantes que debemos saber es que Funciones contiene graphics.h
Funciones de Graphics.h Esta librería se encuentra los prototipos de las Funciones que manipulan la parte gráfica en el entorno de MS-DOS. Arc bar bar3d circle cleardevice clearviewport closegraph detectgraph drawpoly ellipse fillellipse fillpoly floodfill getarccoords getaspectratio getbkcolor getcolor getdefaultpalette getdrivername getfillpattern getfillsettings getgraphmode getimage getlinesettings getmaxcolor getmaxmode getmaxx
getmaxy getmodename getmoderange getpalette getpalettesize getpixel gettextsettings getviewsettings getx gety graphdefaults grapherrormsg graphfreemem graphgetmem graphresult imagesize initgraph installuserdriver installuserfont line linerel lineto moverel moveto outtext outtextxy pieslice
putimage putpixel rectangle registerbgidriver registerbgifont restorecrtmode sector setactivepage setallpalette setaspectratio setbkcolor setfillpattern setfillstyle setgraphbufsize setgraphmode setlinestyle setpalette setrgbpalette settextjustify settextstyle setusercharsize setviewport setvisualpage setwritemode textheight textwidth
Es necesario conocer hacerca de los macros y estructuras, entre las estructuras tenemos: arccoordstype fillsettingstype
linesettingstype palettetype
textsettingstype viewporttype
errores fuentes línea
modos put_op trama
Entre los macros se encuentran: colores drivers enlazar
Antes de comenzar a programar en modo grafico debemos estudiar lo que son los macros, que son instrucciones que nos ayudaran a realizar de una manera más efectiva nuestros gráficos.
Juan Carlos Gutiérrez Barquero____________________________________________
2
Bismarck Salvador Traña López__________________________________________ UNI
Colores : Colores de Fondo Constante BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE
Valor 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Significado Negro Azul Verde Cían Rojo Magenta Marrón Gris Claro Gris Oscuro Azul Claro Verde Claro Cían Claro Rojo Claro Magenta Claro Amarillo Blanco
Modo de 16 Colores Constante BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE
Valor 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Significado Negro Azul Verde Cían Rojo Magenta Marrón Gris Claro Gris Oscuro Azul Claro Verde Claro Cían Claro Rojo Claro Magenta Claro Amarillo Blanco
Color del modo CGA Juan Carlos Gutiérrez Barquero____________________________________________
3
Bismarck Salvador Traña López__________________________________________ UNI
Número Paleta
Color 1
Significado
Color 2
Significado
Color 3
Significado
0
CGA_LIGHT GREEN
Verde Claro
CGA_LIGHTRED
Rojo Claro
CGA_YELLOW
Amarillo
1
Cían Claro
CGA_LIGHTMAGENTA
Magenta Claro
CGA_WHITE
Blanco
2
CGA_LIGHT CYAN CGA_GREEN
Verde
CGA_RED
Rojo
CGA_BROWN
Marrón
3
CGA_CYAN
Cían
CGA_MAGENTA
Magenta
CGA_LIGHTGRAY
Gris Claro
Valor asignado: 1 2 3 Nota: Color 0 se reserva para el color de fondo y se asigna con lo función setbkcolor, pero los demás colores son fijos. Estas constantes se usan con setcolor.
Colores para las paletas. Constante (CGA) BLACK BLUE GREEN CYAN RED MAGENTA BROWN LIGHTGRAY DARKGRAY LIGHTBLUE LIGHTGREEN LIGHTCYAN LIGHTRED LIGHTMAGENTA YELLOW WHITE
Valor 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Constante (EGA/VGA) EGA_BLACK EGA_BLUE EGA_GREEEN EGA_CYAN EGA_RED EGA_MAGENTA EGA_LIGHTGRAY EGA_BROWN EGA_DARKGRAY EGA_LIGHTBLUE EGA_LIGHTGREEN EGA_LIGHTCYAN EGA_LIGHTRED EGA_LIGHTMAGENTA EGA_YELLOW EGA_WHITE
Valor 0 1 2 3 4 5 7 20 56 57 58 59 60 61 62 63
Nota: Estas constantes se usan con las Funciones setpalette y setallpalette.el cual veremos en capítulos posteriores
Fuentes:
Juan Carlos Gutiérrez Barquero____________________________________________
4
Bismarck Salvador Traña López__________________________________________ UNI Fuentes para Texto Constante DEFAULT_FONT
Valor 0
Valor
TRIPLEX_FONT
1
Fuente escalable de tipo triple
SMALL_FONT SANS_SERIF_FONT
2 3
Fuente escalable pequeña Fuente escalable de tipo sans serif
GOTHIC_FONT SCRIPT_FONT
4 5
Fuente escalable de tipo gótico Fuente escalable de tipo manuscrito
SIMPLEX_FONT TRIPLEX_SCR_FONT
6 7
Fuente escalable de tipo manuscrito simple Fuente escalable de tipo manuscrito triple
COMPLEX_FONT EUROPEAN_FONT
8 9
Fuente escalable de tipo complejo Fuente escalable de tipo europeo
BOLD_FONT
10
Fuente escalable en negrita
Fuente bitmap de 8x8
Dirección del Texto Constante
Valor
Significado
HORIZ_DIR
0
Texto horizontal
VERT_DIR
1
Texto vertical
Justificación de Texto en la Horizontal Constante LEFT_TEXT CENTER_TEXT RIGHT_TEXT
Valor
Significado Justificar a la izquierda Centrar el texto Justificar a la derecha
0 1 2
Justificación de Texto en la Vertical Constante BOTTOM_TEXT CENTER_TEXT TOP_TEXT
Valor 0 1 2
Significado Justificar debajo Centrar el texto Justificar arriba
Tramas: Tramas predefinidas
Juan Carlos Gutiérrez Barquero____________________________________________
5
Bismarck Salvador Traña López__________________________________________ UNI Constante 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
Valor 0 1 2 3 4 5 6 7 8 9 10 11 12
Significado Rellena con el color de fondo Rellena enteramente Rellena con líneas horizontales: --Rellena con rayas finas: /// Rellena con rayas gruesas: /// Rellena con rayas inversas y finas: \\\ Rellena con rayas inversas y gruesas: \\\ Rellena con líneas cruzadas cuadriculadamente: +++ Rellena con líneas cruzadas diagonalmente: XXXX Rellena con líneas entrelazadas Rellena con lunares bastante distanciados Rellena con lunares poco distanciados Rellena con la trama definida por el usuario
Nota: Todos los tipos de tramas menos EMPTY_FILL usan el color de relleno seleccionado; EMPTY_FILL usa el color de fondo para rellenar.
Driver: Dispositivos Gráficos Dispositivo/Constante DETECT CGA MCGA EGA EGA64 EGAMONO IBM8514 HERCMONO ATT400 VGA PC3270
Valor 0 1 2 3 4 5 6 7 8 9 10
Líneas: Estilos de Líneas Constante SOLID_LINE DOTTED_LINE CENTER_LINE DASHED_LINE USERBIT_LINE
Valor 0 1 2 3 4
Significado Línea continua _______ Línea hecha con puntos …….. Línea centrada ––––––––––– Línea discontinua _._._._. Línea definida por el usuario
Nota: El grosor es definido escribiendo NORM_WIDTH para rallas normales y THICK_WIDTH para líneas mas gruesos
Grosores para Líneas
Modos de Escritura
Juan Carlos Gutiérrez Barquero____________________________________________
6
Bismarck Salvador Traña López__________________________________________ UNI Constante Grosor
Valor
Significado
NORM_THICK
1
Grosor es de 1 píxel
THICK_WIDTH
3
Grosor es de 3 píxeles
Constantes COPY_PUT XOR_PUT
Valor 0 1
Significado Píxeles de la línea sobrescriben los píxeles existentes Píxel de la pantalla son el Resulta do de la operación OR de los píxeles existentes y los de la línea
Modos: Modos Gráficos Dispositivo CGA
MCGA
EGA EGA64 EGAMONO VGA ATT400
HERC
Modo/Constante CGAC0 CGAC1 CGAC2 CGAC3 CGAHI MCGAC0 MCGAC1 MCGAC2 MCGAC3 MCGAMED MCGAHI EGALO EGAHI A64LO EGA64HI AMONOHI
0 1 2 3 4 0 1 2 3 4 5 0 1 0 1 3
Código
Resolución 320X200 320X200 320X200 320X200 640X200 320X200 320X200 320X200 320X200 640X200 640X480 640X200 640x350 640X200 640X350 640x200
Paleta 4 Clores 4 Clores 4 Clores 4 Clores 2 Clores 4 Clores 4 Clores 4 Clores 4 Clores 2 Clores 2 Clores 16 Colores 16 Colores 16 Colores 4 Colores 2 Colores
VGALO VGAMED VGAHI ATT400C0 ATT400C1 ATT400C2 ATT400C3 ATT400MED ATT400HI HERCMONOHI PC3270HI IBM8514LO IBM8514HI
0 1 2 0 1 2 3 4 5 0 0 0 1
640X200 640x350 640X480 320x200 320x200 320x200 320x200 640x400 640x400 720X348 720X350 640X480 1024X768
16 Colores 16 Colores 16 Colores 4 Colores 4 Colores 4 Colores 4 Colores 2 Colores 2 Colores 2 Colores 2 Colores 256 Colores 256 Colores
Pagina 1 1 1 1 1 1 1 1 1 1 1 4 2 1 1
1* / 2** 2 2 1 1 1 1 1 1 1 2 1
Si la tarjeta es de 64 K o la tarjeta es de 256 K
Errores:
Juan Carlos Gutiérrez Barquero____________________________________________
7
Bismarck Salvador Traña López__________________________________________ UNI Códigos de Errores Constante grOk grNoInitGraph grNotDetected grFileNotFound grInvalidDriver grNoLoadMem grNoScanMem grNoFloodMem grFontNotFound grNoFontMem grInvalidMode grError grIOerror grInvalidFont grInvalidFontNum grInvalidDeviceNum grInvalidVersion
Código 0 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -18
Significado Ningún error Gráficos no iniciados Ningún adaptador gráfico detectado Fichero de dispositivo no encontrado Fichero de dispositivo no válido No hay memoria para cargar dispositivo No hay memoria para rellenar No hay memoria para usar floodfill Fichero de fuente no encontrado No hay memoria para cargar la fuente Modo gráfico no válido Error gráfico Error gráfico de Entrada/Salida Fichero de fuente no válido Número de fuente no válido Número de dispositivo no válido Número de versión no válido
Put_op: Operaciones con putimage Constante COPY_PUT
Valor 0
Significado Sobrescribir los píxeles existentes
XOR_PUT
1
Operación OR Exclusivo con los píxeles
OR_PUT AND_PUT
2 3
Operación OR Inclusivo con los píxeles Operación AND con los píxels
NOT_PUT
4
Invertir la imagen
Nota: Estas operaciones se usan exclusivamente con la función putimage. El cual veremos en capítulos posteriores.
Métodos de Inicialización del modo grafico.
Juan Carlos Gutiérrez Barquero____________________________________________
8
Bismarck Salvador Traña López__________________________________________ UNI Antes de conocer los métodos de inicialización debemos conocer la función initgraph la cual nos permitirá realizar gráficos. Función initgraph void far initgraph(int far *driver, int far *modo, int far *path); Esta función es usada para cargar o validar un dispositivo gráfico y cambiar el sistema de vídeo a modo gráfico. La función initgraph debe ser llamada antes de cualesquier Funciónes que generan una salida gráfica sean usadas. Existen varios valores a ser usados para el argumento *driver. Si *driver es asignado a DETECT, ó 0, la función detectgraph es llamada, y un dispositivo y modo gráfico apropiados son seleccionados. Asignando a *driver cualquier otro valor predefinido inicia la carga del dispositivo gráfico correspondiente. Existen varios valores a ser usados para el argumento *modo. Estos valores deberían corresponder al dispositivo especificado en el argumento *driver. El argumento *path especificad el directorio donde los dispositivos gráficos están localizados. La función initgraph buscará el dispositivo primeramente en este directorio. Si no es encontrado, la función buscará en el directorio de inicio. Cuando el argumento *path es NULL, solamente el directorio de inicio es buscado. Otra forma para evitar cargando el dispositivo desde el disco cada vez que el programa es ejecutado es ligarlo o enlazarlo al dispositivo apropiado en un programa ejecutable. La función initgraph no retorna ningún valor. Sin embargo, cuando la función initgraph es llamada, el código de error interno es activado. Si la función initgraph termina con éxito, el código es asignado un 0. Si no, el código es asignado así: -2 grNotDetected La tarjeta gráfica no se encontró -3 grFileNotFound El fichero del dispositivo no se encontró -4 grInvalidDriver El fichero del dispositivo es inválido -5 grNoLoadMem No hay suficiente memoria para cargar el dispositivo Ejemplo: #include #include void main() { int driver = EGA; int modo = EGAHI; initgraph( &driver, &modo, “C:\\TC20\\BIN” ); circle( 300, 200, 80 ); getch(); /* Pausa */ closegraph(); getch(); } Existen diferentes métodos de inicialización pero en este pequeño tutorial trataremos dos que suelen ser los más utilizados hoy en día.
1. Método de inicialización del modo grafico a prueba de errores. Juan Carlos Gutiérrez Barquero____________________________________________
9
Bismarck Salvador Traña López__________________________________________ UNI
#include # include # include void main() { int driver = VGA; int modo = VGAHI; int resultado; initgraph(&driver,&modo,"c:\\tc20\\bin"); resultado=graphresult(); if(resultado!=grOk) { getch(); exit(0); } getch(); } cuerpo del programa
2. Método de inicialización rápido del modo grafico. #include void main() { int driver = DETECT,modo; initgraph(&driver,modo,” c:\\tc20\\bin”); cuerpo del programa driver: Es la dirección de la variable que contiene el código del tipo de de driver o adaptador que tiene la computadora. modo: Es la dirección de la variable que contiene el código del modo en que se podrá adaptar. c:\\tc20\\bin: Es el directorio donde se encuentra el código del manejador, puede ser camino relativo o absoluto. graphresult():Regresa el código error de la ultima llamada a una función grafica de turbo c un valor de 0 significa que no hubo error. grOk : regresa el código de error de la función graphresult(). DETECT: Dispositivo grafico de auto detección del la tarjeta de video y del modo grafico.
¿Qué son los primitivos gráficos…? Juan Carlos Gutiérrez Barquero____________________________________________
10
Bismarck Salvador Traña López__________________________________________ UNI Definición. Un primitivo gráfico es un elemento fundamental de dibujo en un paquete grafico tal como un punto, línea, o circulo; puede ser un carácter, o puede ser una operación tal como relleno, coloreado o trasferido de la imagen. C cuenta con 5 grupos de primitivos gráficos.
Figuras geométricas: Dibujan las figuras de la geometría clásica: líneas, círculos, rectángulos, arcos, polígonos etc.
Relleno: tiene dos formas de realizarse. El primero es con polígonos, donde se definen los vértices del polígono a ser rellenado segunda es una operación grafica que busca algorítmicamente las fronteras de la región del relleno.
Rasterop: Es una operación grafica que copia el área de una imagen para luego dibujarla en cualquier región de la pantalla.
Gráficas Matemáticas: Dibujan los primitivos barras y sectores para conseguir dibujar las herramientas del sector.
Texto Gráfico: Sirve para escribir texto en modo grafico, utilizando diferentes fuentes.
Figuras geométricas: LINEAS. void far line(int x1, int y1, int x2, int y2); Esta función es usada para conectar dos puntos con una línea recta. El primer punto es especificado por los argumentos x1 e y1. El segundo punto es especificado por los argumentos x2 e y2. La línea se dibuja usando el estilo de línea actual, el grosor, y el color actual. La posición del cursor gráfico no es afectada por la función line.
La función line() no retorna ningún valor.
Ejemplo:
Juan Carlos Gutiérrez Barquero____________________________________________
11
Bismarck Salvador Traña López__________________________________________ UNI
#include #include void main() { int driver = EGA,modo = EGAHI; initgraph( &driver, &modo, "c:\\tc20\\bin" ); line( 20, 40, 350, 100 ); line( 400, 30, 50, 250 ); getch(); closegraph(); } CIRCULOS. void far circle(int x, int y, int radio); Esta función se utiliza para dibujar un círculo. Los argumentos x e y definen el centro del círculo, mientras que el argumento radio define el radio del círculo. El círculo no es rellenado pero es dibujado usando el color actual.
El grosor de la circunferencia puede ser establecido por la función setlinestyle; sin embargo, el estilo de la línea es ignorado por la función circle. La función circle no retorna ningún valor. Ejemplo: #include #include void main() { int driver = EGA; int modo = EGAHI; initgraph( &driver, &modo, "C:\\tc20\\BIN" ); circle( 300, 200, 80 ); getch(); /* Pausa */ closegraph(); }
Juan Carlos Gutiérrez Barquero____________________________________________
12
Bismarck Salvador Traña López__________________________________________ UNI
RECTANGULOS. void far rectangle(int izquierda,int superior, int derecha, int inferior); Esta función dibujará un rectángulo sin rellenar su interior usando el color actual. La esquina superior izquierda del rectángulo está definida por los argumentos izquierdos y superiores. Estos argumentos corresponden a los valores x e y de la esquina superior izquierda. Similarmente, los argumentos derecha e inferior definen la esquina inferior derecha del rectángulo. El perímetro del rectángulo es dibujado usando el estilo y grosor de línea actuales.
La función rectangle() no retorna ningún valor. Ejemplo: #include #include void main() { int driver = EGA,modo = EGAHI; initgraph( &driver, &modo, "C:\\tc20\\bin" ); rectangle( 20, 20, 400, 300 ); getch(); /* Pausa */ closegraph(); }
ARCOS void far arc(int x, int y,int comienzo_angulo, int final_angulo, int radio); Esta función 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: radio. El arco no está rellanado, pero es dibujado usando el color actual. El arco comienza al ángulo especificado por el argumento comienzo_angulo y es dibujado en la dirección contraria al de las agujas del reloj hasta llegar al ángulo especificado por el argumento final_angulo. La función arc usa el este (extendiéndose hacia la derecha del centro del arco en la dirección horizontal) como su punto de 0 grados. La función setlinestyle puede usarse para establecer el grosor del arco. La función arc, sin embargo, ignorará el argumento trama de la función setlinestyle.
Juan Carlos Gutiérrez Barquero____________________________________________
13
Bismarck Salvador Traña López__________________________________________ UNI
La función arc no retorna ningún valor. Ejemplo: #include #include 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(); }
PIXELES. void far putpixel(int x, int y, int color); Esta función es usada para colocar a un píxel en una posición en particular la cual es cuestionada por los argumentos x e y. El argumento color específico el valor del color del píxel. La función putpixel no retorna ningún valor. Ejemplo: #include #include void main() { int driver = EGA,modo = EGAHI,t; initgraph( &driver, &modo, “c:\\tc20\\bin” ); for( t=0; t