Página 1 de 1

SCALE

NotaPublicado: Sab Feb 07, 2009 2:44 am
por badaman
A raiz del último artículo de Afx en la web sobre el comando SCALE y el sistema de coordenadas en las ventanas del QL (ver artículo) me ha parecido buena idea demostrar, mediante un ejemplo "simpático", la potencia de esta instrucción. Véase el resultado:

Imagen

Código: Seleccionar todo
100 REMark acid_face -2009- badaman
110 ancho=512: alto=256: ca=5: pa=0
120 MODE 8: OPEN #ca,scr_
130 posvx=(512-ancho)/2
140 posvy=(256-alto)/2
150 WINDOW#ca,ancho,alto,posvx,posvy
160 PAPER #ca,pa: CLS #ca
170 ncaras=RND(5 TO 10)
180 FOR i=1 TO ncaras
190   valy=RND(20 TO 255)
200   valx=X_Scale(valy,ancho,alto)
210   y=RND(10 TO valy-10)
220   x=RND(10 TO valx-10)
230   c=RND(1 TO 7)
240   SCALE #ca,valy,0,0
250   acid_face ca,x,y,c
260 END FOR i
270 CLOSE #ca
280 PAUSE: RUN
290 :
300 DEFine FuNction X_Scale (y_scale, wide, high)
310   RETurn .7411765 * y_scale * wide / high
320 END DEFine X_Scale
330 :
340 DEFine PROCedure acid_face (canal, posx, posy, color)
350   INK #canal,color
360   CIRCLE #canal,posx,posy,10
370   FILL #canal,1: ELLIPSE #canal,posx-2.5,posy+2.5,2.5,.4,0: FILL #canal,0
380   FILL #canal,1: ELLIPSE #canal,posx+2.5,posy+2.5,2.5,.4,0: FILL #canal,0
390   ARC  #canal,posx-6,posy-2 TO posx+6,posy-2,PI-.5
400   LINE #canal,posx-5.5,posy-1 TO posx-7,posy-3
410   LINE #canal,posx+5.5,posy-1 TO posx+7,posy-3
420 END DEFine acid_face

El programa dibuja un número n de caras llamando al PROCedure 'acid_face'. El radio de la cara y la posición relativa de los ojos y la boca no varían nunca. sólo cambia la escala y la posición 'x' e 'y' en donde se dibujan las caras.

La escala (el alto) la decidimos en la línea 190.

Usamos la FuNction 'X_Scale' del artículo antes mencionado para determinar el ancho en puntos de la ventana en función de la escala.

En la línea 240 aplicamos la escala a la ventana.

'ancho' y 'alto' definen respectivamente los valores de la ventana que indican sus nombres.

'pa' indica el color de fondo de la ventana.

El número de caras y el color de las mismas se toman aleatoriamente.

Pulsamos una tecla para regenerar la pantalla.

Para salir del programa pulsamos CTRL + ESPACIO.

Re: SCALE

NotaPublicado: Sab Feb 07, 2009 11:46 am
por radastan
¿Reminiscencias de Watchmen?

:lol:

La verdad es que SCALE permite cosas bastante buenas, es posible repetir modelos en un escenario sin tener que tener uno para cada distancia.

Re: SCALE

NotaPublicado: Sab Feb 07, 2009 12:26 pm
por badaman
SCALE tiene los siguientes parámetros: SCALE [cannal,]escala,posx,posy

Cambiando el valor de 'escala' (tamaño de la escala vertical) que indica el número de puntos gráficos (no pixels) de una ventana en el eje y, podemos dibujar una imagen aumentando y reduciendo el zoom. A mayor escala más pequeño se verá el dibujo, y al contrario.

Cambiando el valor de 'x' e 'y' (coordenadas de origen de la escala) podemos movernos por un espacio gráfico mucho mayor que el de la misma ventana donde estamos mostrando el dibujo.

Imagina lo que nos permite hacer esto en un mapa de un juego o en un plano cartográfico.

El valor de escala por defecto es 100. Si queremos que el valor de escala coincida con el número de pixels de altura en una ventana debemos definir el mismo número de escala que el numero de pixels de altura de la ventana, por ejemplo, definiendo una ventana que ocupe toda la pantalla y aplicándole un valor de escala de 256.

Código: Seleccionar todo
WINDOW 512,256,0,0
SCALE 256,0,0


Con la ROM Minerva podemos incluso usar valores de escala negativos, lo que nos permite dibujar también imágenes boca abajo. Lástima no contar con un parámetro de escala horizontal y poder mostrar imágenes en espejo o deformadas.

Re: SCALE

NotaPublicado: Sab Feb 07, 2009 12:37 pm
por afx
badaman escribió:me ha parecido buena idea demostrar, mediante un ejemplo "simpático", la potencia de esta instrucción

¡¡Buen ejemplo!! ... (y además simpático) :D .

Efectivamente, una instrucción muy útil. Con este comando es muy simple hacer un "zoom" y "scroll" de un dibujo vectorial cambiando simplemente la escala de representación (sin alterar las coordenadas del dibujo).

.