cg-Cad

Lisp »Tips 'n Tricks »Frattali »1 »2 »3 »4 »5 »6 »7

Attrattori strani 3D

SAG è un lisp per disegnare un attrattore strano 3D (nel piano).

;|

   SAG.LSP (C) 2005 by Claudio Piccini.
   www.cg-cad.com

   Traduzione in autolisp dell'algoritmo 'Strange Attractor Generator'
   in 'Computers, Pattern, Chaos and Beauty' di C.A. Pickover
   2001, Dover Publications, Inc.

   Pseudocode 10.4:
   xxmin=-2;xxmax=2;yymin=-2;yymax=2;
   xinc=pres/(xxmax-xxmin);
   yinc=pres/(yymax-yymin);
   a=2.24;b=.43;c=-.65;d=-2.43;e=1;
   p(*,*)=0;
   x,y,z=0;
   do j = 1 to iter1;
    do i = 1 to iter2;
     xx=sin(a*y)-z*cos(b*x);
     yy=z*sin(c*x)-cos(d*y);
     zz=e*sin(x);
     x=xx;y=yy;z=zz;
     if xx<xxmax & xx>xxmin & yy<yymax & yy>yymin then do;
      xxx=(xx-xxmin)*xinc;
      yyy=(yy-yymin)*yinc;
      p(xxx,yyy)=p(xxx,yyy)+1;
     end;
    end;
   end;

|;

(defun StrangeAttractorGenerator ( / xxmin xxmax yymin yymax
                                     pres iter1 iter2
                                     xinc yinc
                                     a b c d e
                                     x y z xx yy xxx yyy
                                     i j p0 pnt

 )

 (setq xxmin   -2
       xxmax    2
       yymin   -2
       yymax    2
       pres  1600
       iter1  100
       iter2  500
       x        0
       y        0
       z        0 
 )

 (setq xinc (/ pres (- xxmax xxmin)))
 (setq yinc (/ pres (- yymax yymin)))

 (setq a (getreal "\n a? [2.24] "))
 (if (= a nil)(setq a 2.24))

 (setq b (getreal "\n b? [0.43] "))
 (if (= b nil)(setq b 0.43))

 (setq c (getreal "\n c? [-0.65] "))
 (if (= c nil)(setq c -0.65))

 (setq d (getreal "\n d? [-2.43] "))
 (if (= d nil)(setq d -2.43))

 (setq e (getreal "\n e? [1] "))
 (if (= e nil)(setq e 1))

 (setq p0 (getpoint "\n clicca un punto nel disegno:"))

 (setq j 1)
 (while (<= j iter1)
  (setq i 1)
  (while (<= i iter2)
   (setq xx (- (sin (* a y))(* z (cos (* b x)))))
   (setq yy (- (* z (sin (* c x)))(cos (* d y))))
   (setq zz (* e (sin x)))
   (setq x xx)
   (setq y yy)
   (setq z zz)
   (if (and 
        (and (< xx xxmax)(> xx xxmin))
        (and (< yy yymax)(> yy yymin))
       )
       (progn
        (setq xxx (* (- xx xxmin) xinc))
        (setq yyy (* (- yy yymin) yinc))
        (setq pnt (list xxx yyy))
        (setq pnt (list (+ (car pnt)(car p0))(+ (cadr pnt)(cadr p0))))
        (command "_point" pnt)
       )
       (setq i iter2)
   )
   (setq i (1+ i))
  )
  (setq j (1+ j))
 )
)

(defun c:sag ( / snapp )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")
 (StrangeAttractorGenerator)
 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del lisp

Command: sag
a? [2.24] Invio
b? [0.43] Invio
c? [-0.65] Invio
d? [-2.43] Invio
e? [1] Invio
clicca un punto nel disegno:

SAG.lsp

Command: sag
a? [2.24] 2
b? [0.43] 0
c? [-0.65] 1
d? [-2.43] 2
e? [1] -1
clicca un punto nel disegno:

SAG.lsp

Command: sag
a? [2.24] 3
b? [0.43] 0
c? [-0.65] 0
d? [-2.43] Invio
e? [1] Invio
clicca un punto nel disegno:

SAG.lsp

SAG2

SAG2 è un lisp per disegnare un attrattore strano 3D nello spazio.

;|

   SAG2.LSP (C) 2005 by Claudio Piccini.
   www.cg-cad.com

   Traduzione in autolisp dell'algoritmo 'Strange Attractor Generator'
   in 'Computers, Pattern, Chaos and Beauty' di C.A. Pickover
   2001, Dover Publications, Inc.
   (Pseudocode 10.4)

|;

(defun StrangeAttractorGenerator2 ( / xxmin xxmax yymin yymax
                                      pres iter1 iter2
                                      xinc yinc zinc
                                      a b c d e
                                      x y z xx yy xxx yyy zzz
                                      i j p0 pnt

 )

 (setq xxmin   -2
       xxmax    2
       yymin   -2
       yymax    2
       pres  1600
       iter1  100
       iter2  500
       x        0
       y        0
       z        0 
 )

 (setq xinc (/ pres (- xxmax xxmin)))
 (setq yinc (/ pres (- yymax yymin)))
 (setq zinc (/ pres (- yymax yymin)))

 (setq a (getreal "\n a? [2.24] "))
 (if (= a nil)(setq a 2.24))

 (setq b (getreal "\n b? [0.43] "))
 (if (= b nil)(setq b 0.43))

 (setq c (getreal "\n c? [-0.65] "))
 (if (= c nil)(setq c -0.65))

 (setq d (getreal "\n d? [-2.43] "))
 (if (= d nil)(setq d -2.43))

 (setq e (getreal "\n e? [1] "))
 (if (= e nil)(setq e 1))

 (setq p0 (getpoint "\n clicca un punto nel disegno:"))

 (setq j 1)
 (while (<= j iter1)
  (setq i 1)
  (while (<= i iter2)
   (setq xx (- (sin (* a y))(* z (cos (* b x)))))
   (setq yy (- (* z (sin (* c x)))(cos (* d y))))
   (setq zz (* e (sin x)))
   (setq x xx)
   (setq y yy)
   (setq z zz)
   (if 
    (and 
     (and (< xx xxmax)(> xx xxmin))
     (and (< yy yymax)(> yy yymin))
    )
    (progn
     (setq xxx (* (- xx xxmin) xinc))
     (setq yyy (* (- yy yymin) yinc))
     (setq zzz (* (- zz yymin) zinc))
     (setq pnt (list xxx yyy zzz))
     (command "_point" 
      (list 
       (+ (car pnt)(car p0))
       (+ (cadr pnt)(cadr p0))
       (caddr pnt)
      )
     )
    )
    (setq i iter2)
   )
   (setq i (1+ i))
  )
  (setq j (1+ j))
 )
)

(defun c:sag2 ( / snapp )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")
 (StrangeAttractorGenerator2)
 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del lisp SAG2 (con = input test SAG)

Command: sag2
a? [2.24] Invio
b? [0.43] Invio
c? [-0.65] Invio
d? [-2.43] Invio
e? [1] Invio
clicca un punto nel disegno:

SAG2.lsp

Command: sag2
a? [2.24] 2
b? [0.43] 0
c? [-0.65] 1
d? [-2.43] 2
e? [1] -1
clicca un punto nel disegno:

SAG2.lsp

Command: sag2
a? [2.24] 3
b? [0.43] 0
c? [-0.65] 0
d? [-2.43] Invio
e? [1] Invio
clicca un punto nel disegno:

SAG2.lsp

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 22 Aprile 2005