|
Lisp »Tips 'n Tricks
»Simmetrie »1 »2 »3 »4 »5 »6 »7
TRAP2 variante n.1
Questa variante del lisp trap2 genera una tassellatura di punti colorati in modo casuale.
;|
TRAP2.LSP variante n.1
(C) 2005 by Claudio Piccini.
www.cg-cad.com
Lisp per disegnare tassellature
Traduzione in autolisp dell'algoritmo 'Egg Tile Generator'
in 'Computers, Pattern, Chaos and Beauty' di C.A. Pickover
2001, Dover Publications, Inc.
(* PseudoCode 13.1 *)
do i = 1 to res; (* loop in x direction *)
do j = 1 to res; (* loop in y direction *)
x = beta1+(gamma*i); (* compute x *)
y = beta2+(gamma*j); (* compute y *)
z = alpha*(sin(x)+sin(y)) (* compute z *)
c = trunc(z); (* convert z to an integer *)
if mod(c,modf) = 0 (* if c evenly divisible by modf *)
then PlotDot(i,j); (* plot a point at position (i,j) *)
end; (* end j loop *)
end; (* end i loop *)
|;
;|
Genera un numero casuale compreso tra 0 e 6
Vedi il tutorial n.37 "Numeri casuali"
in AutoLISP Tips & Tricks Volume I
|;
(defun rn (sd)
(setq m 65521 b 15937 c 33503 sd
(rem (+ (* b sd) c) m)
)
(setq sd (* (/ sd m) 7))
)
(defun c:trap2 ( / snapp
dim beta1 beta2 gamma alpha
i j x y z
sd sx
)
(setvar "cmdecho" 0)
(setq snapp (getvar "osmode"))
(command "_osnap" "_non")
(setq sd 0.0)
(initget (+ 2 4)) ; non 0, non negativo
(setq dim (getreal "\nDim? [100] "))
(if (= dim nil)(setq dim 100))
; beta1
(setq beta1 (getint "\nBeta1? [-11] "))
(if (= beta1 nil)(setq beta1 -11))
; beta2
(setq beta2 (getint "\nBeta2? [-12] "))
(if (= beta2 nil)(setq beta2 -12))
; gamma
(setq gamma (getint "\nGamma? [60] "))
(if (= gamma nil)(setq gamma 60))
; Alpha
(setq alpha (getint "\nAlpha? [10] "))
(if (= alpha nil)(setq alpha 10))
(setq i 1)
(while (<= i dim)
(setq j 1)
(while (<= j dim)
(setq x (+ beta1 (* gamma i)))
(setq y (+ beta2 (* gamma j)))
(setq z (* alpha (+ (sin x)(sin y))))
(if (= (rem (fix z) 3) 0)
(progn
(setq sx (rn sd))
(setq sd sx)
(command "_color" (1+ (fix sx)))
(command "_point" (list i j))
)
)
(setq j (1+ j))
)
(setq i (1+ i))
)
(setvar "osmode" snapp)
(command "_redraw")
(setvar "cecolor" "BYLAYER")
(setvar "cmdecho" 1)
(princ)
)
;;;eof
|
Test del lisp
Command: trap2
Dim? [100] Invio
Beta1? [-11] 10
Beta2? [-12] 3
Gamma? [60] 25
Alpha? [10] Invio
Analisi del lisp
(command "_color" (1+ (fix sx)))
Un numero casuale è un numero estratto da un insieme di valori equiprobabili.
Un programma può generare solo numeri pseudo-casuali. Scritto il programma, tutti i numeri da esso prodotti possono essere dedotti, leggendo il codice (o conoscendo l'algoritmo) e quindi non sono veramente casuali.
La funzione (rn) applica il metodo x<-(a * x[i-1] + c) mod m per generare numeri casuali.
(defun rn (x)
(setq m 65521
a 15937
c 33503
)
(setq x
(rem (+ (* a x) c) m)
)
(setq x
(* (/ x m) num)
)
)
Dove mod è l'operatore modulo che fornisce il resto della divisione (rem in Lisp), a c m sono numeri interi costanti e x è il "seme" (seed) della sequenza; cioè preso un numero intero arbitrario x lo si moltiplica per a (a*x), gli si aggiunge c (a*x+c) e si salva in x <- il resto della divisione per m (a*x+c) mod m.
Ripetendo i volte il procedimento x<-(a*x[i-1]+c) mod m otteniamo un insieme di numeri compresi tra 0 e num-1.
Nel sorgente num=7 quindi il lisp genera un numero casuale compreso tra 0 e 6, ma dato che 0 non è un colore valido in AutoCAD uso la funzione 1+ per incrementare di 1 il numero intero generato dalla funzione fix; quindi i colori effettivi sono 1,2,3,4,5,6 e 7.
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 9 Aprile 2005
|
|