Mandala

17 views
Skip to first unread message

galil...@gmail.com

unread,
Apr 5, 2016, 12:39:01 PM4/5/16
to reda4
Mi primer contacto con el manejo de matrices en reda4. Una vez más, agradeceré cualquier perfeccionamiento.

^r4/lib/gui.txt

#radio 180
#esqu 18
#a )( 36 | 18 * 2 bytes
#b )( 36

:rsk | n -- m
  dup esqu 2/ /. 0.5 *. ;

:lineas
  0 ( esqu <? )( 0 ( esqu <? )( over
    2* dup 'a + w@ swap 'b + w@ op
    dup
    2* dup 'a + w@ swap 'b + w@ line
    1+ ) drop 1+ ) drop ;

|:lineas
|  'b 'a 0 ( esqu <? )( >r 'b 'a 0 ( esqu <? )( >r 2over w@ swap w@ op
|    w@+ rot w@+ rot swap line
|    swap r> 1+ ) 3drop 2 + swap 2 + swap r> 1+ ) 3drop ;

:puntos
  'a 'b 0 ( esqu <? )( 1+ rsk dup
    cos radio *. 240 + >r
    sin radio *. 320 + >r 
    rot r> swap w!+
    rot r> swap w!+
    rot
    ) 3drop ;

:mandala puntos lineas ;

: $ffffff paper negro clrscr mandala show 'exit >esc< ;



Pablo Hugo Reda

unread,
Apr 5, 2016, 7:34:07 PM4/5/16
to reda4
Esta muy bien, fijate que naturalmente se ve como se repite una secuencia y ademas tiene sentido

:getxy |  n -- xy
 
2* dup 'a + w@
 swap '
b + w@ ;



:lineas
 
0 ( esqu <? )( 0 ( esqu <? )(

  over getxy op
    dup getxy line
   
1+ ) drop 1+ ) drop ;


Fijate otra cosa. a y b guardan las coordenadas x e y de los puntos.
Es conveniente que esten separadas en memoria?
porque no guardar los dos valores uno a continuacion de otro?

Como comento Manuel en otro post, empaquetar y desempaquetar numeros puede ser de gran ayuda..
en x86 tarda lo mismo leer un byte, un word o un dword.. incluso a veces es mas rapido leer un dword.
entonces conviene mantenerse en 32 bits (o 64 en un futuro) salvo que este trabajando con texto

como empaqueto?
si necesito preservar el signo..

:xyto32 | x y -- xy ; de 16 bits a 32
  $ffff and 16 << swap $ffff and or ; 
:32toxy | xy -- x y
  dup 16 << 16 >> | preserva signo
  swap 16 >> ;

si no necesito el signo
:xyto32
 
16 << or ; | ojo no controlo limites, si el numero es mayo a 65536 los mexcla
:32toxy
  dup $ffff
and swap 16 >> $ffff and ; | el ultimo and es para quitar el signo... >> siempre arrastra el bit de signo



esto simplifica el acceso a los puntos y ademas permanecen juntos en memoria (es bueno para el cache):

:getxy
 
2 << 'lista + @ 32toxy ; | 2 << = 4 *


Otro detalle en el codigo es la repeticion de las lineas..estas dibujando de 0 a 1 y de 1 a 0 por ejemplo

:lineas
 
0 ( esqu 1- <? )( dup 1+ ( esqu <? )(
    over getxy op
    dup getxy line
   
1+ ) drop 1+ ) drop ;

galil...@gmail.com

unread,
Apr 6, 2016, 2:04:07 PM4/6/16
to reda4
Muchísimas gracias por la lección, Pablo. Merced a tus consejos, se me ha ocurrido otra forma de solucionar el problema. A ver qué te parece.

^r4/lib/gui.txt

#radio 180
#esqu 18
#a )( 72 | 18 * 4 bytes
#b


:rsk | n -- m
  dup esqu 2/ /. 0.5 *. ;

:getxy | d -- x y d
  w@+ swap w@+ swap ;

:lineas
  'a ( dup >r 'b <? )( getxy ( 'b <? )( >r 2dup op r> getxy >r line r> )
    3drop r> 4 + ) r> 2drop ;

:puntos
  'a 0 ( esqu <? )( 1+ rsk dup
    sin radio *. 320 + >r
    cos radio *. 240 +
    rot w!+ r> swap w!+
    swap
  ) 2drop ;

:mandala puntos lineas ;

: 'a 72 + 'b ! $ffffff paper negro clrscr mandala show 'exit >esc< ;


Como verás, he colocado las coordenadas en forma de pares x-y consecutivos, siguiendo tu acertada sugerencia, y he conseguido que no repita trazos. El funcionamiento de la palabra "lineas" no resulta muy evidente, y tiene un aspecto más desgarbado, con mucho intercambio con la pila de retorno.

Nuevamente, cualquier comentario al respecto será, como siempre, muy bienvenido.

galil...@gmail.com

unread,
Apr 6, 2016, 2:25:31 PM4/6/16
to reda4
He cambiado el siguiente código, por lo del excesivo uso de la pila de retorno.

:getxy | d -- d x y
  w@+ swap w@+ swap rot rot ;

:lineas
  'a ( dup 'b <? )( getxy rot ( 'b <? )( rot rot 2dup op rot getxy line )
    3drop 4 + ) drop ;


Ya no me parece tan feo.
Reply all
Reply to author
Forward
0 new messages