Volcán

24 views
Skip to first unread message

galil...@gmail.com

unread,
May 3, 2016, 1:55:57 PM5/3/16
to reda4
Pablo, estoy usando una de tus últimas compilaciones y me ha dado problemas (un puntero gigantesco que me apareció de repente; unas palabras no definidas que no me detectaba el editor; una porción de código que tuve que poner en una palabra aparte porque si no funcionaba mal; el uso de debug, que permitía que el programa se siguiera ejecutando aunque estuviera mal, lo que usando trace producía el cuelgue del sistema, ...) en fin, comportamientos raros que me volvían loco porque pensaba que eran errores mios.

El programa con el que me ha pasado todo esto es el siguiente

| Volcan polícromo
| Adaptacion del programa SimpleParticle (Yabasic). Galileo (2016)

^r4/lib/gui.txt

|numero de particulas, posicion de origen, aceleracion, tempo
#nParts 1000 #xo 500 #yo 400 #a 10.0 #t 0.05
#vx #vy #xp #yp #colorin | campos del registro
#Parts )( 20000 | 1000 * 20

:int 16 >> ;

:ccolor | b g r --
  8 << or 8 << or ;

:ran | n -- n
  rnd swap mod abs ;

:dot | c x y
  0 <? ( 3drop ; ) sh >=? ( 3drop ; )
  swap 0 <? ( 3drop ; ) sw >=? ( 3drop ; ) swap
  setxy px!+ ;

:leereg | d -- d'
  dup 'vx !
  4 + dup 'vy !
  4 + dup 'xp !
  4 + dup 'yp !
  4 + dup 'colorin !
  4 + 
;

:nuevaPart |
  40 ran 20 - 16 << vx !
  80 ran neg 16 << vy !
  xo 16 << xp !
  yo 16 << yp !
  256 ran | b
  256 ran | g
  256 ran | r
  ccolor colorin !
;

:evalua
  swap sh 16 << >? ( 3drop nuevaPart )( swap
    >r 2dup colorin @ rot int rot int dot yp ! xp ! r> vy ! )
;

:volcan
  'Parts 1 ( nParts <=? )( swap
    leereg
    vx @ t *. xp @ + | xn
    vy @ t *. yp @ + | yn
    a t *. vy @ + | vyn
    $000000 xp @ int yp @ int dot | borra pixel de antigua posicion
    evalua
    swap 1+ ) 2drop
;

:inicializa
  'Parts 1 ( nParts <=? )( swap leereg nuevaPart swap 1+ ) 2drop ;

: msec rndseed inicializa $000000 paper cls show volcan 'exit >esc< ;

Bueno, esta es la versión que funciona. Pero, por ejemplo, en la palabra leereg puse dos veces 4+ en vez de 4 + y el editor no protestó. O la palabra evalua, que tuve que crear para sacar ese código del cuerpo de la palabra volcan, ya que ahí no funcionaba bien. En fin, cosas "raras". Yo estoy acostumbrado a Yabasic 2.763, donde el intérprete nunca se cuelga y cuenta con pelos y señales cual ha sido el error y donde está. Con reda4 es ¡crash! y averigua tu ahora qué es lo que ha pasado. Los programas que estoy traduciendo son cortitos y, sin embargo, necesito muchas horas para hacerlos funcionar. Así que no creo que pase los más largos.

Pablo Hugo Reda

unread,
May 3, 2016, 3:48:04 PM5/3/16
to re...@googlegroups.com
Bien, ​la cuestion es asi:

el interprete de bytescodes usas un byte para los saltos entre bloques ( ), if, while, until y repeat usan estos bloques
Por esto solo puede saltar de -128 a 127 bytes atras y adelante, un instruccion como dup esta codificada con un byte
pero una llamada a palabra o una constante ocupa 5 bytes,el resultado es que salta mal en estos casos.
tres cosas:
No esta mal que tengas que no puedas hacer bloques largos, es buena practica hacer mas palabras.
Esta limitacion desaparece si lo compilas!
Prometo agregar el mensaje de error!

Veo muchas optimizaciones en el codigo..ahora me pongo a trabajar...


