cg-Cad

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