cg-Cad

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

TRAP2 v.1

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.

TRAP2 v.1

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 9 Aprile 2005