cg-Cad

Lisp »Tips 'n Tricks »Funzioni ricorsive in AutoLISP »1 | 2 | 3 | 4 | 5 | 6 | 7 a , b , c , d , e

Il Triangolo di Sierpinski tricolore

TSK implementa in autolisp il gioco del caos.
Le regole del gioco sono le seguenti:
1. Disegna 3 cerchi su un foglio di carta in posizioni arbitrarie e un punto A in mezzo ai tre cerchi.
2. Scegli uno dei 3 cerchi a caso (lanciando un dado) e disegna un punto a metà tra il cerchio e l'ultimo punto disegnato A
3. Ripeti il punto 2 fino allo sfinimento...
Alla fine (se le misure sono precise) si ottiene sempre il triangolo di Sierpinski (link esterno a cg-cad).

;;;
;;;    tsk.lsp (Versione 1.1) - 25 Febbraio 2004
;;;    (C) 2004 by Claudio Piccini.
;;;    www.cg-cad.com
;;;    
;;;    Disegna il triangolo di Sierpinski
;;;    da un insieme di punti casuali (rn)
;;;    e con una funzione ricorsiva.
;;;

(defun myerror (s)                  
  (if (/= s "Function cancelled")
    (princ (strcat "\nError: " s))
  )
 (ripVar)
 (princ)
)

(defun salVar ()
 (setq orto (getvar "orthomode"))                          
 (setq snapp (getvar "osmode"))
 (setq snm (getvar "snapmode"))
 (setq piano (getvar "clayer"))
)

(defun ripVar ()
 (command "_redraw")
 (setvar "cmdecho" 1)
 (setvar "osmode" snapp)
 (setvar "snapmode" snm)
 (setvar "orthomode" orto)
 (setvar "clayer" piano)
 (setvar "cecolor" "BYLAYER")
 (setq *error* olderr)
 (princ)
)

; genera numeri casuali da 0 a 29
(defun rn (sd)
 (setq m 65521 b 15937 c 33503 sd 
  (rem (+ (* b sd) c) m)
 )
 (* (/ sd m) 30)
)

; disegna il Triangolo di Sierpinski
(defun triangolo_sierpinsky (conta p4 / sx pM)
 (if (> conta 0)
  (progn
   (setq sx (rn sd))
   (cond 
    ((<= (fix sx) 9)
     (setq pM (list ;pM punto medio fra p4 e p1
                (/ (+ (car  p4)(car  p1)) 2)
                (/ (+ (cadr p4)(cadr p1)) 2)
               )
     ) 
     (command "_color" "_green")
    )
    ((<= (fix sx) 19)
     (setq pM (list ;pM punto medio fra p4 e p2
                (/ (+ (car  p4)(car  p2)) 2)
                (/ (+ (cadr p4)(cadr p2)) 2)
               )
     ) 
     (command "_color" "_white")
    )
    ((<= (fix sx) 29)
     (setq pM (list ;pM punto medio fra p4 e p3
                (/ (+ (car  p4)(car  p3)) 2)
                (/ (+ (cadr p4)(cadr p3)) 2)
               )
     ) 
     (command "_color" "_red")
    )
   )
   (setq sd sx)          ; sd e' il nuovo seme
   (command "_point" pM) ; disegna il punto medio
   (setq p4 pM)          ; p4 e' il punto 'medio'
   (triangolo_sierpinsky (- conta 1) p4)
  )
 )
) 

(defun C:TSK (/ olderr orto snapp snm piano)
 (setq olderr  *error*  *error* myerror)
 (setvar "cmdecho" 0)
 (salVar)
 (setq sd 0.0)
 (command "_osnap" "_non")
 (setq p1 (getpoint "\nClicca 1 vertice del triangolo:"))
 (setq p2 (getpoint "\nClicca 2 vertice del triangolo:"))
 (setq p3 (getpoint "\nClicca 3 vertice del triangolo:"))
 (setq p4 (getpoint "\nClicca un punto in mezzo al triangolo:"))
 (initget (+ 2 4))
 (setq conta (getint "\nNumero delle iterazioni [5000]: "))
 (if (= conta nil)(setq conta 5000))
 (triangolo_sierpinsky conta p4)
 (ripVar)
)
;;;eof

TSK.LSP
Il triangolo di Sierpinski ottenuto con 5000 iterazioni e 3 colori.



Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 27 Febbraio 2004