Manual de Basic Spectrum 48k.

Capítulo 17

Gráficos

Resumen

  • PLOT, DRAW, CIRCLE
  • POINT
  • pixels

En este capítulo veremos cómo dibujar imágenes en el ZX Spectrum. La parte de la pantalla que puede utilizar tiene 22 líneas y 32 columnas, lo que equivale a 22*32=704 posiciones de carácter. Como quizás recuerde del capítulo 16, cada una de estas posiciones de carácter está constituida por cuadrados de 8 x 8 puntos y estos se denominan "pixels" (elementos de imagen).

Un pixel está especificado por dos números, que son sus coordenadas. La primera, su coordenada x, indica la distancia en sentido transversal desde la columna izquierda extrema (recuerde que x es una cruz, en el sentido transversal); la segunda, su coordenada y, indica la altura desde la parte inferior. Estas coordenadas suelen escribirse como un par de números entre paréntesis, por lo que (0,0), (255,0), (0,175) y (255,175) son las esquinas inferior izquierda, inferior derecha, superior izquierda y superior derecha, respectivamente.

La sentencia

PLOT coordenada x, coordenada y

entinta el pixel con estas coordenadas, de modo que el siguiente programa "sarampión"

10 PLOT INT (RND * 256), INT (RND * 176): INPUT a$: GO TO 10

dibuja un punto aleatorio cada vez que pulsa ENTER.

Veamos, ahora, un programa bastante más interesante. Traza una representación gráfica de la función SIN (una onda sinusoidal) para los valores entre 0 y 2 PI.

10 FOR n = 0 TO 255
20 PLOT n, 88 + 80 * SIN (n / 128 * PI)
30 NEXT n

El siguiente programa traza un gráfico de SQR (parte de una parábola) entre 0 y 4:

10 FOR n = 0 TO 255
20 PLOT n, 80 * SQR (n / 64)
30 NEXT n

Observe que las coordenadas del pixel son bastante diferentes de la línea y columna en un AT. Puede encontrar el diagrama en el capítulo 15 de utilidad cuando trabaje con las coordenadas del pixel y los números de línea y de columna.

Para ayudarle en sus dibujos, el ordenador trazará líneas rectas, círculos y arcos, con el empleo de las sentencias DRAW y CIRCLE.

La sentencia DRAW, para dibujar una línea recta, adopta la forma

DRAW x,y

El lugar de partida de la línea es el pixel en donde quedó la última sentencia PLOT, DRAW o CIRCLE (se denomina posición PLOT; RUN, CLEAR, CLS y NEW le repone a la esquina inferior izquierda, en (0,0)) y el lugar de final del trazado es x pixels a la derecha del mismo e y pixels arriba. La sentencia DRAW, en sí misma, determina la longitud y la dirección de la línea, pero no su punto de partida.

Observe que los números en una sentencia DRAW pueden ser negativos, aunque los incluidos en una sentencia PLOT no lo pueden ser.

Asimismo, puede trazar y dibujar en color, aunque ha de tener presente que los colores cubren siempre la totalidad de una posición de carácter y no puede especificarse para pixels individuales. Cuando se traza un pixel, se ajusta para mostrar el color de tinta en plenitud y a la totalidad de la posición de carácter que lo contiene se le da el color de tinta corriente. El siguiente programa lo pone de manifiesto:

10 BORDER 0: PAPER 0: INK 7: CLS : REM apagar pantalla
20 LET x1 = 0: LET y1 = 0: REM comienzo de línea
30 LET c = 1: REM para color de tinta, comienzo azul
40 LET x2 = INT (RND * 256): LET y2 = INT (RND * 176): REM acabado aleatorio de línea
50 DRAW INK c; x2 - x1, y2 - y1
60 LET x1 = x2: LET y1 = y2: REM siguiente línea comienza en donde acabó la última
70 LET c = c + 1: IF c = 8 THEN LET c = 1: REM nuevo color
80 GO TO 40

