Programacion Grafica en C

Bismarck Salvador Traña López__________________________________________ UNI Introducción a la Programación grafica en C

Views 207 Downloads 5 File size 2MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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