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:
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:
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:
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:
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:
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:
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 22 Aprile 2005
|