cg-Cad

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

LISAJU3.LSP LISAJU3.LSP + render

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