Apple ][ Coding Challenge: Fractal Tree

Hola Youtube. Bienvenido a Codificando juntos. En el episodio anterior,
programé el juego de la serpiente en Applesoft BASIC en esta
computadora Apple II Plus imprimiendo texto en la pantalla. Hoy estoy muy
emocionado porque ¿adivinen qué vamos a hacer hoy? Gráficos de computadora. (CANTO) Codificando juntos. Siempre seremos mejores
amigos para siempre. Estaré allí cuando sea. Si te sientes deprimido, lo
haré mejor. Sepa qué medir. El bucle for que tenemos,
la alegría, el placer. Así que vámonos a
disfrutar del clima. Estos son los días que
siempre atesoraré. Oh, cariño, estamos codificando juntos. Siempre seremos mejores
amigos para siempre.

Codificando juntos. Codificando juntos. Tengo todo lo que necesito
aquí, mi manual de referencia de Apple II , mi
manual de referencia de programación básica para Applesoft BASIC y mi
nuevo tutorial de Applesoft, recién publicado y publicado en 1979
. Sólo para refrescar tu memoria, para
imprimir texto en la pantalla, uso el comando Imprimir. Si quiero dibujar en la
pantalla en lugar de usar imprimir, puedo ingresar al modo de gráficos
con el comando GR. Echemos un vistazo
en el tutorial sobre cómo funciona el modo de gráficos. Lo primero que
me muestra cómo hacer es cómo configurar el color del televisor. Ahora, un día de estos
, voy a tener en mis manos un televisor en color. Pero por ahora sólo tengo
este monitor monocromático. Buenas noticias para ti, la
forma en que estoy capturando la salida
del Apple II a través de un
convertidor analógico a HDMI y en una PC moderna con
Open Broadcast Studio, aunque no puedo
verlo, en realidad verás el a todo
color en el vídeo que estás viendo ahora mismo.

Una de las cosas buenas
del modo de gráficos es que todavía tengo un pequeño
mensaje aquí en la parte inferior. Tengo alrededor de tres
filas de texto para trabajar mientras tengo el
modo de gráficos en la parte superior de la pantalla. Y puedo configurar el
color, probemos… qué, me dice que es
violeta, violeta claro, lavanda. Y luego
tracemos un punto, 0,0. Mira eso. ¿ Es morado? No sé. Estoy viendo solo
verde aquí mismo. Pero probablemente estés
viendo color púrpura justo en la parte superior izquierda, como
Procesamiento o P5, 0,0, arriba a la izquierda. Ahora bien, ¿cuál es la
resolución de su pantalla? Esa es la
esquina superior derecha, 39 coma 0.

Entonces tenemos 40 píxeles
de ancho y 40 de abajo. Ahí, las cuatro esquinas. También puedo dibujar líneas con
Hline para línea horizontal y Vline para línea vertical. Si quiero dibujar una
línea horizontal de 0 a 39, esas son las posiciones horizontales
en una posición vertical
como 20, ahí vamos. Línea horizontal en el medio. Línea vertical arriba y
abajo en el medio. Limpia la pantalla. Vuelve al modo texto. Y aquí estamos. ¿ Qué deberíamos intentar hacer? ¿ Qué tal si programamos
una pelota que rebota? Si recuerdas,
si quiero escribir algún código que
pueda ejecutar, tengo que darle números de línea. Entonces, comencemos con la línea número
10, ingresando al modo de gráficos. Línea número 20,
creemos una x y una y para indicar dónde estará la pelota. Luego, en la línea 30, establezcamos
el color, una bonita bola morada. Línea 40, tracemos la pelota. Y en la línea 50,
volvamos a la línea 30.

Y ahí vamos. La pelota no se mueve porque
necesito agregar una velocidad x y una velocidad y. ¿ Y si los hago al azar? Algún valor entre
0 y 3 para la velocidad x. Algún valor entre
0 y 3 para la velocidad y. Podría incluir
números negativos en el azar, pero esto es sólo para
fines de demostración. Te lo dejaré como un desafío
para que lo pruebes en un emulador. Ahora, justo después de
trazar la posición xy, incrementemos x por la
velocidad x y y por la velocidad y. Intentemos ejecutar esto. Oh, error de sintaxis en la línea 25. Esto es algo que
he notado mucho al programar en Applesoft BASIC. Hay
muchas palabras reservadas. Y si alguna vez uso
esas palabras reservadas, incluso como parte del nombre de una variable
, puedo tener problemas.

Entonces, probemos xs
solo para x velocidad. También podría usar dx o delta
x o vx para la velocidad x. De hecho, me gusta vx. Esos deberían ser los
cambios que necesito hacer. Mira eso. Empezó a moverse. Y es aleatorio y
diferente cada vez. Pero recibo un
error de cantidad ilegal. ¿ Porqué es eso? Porque dejé los límites
de dónde puedo dibujar. Entonces puedo agregar una declaración if. Sobrescribamos la línea 50 y digamos,
si x es mayor que 39, entonces vx es igual a vx multiplicado por menos 1. Entonces eso debería invertir la
dirección de la velocidad de x.

¿ Puedo realmente decir un o? Creo que podría poner un
o aquí porque también quiero hacer esto. Si es así o si x es
menor que 0, entonces vx es igual a vx multiplicado por menos 1. Y luego 60, bueno, hagamos que
sea 70 porque sé que voy a hacer una y. También vamos
a decir que vayamos a 30. Así que todavía tenemos una
cantidad ilegal. ¿ Es porque
aún no lo he hecho? Me gusta cómo se ve, es
como intentar dibujar algo
más allá de donde puede y pone estos signos de libra. Intentemos agregar la y. ¿ Sabes cuál es el problema? Si x es mayor que
39, significa que es 40. ¿ Y qué fue lo
último que hice? Trazar xy. Así que me
permití intentar trazarlo en la columna
40, que no existe. Hay diferentes maneras en que
podría manejar esto, tal vez mayor o igual. Pero
por ahora, para simplificar, hagamos que el límite sea
38 y menor que 1. Luego hagamos la y. ¿ Qué he hecho aquí? Arruiné mi número de línea.

Entonces la línea 50 todavía está ahí. Ahora, tengo que cambiar x e
y, marcar x, marcar y. Y ahora necesito
decir en la línea 80. Y en realidad no necesito
configurar el color nuevamente. Entonces puedo ir a la línea 40. Vaya, mira eso. Ahí está mi
pelota que rebota o mi araña gigante. Y finalmente ha
cubierto todo el terreno al que va a ir y
simplemente se está sobrescribiendo a sí mismo. Ahora, por supuesto,
probablemente estés notando que está trazando un rastro. No voy a borrar el
fondo como lo haría , por ejemplo, en Processing o P5. En realidad, este es un gran
tema de discusión. Damos por sentado
que en Processing y JavaScript hay un
cuadro de animación de solicitud, ese identificador, lo que se conoce como
animación de doble búfer. Siempre hay un
buffer de memoria fuera de la pantalla de lo que se está
dibujando en la pantalla que se puede intercambiar para que
no veamos estos pasos intermedios de borrar, dibujar, borrar, dibujar. Si alguna vez ha visto
parpadear un programa de gráficos por computadora, es porque la
animación de doble búfer no está implementada correctamente.

Esto es algo sobre lo
que realmente creo que me gustaría hacer otro
video, cómo hacer animación con doble búfer. Quizás pueda crear un
renderizador 3D simple en BASIC. Oh, eso sería divertido. Pero por ahora,
veamos cómo borrar la posición anterior de la bola
para que solo veamos una en movimiento. Entonces, ¿qué tal si justo
antes de cambiar x e y, guardo la
posición x e y anterior? Digamos que x anterior es igual a
x, y y anterior es igual a y. Luego, en la línea 30,
establezcamos el color en negro y tracemos la
x y la y anteriores. De esa manera, después de haber
cambiado x e y, puedo volver a establecer el color en…

Y dejemos que
sea blanco por ahora porque en realidad
no tengo idea de cómo se ve en lo que estás viendo. Sólo para asegurarnos de que tengo
algo que funciona, establezcamos el color en 15. Y luego, en la línea 55,
tracemos x coma y. Veamos qué pasa. Entonces esto está funcionando. Pero no borra
la posición anterior. Y obtuve un
error de cantidad ilegal en 55. 55 es el gráfico xy. Depuremos esto
imprimiendo los valores de xey en la línea 52, seguidos
del espacio y luego y.

Esto ahora está funcionando muy bien. Parece que mis valores aleatorios
estaban un poco inestables allí. Sí, ahí vamos. Entonces obtuve un número negativo. Claramente, algo
salió mal y probablemente tenga que ver
con la forma en que estoy usando valores de punto flotante. Podría simplemente, cada vez que
llegue al borde, si se pasa un poco
, podría deslizarlo nuevamente a la última columna, última
fila, primera columna, primera fila. Vamos a hacer eso. Entonces, en la línea 60, necesito, en
lugar de simplemente invertir la x, necesito invertir la x y volver a
colocar x en una posición. Necesito hacer dos cosas, lo que
significa que necesito una subrutina. Y lo mismo para la línea 70. La primera subrutina,
vx inverso. Si x es menor que uno, puedo
volver a establecer x en 0.

Oh, me doy cuenta de que
esto también resolverá
el problema de usar 38 y 1 como límite. Pero no nos preocupemos
por eso ahora. Si x es menor que
1, entonces x es igual a 0. Si x es mayor que
39, entonces x es igual a 39. Regresar. ¿ Que pasa conmigo? Estoy siendo muy inconsistente
con mis límites. Veamos si esto funciona. Ups. Oh, creo que olvidé regresar. Aquí vamos. No hay errores, no importa lo que haga. Aún no se borra
correctamente la posición anterior. Permítanme arreglar todos los límites
para que sean como deberían ser. 48? ¿ Cómo llegó a tener 48 años? Realmente debería
trazar xey después de hacer esto
porque aquí es donde están mis restricciones ahora. Para que podamos deshacernos de esta huella. Me siento bastante seguro ahora. Podemos deshacernos de la
línea 50, línea 55. Y en 75, podemos decir Trama. Podemos decir Color
15, Trama x coma y. Por cierto, puedo enumerar una sola
línea de código diciendo Lista 75. Y olvidé los iguales. ¿ Error de cantidad ilegal en 75? Oh Dios mío. Yo iría sub 1000 también en la línea 70.

Ahí vamos. Ahora tengo mi
pelota que rebota perfecta. Simplemente no voy a borrar
la posición anterior. ¿ Cómo voy a hacer eso? Oh, no. Veo el problema. Mi lógica es 100% correcta. Ir a 40 es donde trazo px, py. 30 es donde configuro
el color en negro. Allá vamos todos. ¿ Sabes qué
deberíamos hacer? Deberíamos hacer que emita un pitido
cuando llegue al borde. ¿ Cómo hago un sonido? Sonido es igual a Peek. Oh, me vendría bien un vistazo. Echemos un vistazo a nuestros Peeks. El altavoz de clic es 49200. Eso me da un
error de sintaxis probablemente porque, como me
dice aquí, necesito configurarlo en una variable.

¿ Escuchaste algo? No lo hice. ¿ Escuchaste ese zumbido? Me encanta eso. Bien, escribamos
otra subrutina. Y luego quiero llamar a esta
subrutina de zumbido en las subrutinas de límite x e y. Aquí vamos. Ese es el
sonido más satisfactorio que jamás haya existido. Esto es demasiado divertido. Hay tantas cosas que podría hacer aquí. Podríamos intentar crear
Pong, Brick Out. Podríamos hacer una versión más elegante
del juego de la serpiente con colores. No voy a detenerme aquí
porque si bien les he mostrado GR, el modo de gráficos,
tengo algo aún más emocionante y futurista para mostrarles
: gráficos de alta resolución.

¿ Qué pasa si ahora digo trama? Bueno, establezcamos el
color nuevamente en 15. ¿ Qué pasa si digo trama 10 coma 10? No veo nada. Hplot 10 coma 10? Oh, mira eso. Un pequeño punto allí arriba
en gráficos de alta resolución. Asombroso. Necesitaremos una
pizarra para esto. Gráficos de alta resolución. Para gráficos de alta resolución
, en lugar de tener una
cuadrícula de baja resolución de 40 por 40, ahora tengo un lienzo
para dibujar de 280 píxeles de ancho
por 160 píxeles de alto. Y creo que
HGR2 me permitirá dibujar 20
píxeles más a continuación. Pero me gusta tener la posibilidad
de tener un símbolo del sistema aquí. Y como hemos visto,
en lugar de trama, ahora tengo trama de alta resolución
, o Hplot. Dice aquí, ahora, que los
gráficos de alta resolución en cuanto a color son realmente maravillosos,
pero hay que hacer algunos sacrificios
para poder usarlos.

Hay menos
colores disponibles. Los colores de alta resolución van
desde 0, negro, hasta 7, blanco. Establezcamos el color en
blanco solo para comenzar. Ahora, veamos si podemos
trazar una línea desde la parte superior izquierda hasta la parte inferior derecha. Con 280 por 160, los
píxeles del borde tienen un índice de 279, 159. Oh, mira esa hermosa línea. Esto me da muchas ganas
de hacer un bucle for y dibujar algunas
líneas giratorias. Voy a borrar nuestro
programa de pelotas que rebotan diciendo Nuevo. Así que hagamos un bucle,
donde x va de 0 a 279. Dibujemos de x coma 0
a 297 menos x coma 159. ¿ Me permitirá hacer eso? 40 Siguiente x. Hagamos que el paso sea
un poco más alto.

Simplemente no sé
dónde puse eso. Déjame mirar aquí. Simplemente lo puse
con el bucle for. Entonces puedo decir en la línea 20, porque
x es igual a 0 a 279, paso 5. Impresionante. Probablemente debería detenerme aquí. Pero quiero probar algo con un
grado de dificultad bastante alto. ¿ Puedo realizar mi
desafío de codificación, un árbol fractal, aquí mismo en Applesoft BASIC
en esta computadora Apple II Plus? Ahora no tengo
acceso a Push. No tengo acceso a Pop. No tengo Rotar. Pero creo que puedo
hacerlo con Line y algo de trigonometría básica. ¿ Qué pasaría si comenzara a dibujar
una línea desde el centro inferior hasta aproximadamente el centro? Entonces digamos que lo que quiero
hacer es dibujar la siguiente línea la mitad de larga pero rotada
, digamos, 45 grados. ¿ Qué significa eso? No nos preocupemos por
reducir la línea. Sabemos que son unos 80 píxeles. Entonces, ¿cuál es el desplazamiento
de x y el desplazamiento de y para encontrar el siguiente punto? Sin duda, esto es algo que
he cubierto extensamente en videos sobre
coordenadas polares y trigonometría.

Me aseguraré de incluir
una gran cantidad de recursos y referencias a esos
videos junto con este. Pero la
respuesta rápida aquí es que si conozco este ángulo usando la
letra griega theta para notarlo, el seno de ese ángulo
es el lado opuesto y dividido por la longitud de esta
línea, que acabo de decir que es 80. El coseno de este ángulo es el
lado adyacente x dividido por 80. Entonces puedo
obtener estos desplazamientos para encontrar este punto
diciendo que x es igual a 80 veces el coseno de
ese ángulo y es igual a 80 veces el seno de ese ángulo. Esta será la longitud
de una rama determinada del árbol.

Y luego necesito encontrar
la siguiente rama del árbol dibujando una línea
desde su punto final hasta un nuevo punto
desplazado por un ángulo. Veamos si puedo hacer que eso
funcione en un programa BÁSICO. Empecemos nuevamente. Entra HGR. Establece el color en 3. Solo haz que todo sea blanco. Necesito un largo. ¿ Cuál es la longitud de
esta primera rama? ¿ Qué dije, 80? Entonces necesito trazar una línea. Si finalmente voy a
comenzar a dibujar este patrón de árbol, necesito comenzar con este
punto, moverlo a este punto y luego moverlo a este punto. Entonces necesito una variable para eso. Llamemos a
x, que estaría en la parte inferior, 159, e y, que
estaría en el medio, 140.

Perdón por interrumpir. No sé lo que
estaba pensando. Pero escribí x es
159 e y es 140. La horizontal del medio es 140. Eso es lo que debería ser x. La y inferior debería ser 159. Estará mal durante
el resto de este video. Estará un poco torcido,
pero entiendes la idea. Me aseguraré de corregirlo
en cualquier código que publique. 50 trazar de xy a xy menos l. Ahí está mi línea. ¿ Es ese realmente el medio? No, ese no es el medio. Intercambias tus x
y tus y, Shiffman. Aproximadamente, hagamos que
la longitud del arco sea menor.

Empieza a los 50. Ahora, ¿qué hago aquí?
dx es igual a la longitud por el coseno de un ángulo. Y digamos que el ángulo
es de aproximadamente 45 grados, que es de 90 grados, es aproximadamente 1,5
radianes, 1,6, divídelo por la mitad. Llamémoslo
0,7 como aproximación. Y de hecho, hagamos de eso
una variable, a para el ángulo, y dy es la longitud
multiplicada por el seno de ese ángulo. Establezcamos el
ángulo en la línea 25. El ángulo es 0,7. Una vez que hayamos dibujado esa
primera línea, avancemos y. Y luego la siguiente línea
será Hplot x coma y a x más dx coma y más dy.

Echemos un vistazo
a todo esto. Entonces, en teoría, dibujo una línea
desde abajo hacia el medio y luego calculo su
desplazamiento en función de algún ángulo y dibujo una nueva línea
hasta ese nuevo punto. Bien, entonces, ¿en qué
me equivoqué aquí? El ángulo es en realidad
este ángulo de aquí. Y quiero que sea
este ángulo aquí arriba. Entonces creo que puedo
invertir lo que estoy haciendo con y y decir Hplot xy a x
más dx, y menos dy. Mucho mejor. Esto parece el
comienzo de mi árbol. Ahora tengo los cálculos
que necesito para la ramificación. Pero necesito algún tipo de bucle. Porque, en última instancia, quiero
adjuntar otra rama a esta rama. Y también quiero tener
otro que vaya en sentido contrario, si has visto mis
videos de recursividad fractal.

Empiezo con esta línea,
adjunto dos líneas a esa línea, y a esas, adjunto
dos más, y a esas, adjunto dos más, y
así sucesivamente. Este es un proceso
conocido como recursividad. Y nuevamente, tengo varios
videos donde cubro esto mucho más extensamente. La pregunta es ¿puedo
hacer recursividad en BASIC en esta computadora Apple II? Creo que sí. Primero lo primero. Necesito una subrutina para
dibujar cada línea del árbol. Y voy a
poner eso en 1.000. En realidad, en 1000,
voy a calcular dx y dy.

Entonces pongamos en una
variable la siguiente posición xy. Lo pondré en una
línea, menos dy. Y luego dibujemos. Bueno, solo voy a
poner la línea 1900 Return. Ya no quiero 50, 55, 60,
70 u 80. Entonces, en la línea 50, digo GoSub 1000. Y luego, en la línea 60,
voy a decir Fin. Cuando vuelva,
estará hecho. Bien, entendí esa línea. Oh, porque el ángulo, a la
derecha, esa primera línea, ahora es una rama hacia la derecha. Entonces, hagamos que
el ángulo comience en cero. Y tengamos una variable
para el ángulo delta. Lo llamaré papá. Veremos dónde entra eso. Pero ahora, está bien, lo
hacemos horizontalmente. Aquí es donde
todo se invierte porque mi eje y es
en realidad mi eje x, lo cual es un poco incómodo. Pero creo que habrá
una manera fácil y rápida de resolver esto
simplemente intercambiando el seno y el coseno o la x y la y. No sé qué
será lo menos confuso que pueda hacer.

¿ Sabes que? También podría empezar el
ángulo en 90 grados. Entonces eso es aproximadamente pi
multiplicado por 0,5 con mi ángulo delta. ¿ Y sabes qué? Esto debería estar en una
línea de código separada porque voy a querer
cambiar ese ángulo delta con bastante frecuencia. Así que hagamos esa línea 27. Ahí vamos. Tengo la primera
rama del árbol. Muy bien, ¿qué hago a continuación? Tan pronto como dibujo esa
línea, lo siguiente que hago es mover xy a su siguiente posición,
alterar el ángulo y ¿luego qué? GoSub 1000.

Hazlo de nuevo. Entonces, dentro de esta subrutina
que comienza en la línea 1000, voy a reiniciar
la subrutina. Solo necesito una condición de salida. Si solo digo GoSub 1000,
lo será para siempre. Entonces, ¿qué más puedo hacer aquí? Además de cambiar el
ángulo, reduzcamos la longitud. Entonces agreguemos otra variable. Llamémoslo psiquiatra. Entonces, cada nueva línea tendrá
aproximadamente 2/3 de la longitud. Y así, en la línea 1060, la
longitud es igual a la longitud multiplicada por la reducción y luego GoSub 1000.

Oh, no, no. Si l es mayor que 10,
entonces GoSub 1000 siempre que haya más de 10 píxeles. Entonces calcule la compensación. Consigue el nuevo puesto. Dibujar la línea. Pasa al siguiente lugar. Cambia el ángulo. Cambia la longitud
y hazlo de nuevo. Ese es un lado del árbol. Mira eso. Así que ahora sólo necesito
ir al otro lado. Inmediatamente después de usar GoSub 1000, ¿
qué debo hacer? Necesito girar hacia atrás en
la otra dirección. Entonces eso sería 1080. a es igual… Lo acabo de
cambiar por da. un menos da por 2. 1090, si l es mayor
que 10, entonces GoSub 1000. Bueno, desafortunadamente,
tengo un problema. Además de
invertir el ángulo, también tengo que volver
a la posición anterior. No creo que esto
vaya a funcionar. Creo que voy
a necesitar una matriz para realizar un seguimiento de todas
las posiciones anteriores. Pero en teoría, podría
decir que x es igual a x menos dx, y es igual a y menos dy es
lo que quiero deshacer.

Después de dibujar
la segunda línea, necesito volver
al ángulo original y reducir la longitud,
agregar da de nuevo y decir l es igual a l dividido por Reducir. Oh, algo así como llegar allí. Pero mira, todas mis
posiciones están equivocadas. Entonces este es el principal problema. Esto de simplemente
restar no me lleva al lugar correcto. Necesito una matriz para
realizar un seguimiento de lo que se conoce como pila de todas
las posiciones anteriores. Y de hecho, algo
que puedo utilizar es esta idea de nivel. Este quizás sería el
nivel 0 del árbol. Este es el nivel 1 del
árbol, 2, 3, etcétera. Entonces, cada generación (
también podría llamarla generación)
es algo de lo que quiero realizar un
seguimiento por separado. Entonces, al comienzo
del programa, justo antes de ir a GoSub
1000, agreguemos la línea 45.

El nivel es igual a 0. Y también quiero tener
un número máximo de niveles. Bueno, probemos 2 para empezar. Llámelo MaxLev es igual a 2. Luego, en lugar de que mi
condición de salida sea la longitud, hagamos un seguimiento del
nivel del árbol en el que estoy. Entonces, 1070 sería, si el nivel
es menor que el nivel máximo, entonces GoSub 1000. Y 1090 también sería, si el
nivel es menor que el nivel máximo, entonces GoSub 1000. Luego, cada vez que
obtengo una nueva posición, paso al siguiente nivel. . Y después de dibujar
esas ramas, vuelvo al nivel anterior. Enumeremos de 1000 a 2000,
así que esta es solo la subrutina. ¿ Qué está pasando
en la subrutina? Encuentro la compensación.

Obtengo el nuevo puesto. Trazo la línea. Voy a la siguiente posición. Subo el nivel. Yo giro. Si no estoy al final,
regresa y haz el siguiente. Luego deshacer. Ve por el otro lado. Vuelve y haz el siguiente. Luego regresa
al nivel anterior si tienes que continuar. Error de cantidad ilegal en 1030. De nuevo, me voy al espacio exterior. No estoy siguiendo
las posiciones correctamente. Voy a necesitar una matriz. Pongámoslo un poco
incómodo en la línea 48. Recuerde, para una matriz,
uso Dim para dimensión. Llame al nivel máximo de x. Justo antes de
aumentar el nivel, guardemos la posición x actual
y la posición y actual . Podría usar una
matriz bidimensional aquí, solo tener el
número máximo de niveles y luego dos para la
segunda dimensión en lugar de dos matrices. Pero de todos modos, me resulta un poco
más fácil pensar en esto.

Y luego, una vez que haya
vuelto al nivel, debería poder actualizar
y recuperar esa posición. Estoy seguro de que me estoy perdiendo
algo aquí. Vale, no volví. Entonces podrías ver esto como
la segunda rama correcta para dos niveles, pero no
apareció aquí correctamente. ¿ Porqué es eso? Curiosamente, parece que la x
regresó, pero la y no. Entonces podría ser un error tipográfico. Oh, ya no necesito
hacer esto. No necesito intentar
retroceder con 1085. Eso es lo que hará mi matriz. Oh, así es, más cerca.

Pero necesito
volver allí. ¿ Dónde…
lo guardé en el lugar equivocado? Tal vez se supone que debo guardar
xey antes de obtener nx y ny. Si muevo la línea 1040
a 1043, mira eso. Oh Dios mío. Estoy seguro de que si cambio
los niveles máximos a tres, habrá algún
problema imprevisto aquí. Pero esto está muy cerca. El nivel máximo es 3. Oh, Dios mío. Es un árbol fractal
en el Apple II. Oh, esto es asombroso. Bien, vámonos. Vayamos a por ello.

El nivel máximo es igual, intentemos, 7. Eso podría ser demasiado ambicioso. Mira que lento va dibujando
todos los pedacitos poco a poco. Bueno, ahora ves
lo que es posible con gráficos de alta resolución
, recursividad, líneas de dibujo y formas algorítmicas. ¿ Puedes hacer tu propio árbol? ¿ Puedes alterar los ángulos? Oh, ¿sabes qué sería divertido? Hagamos sólo una cosa.

Quiero mostrarles cómo puedo
obtener información mía, el usuario. Tal vez pueda ingresar
un ángulo y un número máximo de ramas o
algo así o un color. Hagamos sólo el ángulo. Sólo voy a
entrar en el ángulo. Enumeremos solo el
comienzo del programa. Entonces, incluso antes de entrar
en el modo de gráficos, realmente desearía que existiera…
solía haber un comando para volver a numerar todos los números.

Y solía ser Renumerar. O Renum. Lo siento, otra vez desde
el futuro. Parece que el
comando Renumerar que recuerdo con tanto cariño, simplemente
no está disponible cuando el Apple II Plus arranca sin
ningún disco insertado. Pero estoy bastante seguro de que era
parte de DOS 3.3, ProDOS. Si lo recuerdas, si lo sabes,
házmelo saber en los comentarios y te vincularé a algunos
recursos sobre cómo cambiar la numeración de un programa BASIC. Entonces tengo que usar
entre 0 y 10. Puedo decir, llamémosla línea 2. Puedo usar la entrada y
puedo ingresar una variable, da. Deshagámonos de la línea 27. Y digamos en la línea
5, digamos Entrada da, 0.5. ¿ Es ese un ángulo diferente? Creo que es. 0.1. Hazlo mucho más extremo. Sí, ahí vamos. Sí, entonces me saldré de
la pantalla con eso. No tengo ningún error al verificar. Hagamos 1,5. Vaya, eso es una locura. Probablemente debería imprimir una consulta
y decir Inicio y todo eso. Así que hagamos esto un
poco mejor antes de irme. Introduzca un ángulo en radianes.

1 es igual a Hogar. Muy bien,
ejecutemos este programa. Te dibujaré un árbol. Introduzca un ángulo en radianes. Me gusta ese 1.5. Probemos 2 o 1.8. Esto es demasiado divertido,
pero tengo que parar aquí. Espero que
tomes lo que he hecho. Encuentra uno de los emuladores. Los vincularé en la
descripción de este video. Intente ejecutar este código. Hazlo tuyo. ¿ Cómo se puede alterar el árbol? ¿ Puedes probar el color? Una ventaja que tendrás es que
probablemente correrás un poco más rápido que aquí. ¿ Cuál debería ser el tema del
próximo vídeo de Coding Together? ¿ Debería haber animación con doble búfer
y un renderizador 3D en este Apple II Plus? ¿ Necesitas que
vuelva a Procesamiento y P5? Porque yo también podría hacer eso. Déjamelo saber en los comentarios
de Twitter @Shiffman, @thecodingtrain, cualquiera de estos
lugares donde puedas encontrarme. No puedo esperar a estar
contigo nuevamente codificando juntos..

As found on YouTube

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *