cg-Cad

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

JL5.lsp

Command: jl5
parte reale di c: -0.1
parte immag. di c: 0.8

JL5.lsp

Command: jl5
parte reale di c: -0.8
parte immag. di c: 0.4

JL5.lsp

Command: jl4
parte reale di c: -0.1
parte immag. di c: 0.8
iterazioni? [15000] invio

JL4.lsp

* Caos e frattali, R.L. Devaney. Editore Addison-Wesley Masson

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 16 Aprile 2004