La Pantalla en Modo Grafico de Pascal

La pantalla en el Modo Gráfico en Pascal


Mini tutorial...


El modo de video en que se ha trabajado hasta este momento solo nos permite usar la pantalla para mostrar unicamente datos que contengan carácteres textuales, sin la posibilidad de añadir grafico y dibujos. Este modo del que acabamos hablar es el Modo Texto, y la unica alternativa que tiene para presentar lo más parecido a un gráfico es usando los símbolos especiales del juego de caracteres ASCII, pero aun así, estos gráficos resultan poco llamativos. De modo que para solucionar este problema, es necesario activar la pantalla en el Modo Gráfico, el cual nos permite generar gráficos y dibujos mediante funciones y procedimientos muy fáciles de usar.

La pantalla en el modo texto posee una capacidad de presentación estándar de 80 ó 40 columnas de ancho por 25 filas, formando una matriz de celdas de carácteres, teniendo control solo a nivel de estas celdas; mientras que en el modo gráfico se permite tener control a nivel de los pixeles y no a nivel de celdas de carácteres, y además, como estos pixeles o puntos estan separados unos de otros a tan solo pequeñisimas distancias, al observar todos estos puntos parecen formar una sola imagen, de modo que se logra tener una mayor definición de las imagenes. Cuando se activa el modo gráfico, el sistema de coordenadas en el modo texto cambiará como se muestra en la siguiente imagen:

La Pantalla en Modo Grafico de Pascal


En la anterior imagen se compara las diferencias entre los dos modos alternativos de video que se pueden configurar en la misma pantalla, se ha colocado el ejemplo de comparación de un mismo monitor activado primero en modo texto a 80 columnas por 25 filas y luego acivado en el modo gráfico a 640 X 480 pixels, tenga en cuenta que estas medida varían de acuerdo al tipo de controlador gráfico y del monitor que se este utilizando.

Para poder hacer visible estos pixeles, es necesario tomar una lupa y acercarla a la pantalla, al enfocar cualquier imagen o carácter, en ella se observará que esta constituida por muchos puntos que se iluminan de diferentes colores. Pues bien esos punticos son los famosos pixels.

A partir de aquí se explicaran las bases del modo gráfico, para que una vez familiarizado con estas, podremos construir aplicaciones tales como programas que grafiquen funciones matemáticas, problemas de física, pequeños videojuegos, editores de dibujos, y una variedad de aplicaciones, todo depende de nuestra imaginación.

Como iniciar el Modo Gráfico

Todo computador viene integrado con algun tipo de tarjeta adaptadora de video, y al momento de iniciar el modo gráfico se requiere identificar el tipo de este adaptador, ya que el control que se tiene sobre estos adaptadores se produce por medio de seis archivos (*.BGI) controladores de interfaz gráfica, entre los cuales tenemos, a los archivos ATT.BGI, CGA.BGI, EGAVGA.BGI, HERC.BGI, IBM8514.BGI y PC3270.BGI.BGI. A estos archivos se les conoce como "Controladores de video" o "Drivers", y normalmente se encuentran localizados en el directorio o carpeta "C:TPBGI", aunque la ruta de este directorio puede ser diferente de la instalación de Turbo Pascal que usted tenga.

Para cada tipo de adaptador de video existe un controlador y varios modos de video, Turbo Pascal tiene asignada una constante que identifica a cada tipo de controlador de video, y otra constante para indicar los modos de video disponibles para cada adaptador, cada constante tiene un valor numerico según se muestra en la siguiente tabla:

error


Para activar el modo gráfico se debe utilizar el procedimiento InitGraph, indicandole que tipo de adaptador de video tiene el computador, que modo de video será utilizado, y la ruta del directorio donde se localizan los archivos controladores de video. La sintaxis para este procedimiento es la siguiente:

