Creación de gráficos pascal
Las órdenes gráficas más habituales son:
Creo que no tiene sentido que me enrolle con ellas. Voy a poner sólo un ejemplo que use las más frecuentes:
Un comentario obligado: Nuevamente, este programa funciona sin cambios en TMT y FPK/Free Pascal, pero hay un posible peligro: estamos detectando la tarjeta gráfica que existe en nuestro ordenador y dejando que el propio compilador elija el modo gráfico dentro de ese tipo de tarjeta. Esto es peligroso con estos compiladores, que reconocen tarjetas más modernas y permiten acceder a los modos VESA, con más puntos y/o más colores. Así, este programa probado con mi ordenador y con TMT cambia a un modo que no es el de 640x480 puntos con 16 colores que usaría Turbo Pascal, sino a otro con mayor número de colores, mientras que FPK deja mi pantalla "en negro", posiblemente porque esté cambiando a un modo de pantalla de mi alta resolución, que sí permita mi tarjeta gráfica pero no mi pantalla. Con Free Pascal sí funciona correctamente, aunque reserva un tamaño de pantalla mayor de 640x480. Su apariencia es ésta:
- PutPixel(x,y,color): dibuja un punto en un color dado.
- Line(x1,y1,x2,y2): dibuja una linea con el color y estilo predefinido.
- SetColor(color): escoge el color predefinido.
- SetLineStyle(estilo, patron, color): cambia el estilo con que se dibujarán las líneas. Para elegir el estilo de línea, tenemos predefinidas constantes como SolidLn (línea continua), DottedLn (de puntos), etc. Para el grosor también tenemos constantes: NormWidth (normal), ThickWidth (gruesa).
- Circle(x,y,radio): dibuja un circulo con el color predefinido.
- Ellipse(x,y,anguloIni, anguloFin, radioX, radioY): dibuja una elipse o un arco de elipse.
- Arc(x,y,anguloIni, anguloFin, radio): dibuja un arco circular.
- Rectangle(x1,y2,x2,y2): dibuja un rectángulo con el color y el tipo de línea predefinido. Los puntos son las esquinas superior izquierda e inferior derecha
- Bar(x1,y1,x2,y2): dibuja un rectángulo relleno con el color de relleno (y el patrón de relleno, si es el caso) dados por SetFillStyle y SetFillPattern.
- SetFillStyle(patron, color): elige el patrón y color de relleno.
- SetFillPattern(patron, color): permite redefinir el patrón con que se rellenarán las figuras.
- Bar3D(x1,y1,x2,y2,profund,tapa): dibuja un rectángulo relleno, con una cierta profundidad en 3D (si la profundidad es 0, equivale a "Bar" pero como una barra exterior.
- FloodFill(x,y,borde): rellena una zona cerrada, cuyo borde sea de un cierto color. Usa el color y patrón de relleno actual.
- OutText(texto): escribe un texto en la posición actual del cursor.
- OutTextXY(x,y,texto): escribe un texto en una posición dada.
- SetTextStyle(fuente,direccion,tamaño): elige la fuente (tipo de letra), la direccion y el tamaño con que se escribirán los textos.
- (etc)
Creo que no tiene sentido que me enrolle con ellas. Voy a poner sólo un ejemplo que use las más frecuentes:
{--------------------------}
{ Ejemplo en Pascal: }
{ }
{ Funciones gráficas }
{ más frecuentes }
{ DEMOGRAF.PAS }
{ }
{ Este fuente procede de }
{ CUPAS, curso de Pascal }
{ por Nacho Cabanes }
{ }
{ Comprobado con: }
{ - Turbo Pascal 7.0 }
{--------------------------}
program DemoGraf;
uses graph;
var
driver, modo: integer;
x, y: integer;
i: integer;
begin
driver := detect;
initgraph(driver, modo, '');
randomize; { Comienzo a generar números al azar }
line(0,0,639,479); { Línea fija }
for i := 1 to 200 do { 200 puntos }
putpixel(random(640), random(480), random(15)+1);
for i := 1 to 50 do { 50 círculos }
begin
setcolor(random(15)+1);
circle(random(640), random(480), random(50));
end;
for i := 1 to 30 do { 30 rectángulos }
begin
x := random(500);
y := random(400);
setcolor(random(15)+1);
rectangle(x, y, x+random(140), y+random(80));
end;
for i := 1 to 15 do { 15 rectángulos }
begin
x := random(500);
y := random(400);
setcolor(random(15)+1);
setfillstyle(random(11), random(15)+1);
bar(x, y, x+random(140), y+random(80));
end;
{ Recuadro con texto en su interior }
setfillstyle(SolidFill, LightBlue);
SetColor(Yellow);
Bar3D(93,93,440,112, 5, true);
setcolor(Red);
OutTextXY(99,99,'Prueba del modo gráfico desde Turbo Pascal');
setcolor(White);
OutTextXY(100,100,'Prueba del modo gráfico desde Turbo Pascal');
readln;
closegraph;
end.
Espero que todo se entienda por si solo. Los principales cambios (además del hecho de emplear algunas órdenes nuevas para nosotros) son los siguientes:
- En vez de decirle que quiero usar una tarjeta VGA y el modo de alta resolución VgaHi, le pido que detecte qué tarjeta gráfica tengo instalada, con la orden driver := detect;
- Aun así, en todo el programa estoy suponiendo que el tamaño de mi pantalla es de 640x480 puntos, y puede que esto no sea cierto. Sería preferible usar GetMaxX en vez de 640 y GetMaxY en vez de 480.
- Con Randomize comienzo a generar números aleatorios (al azar). Random(640) es una función que me devuelve un número al azar entre 0 y 639. Ambas se ven con más detalle en la ampliación 1.
- Para los colores, he supuesto que tengo 16 colores disponibles (del 0 al 15) y nuevamente habría sido más correcto usar GetMaxColor para saber con certeza cuantos puedo emplear. En cualquier caso, estos colores irán del 0 al 15; como el 0 es el negro, que no se ve, dibujo los puntos y las líneas tomando como color random(15)+1, que me dará un color entre 0 y 14, al que luego sumo 1: un color entre 1 y 15, con lo que consigo "esquivar" el negro.
Un comentario obligado: Nuevamente, este programa funciona sin cambios en TMT y FPK/Free Pascal, pero hay un posible peligro: estamos detectando la tarjeta gráfica que existe en nuestro ordenador y dejando que el propio compilador elija el modo gráfico dentro de ese tipo de tarjeta. Esto es peligroso con estos compiladores, que reconocen tarjetas más modernas y permiten acceder a los modos VESA, con más puntos y/o más colores. Así, este programa probado con mi ordenador y con TMT cambia a un modo que no es el de 640x480 puntos con 16 colores que usaría Turbo Pascal, sino a otro con mayor número de colores, mientras que FPK deja mi pantalla "en negro", posiblemente porque esté cambiando a un modo de pantalla de mi alta resolución, que sí permita mi tarjeta gráfica pero no mi pantalla. Con Free Pascal sí funciona correctamente, aunque reserva un tamaño de pantalla mayor de 640x480. Su apariencia es ésta:
Podemos evitar este tipo de posibles problemas no dejando que el compilador detecte cual es nuestra tarjeta gráfica, sino obligando nosotros, como hicimos en el ejemplo anterior, cambiando esta línea
driver := detect;
por estas dos
Driver := Vga; { Para pantalla VGA }
Modo := VgaHi; { Modo 640x480, 16 colores }
Modo := VgaHi; { Modo 640x480, 16 colores }
Comentarios
Publicar un comentario