Lisp »Tips 'n Tricks
»Simmetrie »1 »2 »3 »4 »5 »6 »7
Conchiglie e corni 3D
SHL traduce in AutoLISP un metodo (e il relativo algoritmo) per generare immagini tridimensionali da un'equazione parametrica di una curva qualsiasi nello spazio *, e che consiste nel disegnare la curva per valori discreti del parametro collocando in ciascun punto una sfera.
Nel nostro caso si tratta di tracciare la curva della spirale logaritmica per valori discreti del parametro Θ.
In coordinate polari l'equazione della spirale logaritmica è ρ=kevΘ, k e v sono costanti arbitrarie. Ogni punto (centro di ogni singola sfera) è dato dalle due equazioni parametriche nel piano x=ρsin(Θ), y=ρcos(Θ), e da z=βρ (β è una costante arbitraria). Il raggio r della sfera è una variabile che dipende da ρ grazie ad una costante γ: (setq r (/ rho gamma)).
Il lisp chiede i valori di k, v, β e γ; premendo sempre il tasto Invio SHL disegna una conchiglia con i valori preimpostati. Variando tali valori il lisp genera conchiglie e corni dalle forme più o meno strane, più o meno belle.
;;;
;;; SHL.lsp - 18 Aprile 2004
;;; (C) 2004 by Claudio Piccini.
;;; www.cg-cad.com
;;;
;;; Genera conchiglie e corni 3D
;;; Da una idea di C.A. Pickover (1989)
;;; Basato su shell.c (C)1994 by C. Giustozzi
;;; MCmicrocomputer 139 (aprile 1994)
;;;
(defun shell (i / rho x y z r)
(if (< i steps)
(progn
(setq theta
(* (* 12.0 pi)
(/ (+ (- i s) 1.5)(- s 1.0))
)
)
(setq rho (* k (exp (* v theta))))
(setq x (* rho (sin theta)))
(setq y (* rho (cos theta)))
(setq z (* rho beta))
(setq centro (list x y z))
(setq r (/ rho gamma))
(command "_sphere" centro r)
(shell (+ i 1))
)
)
)
(defun c:shl ( / beta gamma v k steps s )
(setvar "cmdecho" 0)
(setq snapp (getvar "osmode"))
(command "_osnap" "_non")
(setq steps 200) ; numero di sfere
(setq s (* steps 1.0))
; beta circa 2.0
(setq beta (getreal "\nBeta? [-2.0] "))
(if (= beta nil)(setq beta -2.0))
; gamma da 0.01 a 3
(setq gamma (getreal "\nGamma? [0.9] "))
(if (= gamma nil)(setq gamma 0.9))
; v costante esponenziale
(setq v (getreal "\nV? [0.15] "))
(if (= v nil)(setq v 0.15))
; k costante esponenziale
(setq k (getreal "\nK? [1.0] "))
(if (= k nil)(setq k 1.0))
(shell 0)
(setvar "osmode" snapp)
(command "_redraw")
(setvar "cmdecho" 1)
(princ)
)
;;;eof
|
Test del lisp
Command: shl
Beta? [-2.0] Invio
Gamma? [0.9] Invio
V? [0.15] Invio
K? [1.0] Invio
Command: shl
Beta? [-2.0] Invio
Gamma? [0.9] 2.6
V? [0.15] Invio
K? [1.0] Invio
Per approfondire:
C. Giustozzi. Conchiglie, corni, computer, in MCmicrocomputer n.139 - aprile 1994
C.A. Pickover. Page on Creativity and the Mind, Computer Art, and More
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 18 Aprile 2004
|