|
Lisp »Tips 'n Tricks
»Lisp & Lissajous »1 »2 »3 »4 »5 »6 »7
LISAJU3
LISAJU3 traduce in AutoLISP un metodo (e il relativo algoritmo) per generare immagini tridimensionali da equazioni parametriche periodiche, in particolare le curve di Lissajous *, e che consiste nel disegnare la curva per valori discreti del parametro collocando in ciascun punto una sfera.
Le equazioni parametriche implementate nel Lisp sono:
x=ρ*sin(θ*t)*cos(φ*t)
y=ρ*sin(θ*t)*sin(φ*t)
z=ρ*cos(θ*t).
Salvare LISP e DCL nella cartella pick/lisp oppure sostituire la stringa in rosso nel listato con un percorso a piacere.
LISAJU3.DCL
/*
LISAJU3.DCL
Copyright (C) 2005 Claudio Piccini.
All rights reserved
www.cg-cad.com
*/
dcl_settings : default_dcl_settings { audit_level = 1; }
lisaju3 : dialog {
label = "Lissajous 3D";
: boxed_radio_row {
label = "Tipo di Output";
: radio_button {
label = "Punti";
key = "o1";
value= "1";
}
: radio_button {
label = "Linee";
key = "o2";
}
: radio_button {
label = "Sfere";
key = "o3";
}
}
: row {
: column {
: boxed_column {
: row {
: edit_box {
label = "Raggio della sfera";
key = "rho";
mnemonic = "h";
edit_width = 4;
}
}
: row {
: edit_box {
label = "Angolo theta";
key = "theta";
mnemonic = "t";
edit_width = 4;
}
}
: row {
: edit_box {
label = "Angolo phi";
key = "phi";
mnemonic = "p";
edit_width = 4;
}
}
: row {
: edit_box {
label = "Raggio sfere";
key = "raggio";
mnemonic = "r";
edit_width = 4;
}
}
: row {
: edit_box {
label = "num. sfere/punti";
key = "steps";
mnemonic = "s";
edit_width = 4;
}
}
}
}
}
: row {
: spacer {
width = 1;
}
: button {
label = "OK";
is_default = true;
key = "accept";
width = 8;
fixed_width = true;
}
: button {
label = "Cancel";
is_cancel = true;
key = "cancel";
width = 8;
fixed_width = true;
}
: spacer {
width = 1;
}
}
}
//eof
|
LISAJU3.LSP
;|
LISAJU3.LSP (C) 2005 Claudio Piccini.
All rights reserved
www.cg-cad.com
Generatore di figure di Lissajous 3D
Basato su :
C. Giustozzi, Sculture tridimensionali virtuali
in MCmicrocomputer n.163 - Giugno 1996
Input :
rho numero reale (raggio della sfera)
theta numero reale (angolo di fase)
phi numero reale (angolo di fase)
raggio numero reale (raggio sfere)
steps numero intero (numero punti,sfere)
Output :
punti, linee, sfere.
|;
(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 ()
(command "_redraw")
(setvar "cmdecho" 1)
(setvar "osmode" snapp)
(setvar "snapmode" snm)
(setvar "orthomode" orto)
(setvar "clayer" piano)
(setq *error* olderr)
(princ)
)
(defun ripGlo ()
(setq #05v1 rho) ; parametro reale rho (raggio della sfera)
(setq #05v2 theta) ; parametro reale theta (angolo di fase)
(setq #05v3 phi) ; parametro reale phi (angolo di fase)
(setq #05v4 raggio) ; parametro reale raggio (raggio sfere)
(setq #05v5 steps) ; parametro intero steps (numero punti/sfere)
)
(defun defaults ()
(setq rho #05v1) ; parametro rho
(setq theta #05v2) ; parametro theta
(setq phi #05v3) ; parametro phi
(setq raggio #05v4) ; parametro raggio sfere
(setq steps #05v5) ; parametro steps
(set_tile "rho" (rtos 0.00 2))
(set_tile "theta" (rtos 0.00 2))
(set_tile "phi" (rtos 0.00 2))
(set_tile "raggio" (rtos 0.00 2))
(set_tile "steps" (rtos 0 2))
(setq #05v1 (rtos #05v1 2 2))
(setq #05v2 (rtos #05v2 2 2))
(setq #05v3 (rtos #05v3 2 2))
(setq #05v4 (rtos #05v4 2 2))
(setq #05v5 (rtos #05v5 2 0))
(set_tile "rho" #05v1)
(set_tile "theta" #05v2)
(set_tile "phi" #05v3)
(set_tile "raggio" #05v4)
(set_tile "steps" #05v5)
(setq outp 1) ; tipo di output (punti,linee,sfere)
(cond
((= outp 1)(set_tile "o1" "1")) ; punti
((= outp 2)(set_tile "o2" "1")) ; linee
((= outp 3)(set_tile "o3" "1")) ; sfere
)
)
(defun do_Rho ()
(setq rho (atof (get_tile "rho")))
)
(defun do_Theta ()
(setq theta (atof (get_tile "theta")))
)
(defun do_Phi ()
(setq phi (atof (get_tile "phi")))
)
(defun do_R ()
(setq raggio (atof (get_tile "raggio")))
)
(defun do_Steps ()
(setq steps (atoi (get_tile "steps")))
)
(defun lissajous3 ( x y z i / e xx yy zz )
(if (< i steps)
(progn
(setq e (/ (* 4 pi i) steps))
(setq xx (* rho (sin (* theta e))(cos (* phi e))))
(setq yy (* rho (sin (* theta e))(sin (* phi e))))
(setq zz (* rho (cos (* theta e))))
(cond
((= outp 1)
(command "_point"
(list (+ xx (car pStart))(+ yy (cadr pStart)) zz)
)
)
((= outp 2)
(if (> i 0)
(command "_line"
(list (+ x (car pStart))(+ y (cadr pStart)) z)
(list (+ xx (car pStart))(+ yy (cadr pStart)) zz)
""
)
(command "_point"
(list (+ xx (car pStart))(+ yy (cadr pStart)) zz)
)
)
(setq x xx)
(setq y yy)
(setq z zz)
)
((= outp 3)
(command "_sphere"
(list (+ xx (car pStart))(+ yy (cadr pStart)) zz)
raggio
)
)
)
(lissajous3 x y z (+ i 1))
)
)
)
(defun c:lisaju3 (/ olderr snapp snm orto piano
dcl_id ok_c
outp
rho theta phi raggio steps
pStart
)
(setq olderr *error* *error* myerror)
(setvar "cmdecho" 0)
(salVar)
(command "_osnap" "_non")
;
; Variabili globali:
; #05v1 #05v2 #05v3 #05v4 #05v5
;
(if (= #05v1 nil)(setq #05v1 1.0)) ; rho (raggio sfera)
(if (= #05v2 nil)(setq #05v2 2.0)) ; angolo theta
(if (= #05v3 nil)(setq #05v3 1.0)) ; angolo phi
(if (= #05v4 nil)(setq #05v4 0.1)) ; raggio delle sfere
(if (= #05v5 nil)(setq #05v5 200)) ; numero di sfere
(setq ok_c 1)
(if (< (setq dcl_id (load_dialog "c:/pick/lisp/lisaju3.dcl")) 0)(exit))
(if (not (new_dialog "lisaju3" dcl_id))(exit))
(defaults)
(action_tile "o1" "(setq outp 1)") ; punti
(action_tile "o2" "(setq outp 2)") ; linee
(action_tile "o3" "(setq outp 3)") ; sfere
(action_tile "rho" "(do_Rho)")
(action_tile "theta" "(do_Theta)")
(action_tile "phi" "(do_Phi)")
(action_tile "raggio" "(do_R)")
(action_tile "steps" "(do_Steps)")
(action_tile "accept" "(done_dialog)")
(action_tile "cancel" "(setq ok_c 0)")
(start_dialog)
(unload_dialog dcl_id)
(if (= 1 ok_c)
(progn
(ripGlo)
(setq pStart (getpoint "\n seleziona un punto nel disegno..."))
(lissajous3 0 0 0 0)
(ripVar)
)
(progn
; valori globali di default
(setq #05v1 1.0) ; rho
(setq #05v2 2.0) ; theta
(setq #05v3 1.0) ; phi
(setq #05v4 0.1) ; raggio sfere
(setq #05v5 200) ; steps
(ripVar)
)
)
)
;;;eof
|
Test del lisp
Per approfondire:
C. Giustozzi. Sculture tridimensionali virtuali, in MCmicrocomputer n.163 - Giugno 1996
C.A. Pickover. Page on Creativity and the Mind, Computer Art, and More
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 10 Maggio 2005
|
|