cg-Cad

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.

CLD.LSP
[1] Nuvolo disegnato con 6 giri.



CLD.LSP
[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