|
Lisp »Tips 'n Tricks
»Algoritmo dell'attrattore strano
L'algoritmo è il seguente:
x = valore;
y = valore;
z = valore;
for i := 0 to steps
xx = formula1;
yy = formula2;
zz = formula3;
Point(x,y); // 2D
Point(x,y,z); // 3D
Line(x,y;xx,yy) // 2D
Line(x,y,z;xx,yy,zz) // 3D
x = xx;
y = yy;
z = zz;
end;
|
I vari tipi di output (2/3D, linee/punti) sono evidenziati con colori diversi.
Come esempi di implementazione in AutoLISP ecco due lisp già presenti nel tutorial n.43 (Autolisp Tips & Tricks II), ma questa volta pensati in LISP per l'ambiente CAD.
SAG2
;|
SAG2.LSP (versione 2) (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 ( / a b c d e
p0 steps
x y z xx yy
)
(setq x 0 y 0 z 0)
(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))
(initget 4) ; numero positivo
(setq steps (getint "\n numero di iterazioni [10000]: "))
(if (= steps nil)(setq steps 10000))
(if (/= steps 0)
(setq p0 (getpoint "\n clicca un punto nel disegno:"))
)
(repeat steps
(setq xx (- (sin (* a y))(* z (cos (* b x)))))
(setq yy (- (* z (sin (* c x)))(cos (* d y))))
(setq zz (* e (sin x)))
(command "_point"
(list
(+ xx (car p0))
(+ yy (cadr p0))
zz
)
)
(setq x xx
y yy
z zz
)
)
)
(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
|
HNN
;|
HNN.LSP (versione 2) (C) 2005 by Claudio Piccini.
www.cg-cad.com
Disegna l'attrattore strano di Henon
x=y+1-a*x^2
y=b*x
|;
(defun henon ( nc / x1 )
(if (> nc 0)
(progn
(setq x1 x)
(setq x (- (+ y 1)(* a x1 x1)))
(setq y (* b x1))
(command "_point"
(list
(+ x (car p0)) ; coord. x
(+ y (cadr p0)) ; coord. y
)
)
(setq nc (henon (1- nc)))
)
)
)
(defun c:hnn ( / snapp
steps p0
a b x y
)
(setvar "cmdecho" 0)
(setq snapp (getvar "osmode"))
(command "_osnap" "_non")
(setq x 0 y 0)
(initget 4) ; numero positivo
(setq steps (getint "\n numero di iterazioni [max 10000]: "))
(if (= steps nil)(setq steps 10000))
(if (AND (/= steps 0)(<= steps 10000))
(progn
(setq a (getreal "\n a? [1.4] "))
(if (= a nil)(setq a 1.4))
(setq b (getreal "\n b? [0.3] "))
(if (= b nil)(setq b 0.3))
(setq p0 (getpoint "\n clicca un punto:"))
(henon steps)
)
)
(setvar "osmode" snapp)
(command "_redraw")
(setvar "cmdecho" 1)
(princ)
)
;;;eof
|
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 3 Maggio 2005
|
|