Sistema de coordenadas en el QL,
la sentencia SCALE

Dilwyn Jones
Tal-y-bont, Gales, Reino Unido.

Traducción: Afx
febrero de 2009

Este artículo presenta una pequeña función muy útil para el uso con el escalado de gráficos en el BASIC del QL. Ésta pequeña función debería trabajar tanto en SuperBASIC como en SBASIC.

Recientemente estaba escribiendo un programa que necesitaba del uso de POINT, LINE y otros cuantos comandos gráficos que usan el sistema de coordenadas gráficos del BASIC. Yo necesitaba estar en condiciones de poder escalar gráficos para encajarlos en la pantalla completa, independientemente de la resolución de la pantalla.

Los sistemas QL modernos ofrecen una variedad de formas y proporciones de pantalla, por ejemplo, el QL estándar tiene una resolución de 512x256 y los sistemas Q40/Q60 1024x512. Ambos tienen una proporción de 2:1 píxeles de pantalla. Pero un sistema QXL se ejecuta en modo SVGA con resoluciones de 800 por 600 pixels, esto es una ratio de 4:3 en lugar de 2:1. Un sistema Aurora ofrece un sistema de resolución tipo EGA 650x350, también el QPC ofrece resoluciones similares, lo cual viene a ser una proporción aproximadamente de 2:1 (sólo aproximadamente).

A modo de referencia, aquí se muestran algunas de las resoluciones gráficas más comúnmente usadas de varios tipos de sistemas que yo he usado. Notarás que en esta lista no se incluyen los emuladores como QLay, QemuLator y QDOS Classic dado que yo no tengo suficiente conocimiento de esos tipos de sistemas para poderlos incluir en esta lista.

Ancho    Alto    Ratio    Tipo de sistema
----------------------------------------- 256 256 1:1 QL en modo 8
512 256 2:1 QL en modo 4
512 384 4:3 QPC, Aurora
640 350 aprox. 2:1 modo EGA en QXL, Aurora, QPC
640 480 4:3 modo VGA en QXL, Aurora, QPC
768 280 2.74:1 Extendido 4 en ST-QL
800 600 4:3 SVGA sobre QXL, QPC etc
1024 512 2:1 Q40/Q60, QPC
1024 768 4:3 XGA sobre QPC

Figura 1.

Cuando se define una ventana, el sistema le asigna un SCALE con valor 100 en la dirección del eje vertical, estableciendo el punto de origen en la coordenada 0,0 situado en la esquina inferior izquierda. Es menos fácil de predecir el número de puntos en el sistema de coordenadas que existirán en la dirección horizontal - una ventana que es cuadrada es en términos de número de píxeles no es cuadrada en términos de de coordenadas gráficas.

Esto nos provoca un problema, si utilizamos LINE, CIRCLE, ELLIPSE, etc. para dibujar formas o figuras y dichas formas no caben en la ventana en cuestión, parte de la figura se dibuja fuera de la ventana, aunque no se producen errores gracias a la forma en que los comandos gráficos del BASIC trabajan.

De hecho, existe una relación que no está muy bien documentada que, si se conoce la altura y anchura de la ventana y la escala vertical, nos permite predecir cuantos puntos en el sistema de coordenadas horizontal serán visibles dentro de la ventana en cuestión.

1000 DEFine FuNction X_Scale(y_scale,wide,high)
1010   RETurn 0.75 * y_scale * wide / high
1020 END DEFine X_Scale

Figura 2: Listado de la función.

La función toma tres parámetros. El primero (y_scale) es el número de puntos del sistema de coordenadas deseado en el plano vertical. A menos que lo cambies con el comando SCALE, tendrá normalmente el valor de 100. Si usas por ejemplo SCALE #1, 150,0,0 será de 150. El segundo parámetro es el ancho de la ventana en pixels (si estás usando la resolución del QL en modo TV la ventana #1 o #2 tendrán un ancho de 448, o 252 si usas el modo monitor del QL). El tercer parámetro es el alto de la ventana, normalmente 200 para ambas ventanas en ambos modos (TV o Monitor).

La linea 1010 usa esta información para calcular el número de puntos que le corresponden a eje horizontal. Ten en cuenta que hay una relación de 0,75 o 3:4 entre el eje horizontal y vertical. En otras palabras, sea cual sea la proporción de anchura de la ventana con respecto a la altura, el número de puntos visibles en el sistema de coordenadas horizonal es de 0,75 veces la parte visible del sistema de coordenadas verticales en esta proporción de píxeles.

Básicamente, habida cuenta de la forma de la pantalla QL, la introducción de un escalado como éste es necesaria a fin de que los círculos aparezcan realmente de forma circular dado que si dibujamos "círculos" con una proporción de 1:1 píxeles, éstos no aparecen como circulos en la pantalla del QL ya que los píxeles no son exactamente cuadrados.

Aquí hay un ejemplo simple del uso de esta fórmula. ¿Cuál sería el ancho máximo de una línea que cubra toda la pantalla? Estamos trabajando en una resolución de pantalla del QL de 512x256 y necesitamos dibujar un círculo en el centro de la pantalla. En el listado de la Figura 3 se muestra cómo podemos conseguirlo:

100 WINDOW 512,256,0,0 : CLS
110 x = X_Scale(100,512,256)
120 CIRCLE x/2,50,25
130 :
1000 DEFine FuNction X_Scale (y_scale,wide,high)
1010   RETurn .75 * y_scale*wide/high
1020 END DEFine X_Scale

Figura 3: Uso de la función para centrar un círculo en la pantalla

Bueno, esto podría parecer un gran alboroto para nada. En la realidad, llegar a esta fórmula, ha hecho más fácil para mí escribir programas con gráficos a escala que se ajusten al tamaño y forma de la ventana en cuestión. ¡Oh!, ¿qué programa era ese? Pues eran algunos de los módulos del protector de pantalla de mi programa LPsaver.

Esta rutina es actualmente una aproximación. Podrías encontrar errores, en parte debido a la simplificación de los cálculos realizados, al redondeo en las operaciones de punto flotante, etc, la escala real puede variar de con respecto a lo que indican la rutina, pero los resultados son lo suficientemente aproximados para la mayoría de los propósitos.

Artículo original: http://www.dilwyn.me.uk/docs/articles/scales.zip


Sinclair QL Recursos en Castellano Alojado en / Hosted at:
Sinclair QL Recursos en Castellano
Sinclair QL Spanish Resources