Pablo Hugo Reda

unread,
May 3, 2016, 4:58:15 PM5/3/16
to reda4
Voy a evitar pasar por variables intermedias cuando estoy calculando cada particula.
Tambien trato de reutilzar los valores que leo de la lista y hacerlo en orden

comento las variables y pongo el offset para obtenerlas

| #vx #vy #xp #yp #colorin | campos del registro
| 0   4   8   12  16

#Parts )( 20000 | 1000 * 20


nueva particula va a recibir la direccion de la particula y escribir en el orden correcto

:nuevapart | adr -- adr++
 
>r
 
40 ran 20 - 16 << r!+
 
80 ran neg 16 << r!+
  xo
16 << r!+
  yo
16 << r!+
 
rnd r!+ | es lo mismo que elegir 3 numeros y juntarlos
  r> ;


Ahora la parte dificil

| #vx #vy #xp #yp #colorin | campos del registro
| 0   4   8   12  16
:getxy | adr -- x y
 
8 + @+ int swap @ int ;

:getpv | adr -- 'pos vel
 @+ swap 4+ swap ;

:evaluaydibuja | adr -- adr++
 $0 over getxy dot | borra pixel de antigua posicion
 dup getpv t *. swap +! | suma pos x
 dup 4+ getpv t *. swap +! | suma pos y
 a t *. over 4+ +! | gravedad
 dup getxy sh >? ( 2drop nuevaPart ; )
 pick2 16 + @ rot rot dot | dibuja punto
 20 +
 ;


getxy la uso para simplificar el acceso a las coordenadas
getpv la decido crear cuando veo que es lo mismo procesar las x que las y, siempre conviene tratar con una dimension a la vez, 
salvo que se necesiten las dos, por ejemplo, con distancia. en 3d es lo mismo, trabajar con menos numeros a la vez
t *. swap +!  podria ser una palabra pero ya es exagerar un poco, solo se repite dos veces!
fijate como naturalmente puedo cortar cuando cae por pantalla, termina en nuevaPart.
elijo buscar el color despues para no tener que desapilar si se borra la particula.
el 20 + final significa..pasar a la siguiente particula

las dos ultimas definiciones

:volcan
 
'Parts nParts ( 1? )( swap evaluaydibuja swap 1- ) 2drop ;

:inicializa
 '
parts nParts ( 1? )( swap nuevaPart swap 1- ) 2drop ;



galil...@gmail.com

unread,
May 4, 2016, 11:50:13 AM5/4/16
to reda4
Bueno, ¿qué decir? Magnífico, como siempre. Estoy a años-luz de tu saber hacer, así que permíteme que te diga que me siento incómodo viendo como cuelgas tus versiones en tu distribución manteniendo mi autoría. Preferiría que pusieras la mía con mi autoría y tu versión con la tuya, aunque sólo fuera para que los hipotéticos usuarios futuros de reda4 vieran las dos maneras de hacer lo mismo, y cómo se puede simplificar y optimizar el código. Desde luego, es sólo una sugerencia. Pero a mí me haría sentir menos incómodo, porque no es cierto que yo sea el autor de lo que tu escribes.

A propósito, se te olvidó quitar la palabra ccolor, que ya no se utiliza. En cuanto a la generación aleatoria de los tres colores primarios por separado, esto me permitía cambiar las tonalidades a mi gusto (al principio jugué con tonos más rojizos, para que se pareciera más a la lava, pero creo que queda más espectacular así).

Pablo Hugo Reda

unread,
May 4, 2016, 3:18:17 PM5/4/16
to reda4
Me ayuda muchisimo lo que estas haciendo, lo unico que puedo hacer es ayudarte a progresar y darte credito por tu trabajo.
Yo tarde 6 meses en hacer un programa que funcione en r4 y era un buen programador de C, vos vas muy bien, es cuestion de practica.
Aprender r4 o forth te va a cambiar la forma de pensar.
No lo aplico 100% pero casi: http://www.ultratechnology.com/method.htm

Aunque no te agrade el Ingles, te digo que es mejor que aprendas, lo vas a necesitar.


Reply all
Reply to author
Forward
0 new messages