cg-Cad

Lisp »Tips 'n Tricks »Simmetrie »1 »2 »3 »4 »5 »6 »7

TRAP2

;|

   TRAP2.LSP
   (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                     *)

|;

(defun c:trap2 ( / snapp 
                   dim beta1 beta2 gamma alpha
                   i j x y z c 
 )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")

 (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))))
   (setq c (fix z))
   (if (= (rem c 3) 0)
    (command "_point" (list i j))
   )
   (setq j (1+ j))
  )
  (setq i (1+ i))
 )

 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del lisp

Command: trap2
Dim? [100] Invio
Beta1? [-11] Invio
Beta2? [-12] Invio
Gamma? [60] Invio
Alpha? [10] Invio

TRAP2.LSP

Command: trap2
Dim? [100] Invio
Beta1? [-11] -16
Beta2? [-12] -21
Gamma? [60] 200
Alpha? [10] 4

TRAP2.LSP

Command: trap2
Dim? [100] Invio
Beta1? [-11] 10
Beta2? [-12] 3
Gamma? [60] 25
Alpha? [10] Invio

TRAP2.LSP

Command: trap2
Dim? [100] Invio
Beta1? [-11] Invio
Beta2? [-12] 10
Gamma? [60] 50
Alpha? [10] Invio

TRAP2.LSP

Analisi del lisp

(setq c (fix z))
Questi esempi di tassellature sono ottenuti dalla sviluppo della formula z = alpha*(sin(x)+sin(y)), con z ridotto a numero intero non arrotondato.
La funzione in autolisp per convertire un numero reale in un numero intero è (fix n).
Fix restituisce un valore intero dal numero reale n troncando la parte decimale, ad esempio: (fix 3.5) ->3

Invece per arrotondare un numero reale si usano insieme due funzioni di autolisp: rtos e atoi.
(rtos numero modo accuratezza) restituisce una stringa dalla conversione di un numero, modo e accuratezza sono argomenti opzionali e servono per controllare il formato della stringa.
I modi sono 1=scientifico, 2=decimale, 3=ing., 4=arch., 5=frazionario. Esempi:
(rtos 2.123456 2 6)
"2.123456"
(rtos 2.123456 2 3)
"2.123"
(rtos 2.123456 2 0)
"2"
(atoi stringa) restituisce un numero intero dalla conversione di una stringa, la parte decimale viene scartata. Ad esempio (atoi "2.999") ->2.
Quindi per arrotondare un numero reale si scrive (atoi (rtos numero 2 0)). Esempi:
(atoi (rtos 0.89 2 0))
1
(atoi (rtos 0.45 2 0))
0
cioè (atoi (rtos 2.51 2 0)) è 3, mentre (fix 2.51) è 2.

(if (= (rem c 3) 0)(command "_point" (list i j)))
Se il resto è 0 allora il lisp disegna un punto.
In Autolisp la funzione da usare in questo caso è (rem n1 n2 n3 ...) che restituisce il resto della divisione tra il primo numero n1 ed il prodotto dei numeri rimanenti.

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 8 Aprile 2005