Lisp »Tips 'n Tricks
»Frattali »1 »2 »3 »4 »5 »6 »7
Il frattale di Julia (2)
JL5 implementa in AutoLISP il metodo di scansione del contorno* per disegnare l'insieme di Julia di z²+c.
Questo metodo disegna Julia, al contrario di JL1, JL2 e JL3 che disegnano solo l'interno o l'esterno dell'insieme e di JL4 che ne disegna il fossile.
Il metodo consiste nell'iterare 20 volte ogni punto (x,y) di una griglia di punti nel piano: se l'orbita del punto non fugge all'infinito allora si deve iterare 20 volte i 4 punti (x+n,y),(x-n,y),(x,y+n),(x,y-n) che circondano (x,y) e se almeno una di queste orbite fugge all'infinito allora si disegna il punto (M,N) della griglia.
Impostando la griglia a 1000 e n=0.01 ho cercato un equilibrio tra il tempo (lungo) di esecuzione e la bellezza (precisione) del frattale.
;|
JL5 (C)2004 by Claudio Piccini
16 Aprile 2004
www.cg-cad.com
Disegna il frattale di Julia con il
metodo di scansione del contorno
|;
(defun iterOrb ( xM yN / x1 y1 z )
(setq j 0)
(while (< j 20)
(setq j (1+ j))
(setq x1 (+ (- (* xM xM)(* yN yN)) cx))
(setq y1 (+ (* 2 xM yN) cy))
(setq xM x1)
(setq yN y1)
(setq z (+ (* xM xM)(* yN yN)))
(if (> z 4)(setq j 99))
)
)
(defun julia ( itera /
i z M N
xM yN x0 y0 x y x1 y1
test
)
(setq M 0)
(while (<= M itera)
(setq x0 (+ -2 (/ M K)))
(setq N 0)
(while (<= N (/ itera 2))
(setq y0 (- 2 (/ N K)))
(setq x x0)
(setq y y0)
(setq i 0)
(while
(progn
(setq i (1+ i))
(setq x1 (+ (- (* x x)(* y y)) cx))
(setq y1 (+ (* 2 x y) cy))
(setq x x1)
(setq y y1)
(setq z (+ (* x x)(* y y)))
(if (> z 4) nil T)
(if (< i 20) T nil)
)
)
(setq test 0)
(if (< z 4)
(progn
(setq xM (+ x0 0.01))
(setq yN y0)
(if (= (iterOrb xM yN) 99)
(setq test 1)
(progn
(setq xM (- x0 0.01))
(setq yN y0)
(if (= (iterOrb xM yN) 99)
(setq test 1)
(progn
(setq xM x0)
(setq yN (+ y0 0.01))
(if (= (iterOrb xM yN) 99)
(setq test 1)
(progn
(setq xM x0)
(setq yN (- y0 0.01))
(if (= (iterOrb xM yN) 99)
(setq test 1)
)
)
)
)
)
)
)
)
)
(if (= test 1)
(progn
(command "_point" (list M N))
(command "_point" (list (- itera M)(- itera N)))
)
)
(setq N (1+ N))
)
(setq M (1+ M))
)
)
(defun c:jl5 ( / snapp cx cy K griglia )
(setvar "cmdecho" 0)
(setq snapp (getvar "osmode"))
(command "_osnap" "_non")
(initget 1) ;non nil
(setq cx (getreal "\nparte reale di c: "))
(initget 1) ;non nil
(setq cy (getreal "\nparte immag. di c: "))
(setq griglia 1000)
(setq K (/ griglia 4.0))
(julia griglia)
(setvar "osmode" snapp)
(command "_redraw")
(setvar "cmdecho" 1)
(princ)
)
;eof
|
Test del lisp
Command: jl5
parte reale di c: -1
parte immag. di c: 0
Command: jl5
parte reale di c: -0.1
parte immag. di c: 0.8
Command: jl5
parte reale di c: -0.8
parte immag. di c: 0.4
Command: jl4
parte reale di c: -0.1
parte immag. di c: 0.8
iterazioni? [15000] invio
* Caos e frattali, R.L. Devaney. Editore Addison-Wesley Masson
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 16 Aprile 2004
|