Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


Curso de Pascal. Tema 14: Creación de gráficos.

Primero vamos a ver una introducción a lo que son los conceptos fundamentales sobre eso de los gráficos.

Texto frente a gráficos. Hasta ahora hemos trabajado en modo texto: escribíamos letras en posiciones concretas de la pantalla, para formar textos que el usuario de nuestros programas pudiera leer. Esto de escribir letras está muy bien, y es algo que se puede hacer casi desde la prehistoria de la informática...

¿Pero que pasa si queremos mostrar los resultados de la empresa en forma de barras? Podemos salir del paso haciendo

XX
XX XX
XX XX XX
XX XX XX
XX XX XX

Como somos unos chicos avispados, hemos cubierto el expediente. Pero ahora resulta que nuestro incansable jefe ahora nos dice que quiere que le mostremos las tendencias de ventas...

¡Vaya, ahora tendríamos que dibujar líneas! Podemos hacerlo a base de puntos (.) en vez de X. Nuevamente nuestro ingenio nos habría salvado, pero el resultado sería muy pobre.

Para mejorar esto entran en juego los modos gráficos. En ellos, en vez de dibujar símbolos que corresponden a letras, podemos acceder a cada uno de los puntos que forman la pantalla.

¿Y cómo se hace esto? Pues la idea es casi evidente ;-) : en algunos ordenadores antiguos, las letras estaban formadas por una serie de puntos, con un tamaño uniforme, por ejemplo 5 puntos de ancho y 7 de alto:

XXXX. Las X indican los puntos que se dibujaban y los . los
X..X. que no se dibujaban. O sea, que el ordenador sí que
XXXX. accedía a los puntos individuales de la pantalla.
X..X.
X..X. Entonces apenas hacía falta que mejorase un poco la
..... tecnología para que nos dejase hacerlo a nosotros.
.....

En los tiempos de ordenadores como el famoso Spectrum, el Commodore 64, los MSX, Dragon, Oric, Amstrad CPC, etc., ya era habitual que se nos permitira acceder a puntos individuales de la pantalla.

Muchos de estos ya tenían caracteres de 8x8, más nítidos que el de 5x7 del ejemplo anterior, y que a su vez suponen para nosotros más puntos en los que poder dibujar.

Y más puntos en una pantalla del mismo tamaño quiere decir que los puntos serán más pequeños. Y si los puntos que forman una imagen son más pequeños, esta imagen resultará más nítida.

Por ejemplo, en los Amstrad CPC, el modo habitual de trabajo era de 25 filas y 40 columnas, con caracteres de 8x8, y nos permitía acceder individualmente a cada uno de esos puntos, es decir, 25x8=200 puntos verticales y 40x8=320 puntos horizontales. La diferencia es abismal: en modo texto accedemos a 25x40 = 1000 posiciones distintas de la pantalla, mientras que en modo gráfico a 320x200 = 64000 posiciones. Ahora nuestro jefe quedaría bastante más contento... sonrisa

¿Y si se ve mejor, por qué no trabajamos siempre en modo gráfico? Por cuestiones de velocidad y memoria, principalmente: hemos visto que en un modo gráfico sencillo como éste hay 64 veces más puntos que letras, lo que supone gastar más memoria para guardar la información que estamos mostrando, necesitar más velocidad para representar los resultados sin que el usuario se aburra (especialmente si son imágenes en movimiento), etc. Por ello, se van viendo más cosas en modo gráfico a medida que los ordenadores van siendo más potentes.

De hecho, en algunos de estos primeros ordenadores personales (incluso en los primeros PC) debíamos elegir entre modo gráfico o de texto, según nuestros intereses, ya que no podían ser simultáneos.

Por ejemplo, en un PC con tarjeta CGA (ya veremos después lo que es esto), teníamos que elegir entre:


¿Y si no son simultáneos quiere decir que cuando estamos en modo gráfico no podemos escribir texto? No, el texto se puede "dibujar" también, y el ordenador lo suele hacer automáticamente (según casos) cuando estamos en un modo gráfico y le pedimos que escriba texto. Pero entonces se escribe más despacio, y con menos colores para elegir.

¿Y qué es un pixel? Seguro que habeis oído esa palabreja más de una vez. Pues no es más que un punto en la pantalla gráfica. El nombre viene de la abreviatura de dos palabras en inglés: "picture cell" o "picture element" (según el autor que se consulte).

¿Y eso de una tarjeta gráfica? Pues la idea tampoco es complicada: en los primeros ordenadores domésticos, como el Spectrum o el CPC, la "parte" encargada de mostrar el texto o los gráficos en la pantalla era una parte más del ordenador, que no se podía cambiar.

En cambio los PC son ordenadores modulares, muy fáciles de ampliar, que sí que nos permiten cambiar la "parte" que se encarga de gráficos o texto (y otras "partes" -casi todas- también se pueden cambiar) para poner otra más potente: más rápida, o que represente más colores, o más puntos.

Esta "parte" que se puede quitar tiene la forma de una placa de circuito impreso, con sus "chips" y sus cosas raras de esas guiño Y esta placa se inserta en otra grande, que es la que realmente "piensa" en el ordenador (la placa madre).

Pues eso es la tarjeta gráfica: esa placa que podemos quitar o poner con una relativa facilidad, y que es la que se encarga de controlar todo el acceso a la pantalla.