InitGraph(Driver, Modo, 'RutaDriver');
Mediante el parámetro Driver se establece el tipo de controlador gráfico, mientras que en el parámetro Modo se especifica el modo de video, cada uno debe ser establecido según las constantes o sus valores correspondientes de la tabla anterior. Estos dos parámetros deben ser variables, por lo tanto, es necesario definir dos variables tipo Integer y luego asignarles respectivamente el tipo de controlador y el modo gráfico que utilizaremos, antes de llamar al procedimeitno InitGraph. El tercer parámetro, es decir 'RutaDriver', es una cadena de carácteres que indica el directorio en que estan localizados los archivos controladores de gráficos, que como se dijo antes es 'C:TPBGI'. El siguiente es un ejemplo de como se inicializa un programa para mostrar graficos:

Program EjemploDeGraficos;

Uses Graph;

Var Driver,
Modo: Integer;

Begin
Driver := VGA;
Modo := VGAHi;
InitGraph(Driver, Modo, 'C:TPBGI');
.
. {Instrucciones para manejo de gráficos}
.
End.


A continuación se presenta el ejemplo de un programa completo que maneja rutinas en el modo gráfico, no se preocupe si aún no entiende algunas de sus instrucciones ya que se explicarán más adelante. Si tiene Turbo Pascal instalado en su computador ejecute el siguiente programa para ver su funcionamiento:

PROGRAM MiPrimerDibujo;

USES
Crt, Graph;

VAR
Driver, Modo: INTEGER;

BEGIN
Driver := VGA;
Modo := VGAHi;
InitGraph(Driver, Modo, 'C:TPBGI');
SetTextStyle(10,0,2);
SetColor(LightBlue);
OutTextXY(120,60,'Bienvenido al Modo Gráfico');
SetColor(Green);
Circle(300,250,100);
SetColor(Red);
rectangle(300,250,450,400);
WriteLn('Pulse una tecla pasa salir');
Readkey;
CloseGraph; {Esta instrucción finaliza el modo gráfico}
END.

Observe que la última sentencia del programa es la instrucción CloseGraph; esta es obligatoria colocarla para finalizar el modo gráfico. Existe también otra forma de iniciar el modo grafico sin nececidad de conocer el tipo controlador y el modo grafico que necesitamos, esto es mediante la función Detect, la cual autodetecta el tipo controlador grafico y el modo grafico que sirve para nuestro monitor. Volviendo a nuestro ejemplo anterior, con la función Detect el programa quedaría:

PROGRAM MiSegundoDibujo;

USES
Crt, Graph;

VAR
Driver, Modo: INTEGER;

BEGIN
Driver := Detect;
InitGraph(Driver, Modo, 'C:TPBGI');
SetTextStyle(10,0,2);
SetColor(LightBlue);
OutTextXY(120,60,'Bienvenido al Modo Gráfico');
SetColor(Green);
Circle(300,250,100);
SetColor(Red);
rectangle(300,250,450,400);
WriteLn('Pulse una tecla pasa salir');
Readkey;
CloseGraph; {Esta instrucción finaliza el modo gráfico}
END.


Si se utiliza la función Detect, la variable Modo se inicializa automáticamente al momento de llamar al procedimiento InitGraph, por lo tanto no es necesario indicar el modo de video. Turbo Pascal se adapta a la mayoria de adptadores de video disponibles, sin embargo, el controlador más adecuado para los adaptadores de video y monitores actuales, es el controlador VGA en el modo VGAHi, por lo tanto, éste o la función Detect serán las dos alternativas que utilizaremos de aquí en adelante.

Errores en el Modo Gráfico

En algunas ocasiones, es posible que se produzcan errores durante la ejecución de un programa, ya sea causado por un error que cometamos en la programación o por una operación no válida; en caso de que produzca un error durante una operación gráfica, las funciones GraphResult y GraphErrorMsg nos permiten comprobar los resultados del error y mostrar su descripción correspondiente. El uso de estas funciones de describen a continuación:

pantalla


GraphResult: esta función devuelve un código de error numérico deterninado por la última operación gráfica que informó del error. Este código de error será un número entero comprendido entre 0 y 14. Debido que al momento de llamar a la función GraphResult su valor se reinicia a cero, el valor devuelto deberá ser almacenado en una variable para poder ser consultado posteriormente. En la siguiente tabla se muestran los códigos de errores y su correspondiente descripción:


En el siguiente ejemplo se muestra la manera de usar la función GraphResult para comprobar errores en el modo grafico.

