Lisp »Tips 'n Tricks
»Funzioni ricorsive in AutoLISP »1
| 2
| 3
| 4
| 5
| 6
| 7 a
, b
, c
, d
, e
Il Triangolo di Sierpinski
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.0) - 22 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 30
(defun rn (sd)
(setq m 65521 b 15937 c 33503 sd
(rem (+ (* b sd) c) m)
)
(* (/ sd m) 31)
)
; disegna il Triangolo di Sierpinski
(defun triangolo_sierpinsky (conta p4 / sx pM)
(if (> conta 0)
(progn
(setq sx (rn sd))
(cond
((<= (fix sx) 10)
(setq pM (list ;pM punto medio fra p4 e p1
(/ (+ (car p4)(car p1)) 2)
(/ (+ (cadr p4)(cadr p1)) 2)
)
)
)
((<= (fix sx) 20)
(setq pM (list ;pM punto medio fra p4 e p2
(/ (+ (car p4)(car p2)) 2)
(/ (+ (cadr p4)(cadr p2)) 2)
)
)
)
((<= (fix sx) 30)
(setq pM (list ;pM punto medio fra p4 e p3
(/ (+ (car p4)(car p3)) 2)
(/ (+ (cadr p4)(cadr p3)) 2)
)
)
)
)
(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
|
[1] Il triangolo di Sierpinski ottenuto con 5000 iterazioni.
[2] Particolare.
[3] Esempi.
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 22 Febbraio 2004
|