En la historia del PC ha habido varios estándares en tarjetas gráficas o de texto. Los más importantes han sido:


¿Y qué es eso de un driver? Es un intermediario entre nosotros y la tarjeta gráfica: hay una gran cantidad de tarjetas gráficas (las anteriores son sólo las más importantes), y no todas se programan igual. Así, que para nosotros no necesitemos aprender qué hay que hacer para dibujar un punto en azul en cualquier pantalla, solemos tener "ayuda".

Por ejemplo, Borland distribuye con Turbo Pascal (y Turbo C/C++) unos drivers, los BGI (Borland Graphics Interface), que son los que se encargan de acceder a la pantalla. Así, nosotros no tenemos más que decir "dibuja un punto", y el BGI sabrá como hacerlo, en función de la tarjeta gráfica que haya instalada, del modo de pantalla en el que estemos trabajando (cantidad de puntos y de colores disponibles), etc.

Pero todo eso lo veremos en el apartado siguiente...

14.2: Nuestro primer gráfico con Turbo Pascal.

Vamos a comentar cómo crear gráficos con Turbo Pascal, centrándonos en la versión 5.0 y superiores. Lo que veremos se podrá aplicar a otros compiladores posteriores, como Free Pascal.

Vamos a hacerlo empleando los "BGI" (los drivers originales de Bodland). Otra opción, que veremos como ampliación, es "saltarnoslos" y acceder nosotros mismos a la memoria de pantalla, con lo que podemos conseguir una mayor velocidad y un menor tamaño del programa ejecutable (.EXE) resultante, pero a cambio de una mayor dificultad a la hora de programarlo, y de menor portabilidad: nuestro programa no se podrá llevar con tanta facilidad a otro sistema.

Volviendo a lo que nos interesa hoy, los BGI nos permiten realizar muchísimas funciones, como puede ser dibujar puntos en la pantalla, líneas, rectángulos, círculos, elipses, arcos, polígonos, rellenar superficies, cambiar la paleta de colores, usar distintos estilos de texto, etc.

Para acceder a todo ello, necesitamos en primer lugar hacer una llamada a la unidad graph desde nuestro programa ("uses graph").

Ya en el cuerpo del programa, debemos comenzar por inicializar el sistema de gráficos mediante el procedimiento InitGraph. Este tiene como parámetros los siguientes:


Se debe indicar el directorio, porque los drivers están en forma de unos ficheros de extensión BGI: HERC.BGI, CGA,BGI, EGAVGA.BGI, etc., que el programa buscará en el momento de ejecutarlo.

No he puesto toda la lista de drivers ni de modos porque creo que tampoco tiene demasiado sentido: uno siempre acaba usando uno o dos nada más, y se los aprende. Sólo he dejado los más habituales. Si alguien quiere cotillear más, la mejor opción es recurrir a la ayuda on-line del compilador. Basta escribir Graph y pulsar Ctrl+F1 para que nos cuente montones y montones de cosas sobre la unidad Graph.


Si usamos el código "detect" para que el compilador intente detectar la tarjeta que hay instalada en el ordenador en el cual esté funcionando el programa, no hace falta indicar el modo, sino que él tomará el de mayor resolución que permita esa tarjeta.

En este caso, no tendremos claro el número de puntos que puede haber en la pantalla, así que podemos preguntarle al BGI. Tenemos las funciones GetMaxX y GetMaxY, que nos dicen el número de puntos horizontales y verticales que hay en el modo de pantalla actual. También podemos saber el número de colores con GetMaxColor.


Después de terminar de usar la pantalla en modo gráfico, deberemos usar la orden CloseGraph. ¿Parece que aún no sabemos nada y que esto es lioso? Todo lo contrario. Con esto y poco más ya podemos hacer nuestra primera prueba en modo gráfico:



 {--------------------------}
 {  Ejemplo en Pascal:      }
 {                          }
 {    Primer ejemplo de     }
 {    gráficos usando BGI   }
 {    GRAF1.PAS             }
 {                          }
 {  Este fuente procede de  }
 {  CUPAS, curso de Pascal  }
 {  por Nacho Cabanes       }
 {                          }
 {  Comprobado con:         }
 {    - Turbo Pascal 7.0    }
 {    - Free Pascal 2.2.0w  }
 {--------------------------}

 program PrimerGrafico;

 uses Graph;                     { Va a usar la librería gráfica de TP }

 var
  Driver, Modo: Integer;             { Pues el driver y el modo, claro }

 begin
  Driver := Vga;                                   { Para pantalla VGA }
  Modo := VgaHi;                            { Modo 640x480, 16 colores }
  InitGraph(Driver, Modo, 'c:\tp\bgi');                { Inicializamos }
  Line(0, 0, 320, 240);                          { Dibujamos una línea }
  Readln;                                                  { Esperamos }
  CloseGraph                                              { Y se acabó }
 end. 

Este ejemplo funciona sin ningún cambio también con Free Pascal, incluso si compilamos para Windows (probado con la versión 2.0.4 para Windows). Eso sí, en este caso, no haría falta indicar la ruta 'c:\tp\bgi', porque no buscará ningún fichero BGI en ninguna parte de nuestro disco, sino que los enlaza directamente cuando se compila.