CodigoError := GraphResult;
If CodigoError <> grok then
Begin
Write('Ha ocurrido un error, pulse una tecla para cerrar el programa');
Readkey;
halt;
end;


Como la función GraphResult devuelve el valor cero si no ha ocurrido ningún error, en el ejemplo anterior el valor devuelto por la función GraphResult se asigna a la variable "CodigoError", de tipo integer, y luego se comprueba si su valor es diferente de cero, en caso de no ser así, se ejecutan las sentencias dentro de la instrucción If... Then para controlar el error. La sentencia Halt se utiliza para interrumpir la ejecución del programa antes de continuar ejecutando las sentencias posteriores, para que el programa finalice si se comprueba que ha ocurrido un error, y así evitar que este se quede colgado.

GraphErrorMsg: esta función devuelve un mensaje de texto descriptivo para un código de error específico, en el que dicho código deber ser el código de error devuelto por la función GraphResult. Esta función resulta muy útil para informar al usuario sobre los errores gráficos que se producen durante la ejecución de un programa, así por ejemplo, se puede utilizar de la siguiente manera:

CodigoError := GraphResult;
Mensaje := GraphErrorMsg(CodigoError);
Writeln('Error Grafico: ', Mensaje);

A continuación se presenta el ejemplo de un programa completo en el que se produce un error intencionalmente, para ver como es el funcionamiento de las funciones GraphResult y GraphErrorMsg, si desea ejecutar el programa corregido cambie el número cinco (5) que se asigna a la variable "Modo" por el número dos (2).

PROGRAM MiPrimerDibujo;

USES
Crt, Graph;

VAR
Driver, Modo, CodigoError: INTEGER;
Mensaje: String;

BEGIN
Driver := VGA;
Modo := 5;
InitGraph(Driver, Modo, 'C:TPBGI');
CodigoError := GraphResult;
Mensaje := GraphErrorMsg(CodigoError);
If CodigoError <> grOk then
Begin
Writeln('Error gráfico: ', Mensaje');
write('Pulse una tecla para salir')
Readkey;
Halt;
end;
SetTextStyle(10,0,2);
SetColor(LightBlue);
OutTextXY(120,60,'Bienvenido al Modo Gráfico');
SetColor(Green);
Circle(300,250,100);
SetColor(Red);
rectangle(300,250,450,400);
WriteLn('Pulse una tecla pasa salir');
Readkey;
CloseGraph; {Esta instrucción finaliza el modo gráfico}

END.

____________ Barra Separadora ____________




A CONTINUACION ALGUNOS EJERCISIOS PRACTIOS DE UTILIDAD


Un sencillo programa de dibujo.
Otro ejemplo de programa, en este caso más sencillo, pero espero que también más útil, sería un programita sencillo de dibujo:

{--------------------------}

program dib;

uses graph, crt;

var
driver, modo: integer;
tecla: char;
x, y: integer;

begin
driver := detect;
initgraph(driver, modo, '');
x := 320; { Comienzo en el centro }
y := 240;
repeat
putpixel(x,y, 15);
tecla := readkey;
case tecla of
'8': y := y-1;
'4': x := x-1;
'6': x := x+1;
'2': y := y+1;
end;
until tecla = 'f';
closegraph;
end.


Creo que la idea en sí es muy sencilla: si se pulsan las teclas 2, 4, 6, 8 (del teclado numérico), el puntito que dibuja se va desplazando por la pantalla, y dibujando un punto en el color 15 (que normalmente es el blanco). Cuando se pulse "f", acaba el programa.

14.5: Mejorando el programa de dibujo.
Por supuesto, este programa es muy muy mejorable. La primera mejora casi evidente es poder pintar en más de un color. Podemos retocar el programa para que lo haga, y de paso comprobamos el tamaño real de la pantalla y el número de colores disponible:

{--------------------------}

program dib2;

uses graph, crt;

var
driver, modo: integer;
tecla: char;
x, y, c: integer;

begin
driver := detect;
initgraph(driver, modo, '');
x := getMaxX div 2; { Comienzo en el centro }
y := getMaxY div 2;
c := getMaxColor; { Y con el máximo color permitido en este modo }
repeat
putpixel(x,y, c);
tecla := readkey;
case tecla of
'8': y := y-1;
'4': x := x-1;
'6': x := x+1;
'2': y := y+1;
'c': begin
c := c + 1;
if c>getMaxColor then c := 1;
end;
end;
until tecla = 'f';
closegraph;
end.


¿Otras mejoras posibles? Que se pueda borrar un punto o la pantalla entera, que se puedan dibujar líneas, rectángulos y otras figuras... eso ya queda a la imaginación de cada uno.
Y todo esto podría seguir y seguir... Lo mejor es que, si os interesa, miréis la ayuda y practiquéis con los ejemplos que incluye, o bien que miréis el BGIDEMO que incluye Turbo Pascal, que pone a prueba casi todas las posibilidades gráficas de este compilador..
Lo que sí voy a hacer es poner yo algún ejemplo que YO considere interesante porque aporte algo más o menos curioso... }:-)