Las líneas parecen ser más anchas a medida que prosigue el programa y ello se debe a que una línea cambia los colores de todo el entintado en pixels de todas las posiciones de carácter que atraviesa. Observe que puede encajar los elementos PAPER, INK, FLASH, BRIGHT, INVERSE y OVER en una sentencia PLOT o DRAW, lo mismo que podría hacerlo con PRINT e INPUT. Van entre la palabra clave y las coordenadas y están terminadas por punto y coma o comas.

Una característica adicional de DRAW es que puede utilizarlo para dibujar arcos de circunferencia en lugar de líneas rectas, con el empleo de un número suplementario para especificar un ángulo a girar; la forma es:

DRAW x,y,a

x e y se utilizan para especificar el punto final de la línea lo mismo que antes y a es el número de radianes que debe girarse a medida que se avanza: si a es un número positivo se gira a la izquierda, mientras que si a es negativo, se gira a la derecha. Otra forma de considerar a es como indicación de la fracción de un círculo completo que se dibujará: un círculo completo es 2 PI radianes, por lo que si a = PI dibujará un semicírculo, si a = 0,5 * PI dibujará un cuarto de un círculo y así sucesivamente.

Por ejemplo, supongamos a = PI. Entonces, cualesquiera que sean los valores que tomen x e y, se trazará un semicírculo. Ejecute:

10 PLOT 100, 100: DRAW 50, 50, PI

que dibujará lo siguiente:

final en (150,150)
comienzo en (100,100)

El dibujo comienza en una dirección de sudeste, pero en el momento en que se detiene tiene dirección noroeste; en el recorrido entre dichos dos puntos ha girado 180° ó PI radianes (el valor de a).

Ejecute el programa varias veces, con PI sustituido por otras varias expresiones, v.g. - PI, PI / 2, 3 * PI / 2, PI / 4, 1, 0.

La última sentencia de este capítulo es CIRCLE, que dibuja un círculo completo. Especifica las coordenadas del centro y del radio del círculo con el empleo de

CIRCLE coordenada x, coordenada y, radio

Lo mismo que con PLOT y DRAW, puede poner las diversas clases de elementos de color al principio de una sentencia CIRCLE.

La función POINT le dice si un pixel es de color de tinta o de papel. Tiene dos argumentos, las coordenadas del pixel (que deben estar encerradas entre paréntesis) y su resultado es 0 si el pixel es de color de papel y 1 si es color de tinta. Pruebe:

CLS : PRINT POINT (0,0) : PLOT 0,0: PRINT POINT (0,0)

Teclee:

PAPER 7: INK 0

e investiguemos cómo INVERSE y OVER operan en el interior de una sentencia PLOT. Las dos afectan al pixel correspondiente y no al resto de las posiciones de carácter. Suelen estar inactivas (0) en una sentencia PLOT, por lo que sólo necesita mencionarlas para que se les active (1).

Se da a continuación una lista de las posibilidades para su referencia:

PLOT; -esta es la forma habitual. Traza un punto de tinta; esto es, posiciona el pixel para poner de manifiesto el color de tinta.

PLOT INVERSE 1; -traza un punto de erradicador de tinta; esto es, posiciona el pixel para poner de manifiesto el color del papel.

PLOT OVER 1: -cambia el pixel a partir de cualquier estado anterior, por lo que si tenía color de tinta adquirirá color de papel y viceversa.

PLOT INVERSE 1; OVER 1; -deja el pixel exactamente igual a como estaba antes; pero observe que también cambia la posición PLOT, por lo que podría utilizarle simplemente para hacer esa operación.

Como otro ejemplo de utilización de la sentencia OVER, llene la pantalla con escritura utilizando blanco y negro y luego, teclee:

PLOT 0, 0: DRAW OVER 1; 255, 175

Dibujará una línea bastante correcta, aun cuando tenga interrupciones en la misma siempre que se encuentre con alguna escritura. Ahora vuelva a hacer exactamente el mismo comando. La linea se desvanecerá sin dejar ningún rastro. Esta es la gran ventaja de OVER 1. Si hubiera dibujado la línea utilizando

PLOT 0, 0: DRAW 255, 175

y la hubiera borrado con el empleo de

PLOT 0, 0: DRAW INVERSE 1; 255, 175

entonces, habría borrado también parte de la escritura.

Ahora, pruebe:

PLOT 0, 0: DRAW OVER 1; 250,175

e intente borrar la línea mediante

DRAW OVER 1; -250, -175

Con esta orden no se opera de forma correcta, porque los pixels que la línea utiliza en el recorrido de retorno no son completamente los mismos que los que se emplearon en el trazado. Ha de borrar una línea en la misma dirección exactamente en que la dibujó.

Una forma de conseguir colores no habituales es introducir dos colores normales juntos en un solo cuadrado, con el empleo de un gráfico definido por el usuario. Ejecute el siguiente programa:

1000 FOR n = 0 TO 6 STEP 2
1010 POKE USR "a" + n, BIN 01010101: POKE USR "a" + n + 1, BIN 10101010
1020 NEXT n

que da el gráfico definido por el usuario que corresponde a una configuración de tablero de ajedrez. Si imprime este carácter (modo de gráfico, luego a) en tinta roja sobre papel amarillo, le encontrará con un color naranja moderadamente aceptable.

Ejercicios

  1. Juegue con los elementos PAPER, INK, FLASH y BRIGHT en una sentencia PLOT. Estas son las partes que afectan a la totalidad de la posición de carácter que contiene el pixel. Normalmente es como si la sentencia PLOT hubiera comenzado

    PLOT PAPER 8; FLASH 8; BRIGHT 8; ...

    y sólo se altera el color de tinta de una posición de carácter cuando algo se traza en la misma, pero puede cambiarlo si lo desea.

    Tenga especial cuidado cuando utilice colores con INVERSE 1, porque posiciona el pixel para poner de manifiesto el color del papel, pero cambia el color de la tinta y éste podría no ser lo que esperaba.

  2. Intente dibujar círculos con el empleo de SIN y COS (si ha leído el capítulo 9, trate de resolverlo). Ejecute el programa siguiente:

    10 FOR n = 0 TO 2 * PI STEP PI / 180
    20 PLOT 100 + 80 * COS n , 87 + 80 * SIN n
    30 NEXT n
    40 CIRCLE 150,87,80

    Puede ver que la sentencia CIRCLE es mucho más rápida, aunque menos exacta.

  3. Pruebe:

    CIRCLE 100, 87, 80: DRAW 50, 50

    A partir de ella puede constatar que la sentencia CIRCLE deja la posición PLOT en un lugar bastante indeterminado (siempre está en algún lugar a medio camino ascendente en el lado derecho del círculo. Habitualmente necesitará seguir a la sentencia CIRCLE con una sentencia PLOT antes de que haga cualquier otro dibujo.

  4. Veamos un programa para dibujar la gráfica de casi cualquier función. Primero, le pide un número n; trazará la gráfica para valores desde -n a +n. A continuación, le pide la función propiamente dicha, introduciéndola como una cadena. La cadena debe ser una expresión que utilice x como el argumento de la función.

      10 PLOT 0, 87: DRAW 255, 0
      20 PLOT 127, 0: DRAW 0, 175
      30 INPUT s, e$
      35 LET t = 0
      40 FOR F = 0 TO 255
      50 LET x = (f - 128) * s / 128: LET y = VAL e$
      60 IF ABS y > 87 THEN LET t = 0: GO TO 100
      70 IF NOT t THEN PLOT f, y + 88: LET t = 1: GO TO 100
      80 DRAW 1, y - antigua y
    100 LET antigua y = INT (y + x)
    110 NEXT F

    Ejecute el anterior programa, a título de ejemplo, introduzca por el teclado 10 para el número n y 10 * TAN x para la función. Trazará una gráfica de tangente de x, cuando x varía desde -10 a +10.



Manual de Basic Spectrum 48k.