Lisp »Tips 'n Tricks
»Funzioni ricorsive in AutoLISP »1 | 2 | 3 | 4 | 5 | 6 | 7
CLD
Un lisp che disegna un nuvolo, formato da n sfere colorate in varie tonalità di blu (le gocce d'acqua). Il Lisp è una libera interpretazione di un algoritmo frattale descritto nel sito Webfract.it.
[1] Nuvolo disegnato con 6 giri.
[2] Particolare del Nuvolo: gocce d'acqua.
;;;
;;; cld.lsp - 14 Febbraio 2004
;;; (C) 2004 by Claudio Piccini.
;;; www.cg-cad.com
;;;
;;; Disegna un nuvolo
;;;
(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 ()
(setvar "cmdecho" 1)
(setvar "osmode" snapp)
(setvar "snapmode" snm)
(setvar "orthomode" orto)
(setvar "clayer" piano)
(setvar "cecolor" "BYLAYER")
(setq *error* olderr)
(princ)
)
;|
Random number generator, from 0.000 to 0.999
Grass.lsp (C)1994 by Watson Kilbourne
http://www.cg-cad.com/ttlisp17.htm
|;
(defun rn ()
(if (not sd)
(setq sd (getvar "DATE"))
)
(setq md 65536
mx 25173
nc 13849
sd (rem (+ (* mx sd) nc) md)
)
(setq nx (/ sd md))
)
;|
D-----P-----C
| |
| |
Q O N
| |
| |
A-----M-----B
|;
(defun nuvolo (conta xA yA xB yB xC yC xD yD)
(if (> conta 0)
(progn
(setq xM (+ (/ (+ xA xB) 2) (rn)))
(setq yM (+ yA (rn)))
(setq xP (- (/ (+ xD xC) 2) (rn)))
(setq yP (- yD (rn)))
(setq xQ (+ xA (rn)))
(setq yQ (+ (/ (+ yA yD) 2) (rn)))
(setq xN (- xB (rn)))
(setq yN (- (/ (+ yB yC) 2) (rn)))
(setq xO xM)
(setq yO yQ)
(setq p1 (list xO yO (rn)))
(cond ; colori random
((<= (rn) 0.1)(command "_color" 140))
((<= (rn) 0.2)(command "_color" 141))
((<= (rn) 0.3)(command "_color" 142))
((<= (rn) 0.4)(command "_color" 143))
((<= (rn) 0.5)(command "_color" 150))
((<= (rn) 0.6)(command "_color" 151))
((<= (rn) 0.7)(command "_color" 161))
((<= (rn) 0.9)(command "_color" 5))
)
(command "_sphere" p1 0.01)
(nuvolo (- conta 1) xA yA xM yM xO yO xQ yQ)
(nuvolo (- conta 1) xM yM xB yB xN yN xO yO)
(nuvolo (- conta 1) xO yO xN yN xC yC xP yP)
(nuvolo (- conta 1) xQ yQ xO yO xP yP xD yD)
)
)
)
(defun C:CLD (/ olderr orto snapp snm piano)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(initget (+ 2 4))
; tenersi bassi con i giri!
(setq conta (getint "\nNumero di giri [6]: "))
(if (= conta nil)(setq conta 6))
;| disegna il quadrato
D-----------C
| |
| |
| |
| |
A-----------B
|;
(setq xA 0)
(setq yA 0)
(setq xB 0.1)
(setq yB 0)
(setq xC 0.1)
(setq yC 0.1)
(setq xD 0)
(setq yD 0.1)
(command "_osnap" "_non")
(nuvolo conta xA yA xB yB xC yC xD yD)
(command "_zoom" "_all")
(ripVar)
)
;;;eof
|
L'algoritmo frattale viene caotizzato con l'introduzione di numeri casuali (arbitrari) generati dalla funzione (rn).
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 14 Febbraio 2004
|