14.6: Un efecto vistoso utilizando círculos.
Para empezar, vamos a dibujar algo parecido a un cono, formado por varios círculos. Buscamos un resultado similar a éste:

pascal


Y lo podemos conseguir así:
{--------------------------}


program SegundoGrafico;

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

var
Driver, Modo: Integer; { Pues el driver y el modo, claro }
bucle: word; { Para bucles, ya se verá por qué }

begin
Driver := Vga; { Para pantalla VGA }
Modo := VgaHi; { Modo 640x480, 16 colores }
InitGraph(Driver, Modo, 'c:tpbgi'); { Inicializamos }
SetColor(LightRed); { Color rojo }
for bucle := 1 to 40 do { Dibujaremos 40 círculos }
circle ( bucle*5, bucle*5, bucle*5 );
Readln; { Esperamos }
CloseGraph { Y se acabó }
end.


Hemos dibujado 40 círculos, cuyas coordenadas x e y, y cuyo radio son iguales en cada círculo. El efecto es vistoso, pero se puede mejorar...
14.7. Jugando con la paleta de colores.
El efecto anterior se puede mejorar. Podemos cambiar la paleta de colores para que quede más vistoso aún. Con la orden SetRGBPalette podemos fijar los componentes de rojo, verde y azul de un cierto color base. El formato es SetRGBPalette(Color, R,G,B) donde
Color va de 0 a 15, en este caso, y de 0 a GetMaxColor en el caso general (como ya hemos comentado, GetMaxColor es una función que nos dice el número de colores disponibles según el driver y modo que estemos usando.
R,G,B van de 0 (negro) a 63 (intensidad máxima de cada uno de ellos).

Así, nuestro "cono" retocado quedaría:

{--------------------------}

program SegundoGraficoRetocado;

uses
Graph, { Va a usar la librería gráfica de TP }
Crt; { y la CRT para tiempo y teclado }

var
Driver, Modo: Integer; { Pues el driver y el modo, claro }
bucle: word; { Para bucles, ya se verá por qué }
Intensidad: byte; { Intensidad del color }
Incremento: ShortInt; { Será +1 ó -1 }
Tecla: char; { La tecla que se pulse }

begin
Driver := Vga; { Para pantalla VGA }
Modo := VgaHi; { Modo 640x480, 16 colores }
InitGraph(Driver, Modo, 'c:tpbgi'); { Inicializamos }
SetColor(Red); { Color rojo }
for bucle := 1 to 40 do { Dibujaremos 40 círculos }
circle ( bucle*5, bucle*5, bucle*5 );
Intensidad := 63; { Empezaremos desde rojo }
Incremento := -1; { y disminuyendo }
while not keypressed do { Mientras no se pulse tecla }
begin
SetRGBPalette(Red, Intensidad, 0, 0); { Cambia la paleta }
Intensidad := Intensidad + Incremento; { Y la próxima intens. }
if Intensidad = 0 then { Si llegamos a int. 0 }
Incremento := 1; { Deberemos aumentar }
if Intensidad = 63 then { Si es la máxima }
Incremento := -1; { Disminuiremos }
delay(20); { Pausa de 20 mseg }
end;
Tecla := ReadKey; { Abosorbemos la tecla pulsada }
CloseGraph { Y se acabó }
end.


14.8: Dibujando líneas.
Otro efecto curioso es el que ocurre cuando cambiamos la forma de dibujar los puntos. El siguiente ejemplo dibuja líneas desde el origen (0,0) a cada uno de los puntos de la línea inferior.

{--------------------------}

program TercerGrafico;

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

var
Driver, Modo: Integer; { Pues el driver y el modo, claro }
bucle: word; { Para bucles, ya se verá por qué }

begin
Driver := Vga; { Para pantalla VGA }
Modo := VgaHi; { Modo 640x480, 16 colores }
InitGraph(Driver, Modo, 'c:tpbgi'); { Inicializamos }
SetColor(LightRed); { Color rojo }
for bucle := 0 to 639 do { Dibujaremos lineas }
line (0,0,bucle,439);
Readln; { Esperamos }
CloseGraph { Y se acabó }
end.


Sencillo, ¿no?
14.9. Otro efecto más vistoso.
Ahora veamos lo que ocurre si dibujamos los puntos de cada línea haciendo una operación XOR con los que ya existían, en vez de dibujarlos encima simplemente. El efecto es mucho más llamativo:

color


{--------------------------}


program TercerGraficoConXor;

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

var
Driver, Modo: Integer; { Pues el driver y el modo, claro }
bucle: word; { Para bucles, ya se verá por qué }

begin
Driver := Vga; { Para pantalla VGA }
Modo := VgaHi; { Modo 640x480, 16 colores }
InitGraph(Driver, Modo, 'c:tpbgi'); { Inicializamos }
SetColor(LightRed); { Color rojo }
SetWriteMode(XORPut); { <-- Este es el cambio }
for bucle := 0 to 639 do { Dibujaremos lineas }
line (0,0,bucle,479);
for bucle := 0 to 479 do { y más }
line (0,0,639,bucle);
Readln; { Esperamos }
CloseGraph { Y se acabó }
end.


Pues lo voy a dejar aquí. Espero que todo esto os haya dado una base para empezar a cotillear y, sobre todo, que haya hecho que os pique la curiosidad.
Así que ya sabeis, si os llama la atención esto de los gráficos, pues a experimentar. Insisto en que un ejemplo del que se puede aprender mucho es del BGIDEMO.PAS que trae Turbo Pascal: allí podreis ver con detalle cómo manejar los tipos de letra, copiar zonas de la pantalla, definir patrones para rellenar zonas, etc.:

Grafico

Bueno, queria mostrar un el modo grafico en pascla, espero lo hayan entendido y les sea de utilidad...esto es una recopilacion de fuentes que hice, voy a dejar un par de fuentes...saludos y recomienden el post si les gusto...gracias!!!

Fuentes:

http://turbopascal.***/page17.htm

http://www.freepascal.es/tutorials/cupas14e.php


Fuentes de Información - La Pantalla en Modo Grafico de Pascal

Dar puntos
56 Puntos
Votos: 9 - T!score: 6.5/10
  • 0 Seguidores
  • 8.480 Visitas
  • 15 Favoritos

11 comentarios - La Pantalla en Modo Grafico de Pascal

@cbse Hace más de 3 años
Pascal que tiempos aquellos
@ezekiel94 Hace más de 3 años
+10, despues lo leo
@gonza0605 Hace más de 3 años
la calentura que me pegue con el modo grafico de pascal, no se puede explicar!!! odiaba tener que hacer ejercicios de la facu en modo grafico
@jeferbc Hace más de 3 años
excelente post esto es inteligencia colectiva +10
@tarbzip2 Hace más de 3 años
o SCREEN 2 en GW-Basic ... y este??? jaja
@maty95gr Hace más de 3 años
@Sh3d4rk_96 Hace más de 3 años
estan mal las imagenes amigo te aviso de buena honda
@tusfrases123 Hace más de 3 años +1
Sh3d4rk_96 dijo:estan mal las imagenes amigo te aviso de buena honda

Comprate un diccionario
@tanosdeaca Hace más de 1 año
MUY BUENO ,NO SABIA QUE LO TENMIA EN PASCAL
@Sifhax Hace más de 6 meses
Muchas gracias, una ayuda enorme para la escuela. +10