Ver el código de Sección 8 - Como dibujar buenos círculos

%%(wacko wrapper=text wrapper_align=center)((https://www.atariware.cl/archivos/compu-util1/circulos.png))%%

Los cinco programas incluidos en esta sección, te enseñarán como dibujar un círculo -y como dibujarlo rápido- sin saltos bruscos a través de arcos que te producirían un resultado tosco. Estos utilitarios van desde una rutina elemental (que demora 60 segundos en dibujar el círculo), hasta una versión que lo terminará en menos de 3 segundos.

El programa 1 dibuja círculos, pero demora más de un minuto en hacerlo, independientemente de lo grande o pequeño que éste sea.

Un círculo es simétrico, de modo que podemos aprovechar esta condición de simetría. Si conocemos el valor de un punto, podemos reflejarlo a través del eje X o a través del eje Y. Esto quiere decir que si el punto de coordenadas (X,Y) es un punto del círculo, también lo será (X,-Y) y lo mismo ocurre para los puntos (-X,Y) y (-X,-Y). De esta manera, tenemos- que ejecutar sólo la cuarta parte del trabajo. Pero los círculos son también simétricos con respecto a la línea diagonal representada por la ecuación X=Y. Entonces, si sabemos que el punto de coordenadas (X,Y) está sobre el círculo, también lo estará el punto de coordenadas (Y,X). Ahora tenemos que determinar sólo la octava parte de los puntos. El programa 2 de esta sección, utiliza dicho método.

Desafortunadamente, aún cuando estemos efectuando sólo una octava parte del trabajo, aún demoraremos más de 10 segundos en dibujar el círculo. Quizás haya una mejor manera de hacerlo: en lugar de usar las funciones trigonométricas seno y coseno, usar la ecuación que representa al círculo, es decir:

**X*X+Y*Y=R*R**

Esto en realidad pareciera no ser muy útil, pero si reordenamos la ecuación, a través de pasos algebraicos lícitos, obtendremos:

**Y=SQR(R*R-Y*Y)**

De este modo, todo lo que tenemos que hacer, es encontrar los valores correspondientes de Y, cuando X varía entre -R y R.

Nos queda aún un problema que resolver: la función SQR retorna sólo positivos correspondientes, queremos graficar también negativos. El programa 3 es cano hacerlo.

Este método es más rápido que usar senos y cosenos, pero aún demorara más de 16 segundos en dibujar el círculo. Más práctico y eficiente resulta, entonces, reflejarlo tal como lo hicimos en el programa 2.

El programa 4, proporciona este método, el que demora tan solo 5 segundos en hacer-círculos de gran diámetro, y es mucho más rápido trabajando con círculos pequeños.

**Un circulo mas rápido**

La pantalla está conformada por un arreglo de puntos, cada uno de los cuales está identificado biunívocamente por un par ordenado -dos coordenadas- (X,Y).

Sin embargo, X e Y son siempre números enteros y si graficas (PLOT) 0.5,0.5 los números siempre serán redondeados al entero.

De manera que si estás tratando un punto del círculo en particular, y tratas de imaginar en donde estarán los otros, verás que puedes ir en ocho direcciones diferentes.

Si divides el círculo en 4 partes, entonces solamente 3 de esas direcciones son válidas. Si divides el círculo en 8 partes, podrás ir sólo en 2 direcciones.

Por ejemplo, si estás en el punto (R,0) del círculo, el punto siguiente puede ser (R-1,0) o (R-1,1).

Como la pantalla no puede graficar puntos que no sean valores enteros, habrá un leve error, que no siempre es igual a cero. Trataremos de mantenerlo tan pequeño como sea posible.

Usaremos, como antes, el sistema de reflejarlo. Esto demora solamente 3 segundos y nunca dibujaremos una línea larga que haga un trazado burdo.

__**Programa 1 "senos y cosenos"**__
%%(code)
100 REM DEMOSTRACION DIBUJO DE CIRCULO 
110 REM PROGRAMA 1 
120 REM 
130 REM
140 REM ESTE METODO DEMORA APROXIMADAMENTE 61 SEGUNDOS 
200 DEG
210 GRAPHICS 8
220 COLOR 1
230 SETCOLOR 2,0,0
240 A=160
250 B=80
260 R=50
300 FOR ALFA=0 TO 360
310 X1=INT(R*COS(ALFA)+0.5)
320 Y1=INT(R*SIN(ALFA)+0.5)
330 PLOT A+X1,B+Y1
340 NEXT ALFA
%%
__**Programa 2 "senos y cosenos reflejados"**__
%%(code)
100 REM DEMOSTRACION DIBUJO DE CIRCULO 
110 REM PROGRAMA 2 
120 REM 
130 REM
140 REM ESTE METODO DEMORA APROXINDAMENTE 11 SEGUNDOS 
200 DEG
210 GRAPHICS 8
220 COLOR 1
230 SETCOLOR 2,0,0
240 A=160
250 B=80
260 R=50
270 PLOT A+R,B
300 FOR ALFA=0 TO 90
310 X1=INT(R*COS(ALFA)+0.5)
320 Y1=INT(R*SIN(ALFA)+0.5)
330 PLOT A+X1,B+Y1
340 PLOT A-X1,B+Y1
350 PLOT A+X1,B-Y1
360 PLOT A-X1,B-Y1
370 PLOT A+X1,B+Y1
380 PLOT A-X1,B+Y1
390 PLOT A+X1,B-Y1
400 PLOT A-X1,B-Y1
410 NEXT ALFA
%%
__**Programa 3 "raíz cuadrada"**__
%%(code)
100 REM DEMOSTRACION DIBUJO DE CIRCULO
110 REM PROGRAMA 3
120 REM 
130 REM 
140 REM ESTE METODO DEMORA APROXIMADAMENTE 17 SEGUNDOS
210 GRAPHICS 8
220 COLOR 1
230 SETCOLOR 2,0,0
240 A=160
250 B=80
260 R=50
270 X0=-R:Y0=0
300 FOR X1=-R TO R
310 Y1=INT(0.5+SQR(R*R-X1*X1))
330 PLOT A+X0,B+Y0:DRAWTO A+X1,B+Y1
335 PLOT A+X0,B-Y0:DRAWTO A+X1,B-Y1
336 X0=X1:Y0=Y1
340 NEXT X1
%%
__**Programa 4 "raíz cuadrada reflejada"**__
%%(code)
100 REM DEMOSTRACION DIBUJO DE CIRCULO
110 REM PROGRAMA 4
120 REM 
130 REM 
140 REM ESTE METODO DEMORA APROXIMADAMENTE 5 SEGUNDOS
210 GRAPHICS 8
220 COLOR 1
230 SETCOLOR 2,0,0
240 A=160
250 B=80
260 R=50
270 X0=-R:Y0=0
280 X1=-R
290 Y1=INT(1*SQR(R*R-X1*X1))
300 PLOT A+X0,B+Y0:DRAWTO A+X1,B+Y1
310 PLOT A-X0,B+Y0:DRAWTO A-X1,B+Y1
320 PLOT A+X0,B-Y0:DRAWTO A+X1,B-Y1
330 PLOT A-X0,B-Y0:DRAWTO A-X1,B-Y1
340 PLOT A+Y0,B+X0:DRAWTO A+Y1,B+X1
350 PLOT A-Y0,B+X0:DRAWTO A-Y1,B+X1
360 PLOT A+Y0,B-X0:DRAWTO A+Y1,B-X1
370 PLOT A-Y0,B-X0:DRAWTO A-Y1,B-X1
380 X0=X1:Y0=Y1
390 IF -X1>=Y1 THEN X1=X1+1:GOTO 290
%%
__**Programa 5 "método veloz"**__
%%(code)
100 REM DEMOSTRACION DIBUJO DE CIRCULO
110 REM PROGRAMA 5
120 REM 
130 REM 
140 REM ESTE METODO DEMORA APROXIMADAMENTE 3 SEGUNDOS
210 GRAPHICS 8
220 COLOR 1
230 SETCOLOR 2,0,0
240 A=160
250 B=80
260 R=50
270 PI=0
280 Y1=0
290 X1=R
300 PIY=PI+Y1+Y1+1
310 PIXY=PIY-X1-X1+1
400 PLOT A+X1,B+Y1
410 PLOT A-X1,B+Y1
420 PLOT A+X1,B-Y1
430 PLOT A-X1,B-Y1
440 PLOT A+Y1,B+X1
450 PLOT A-Y1,B+X1
460 PLOT A+Y1,B-X1
470 PLOT A-Y1,B-X1
500 PI=PIY
510 Y1=Y1+1
520 IF ABS(PIXY)<ABS(PIY) THEN PI=PIXY:X1=X1-1
530 IF X1>=Y1 THEN 300
%%
Una vez que tengas imp1ementadas y grabadas estas rutinas, podrás incorporarlas a tus propios programas y obtener hermosos efectos gráficos, cambiando y alternando diferentes instrucciones de color.

Una buena idea serla combinar alguna de estas rutinas de dibujo de círculos con las rutinas de control del reloj interno del Atari y hacer, por ejemplo, un reloj análogo en pantalla. Te lo dejamos como desafío.