cg-Cad

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

Le curve di Lissajous (si pronuncia Lisajù) sono una famiglia di curve descritte dalle equazioni parametriche x(t)=A cos(ωxt-φx) e y(t)=B cos(ωyt-φy).

In LISAJU1 sono semplificate in x(e)=sin(ei) e y(e)=sin(e).

Questo è l'algoritmo:

(while (< e j)
 (setq x (sin (* e i)))
 (setq y (sin e))
 (command "_point" (list x y))
 (setq e (+ e (/ 1.0 steps)))
 (setq i (+ i c))
)

LISAJU1

;|
   LISAJU1.LSP
   Copyright (C) 2005 Claudio Piccini.
   All rights reserved
   www.cg-cad.com

   Generatore di figure di Lissajous bidimensionali
|;

(defun lissajous1 (  / i c 
                       x y 
                       e j 
 )
 (setq i 0
       c 0.0025
       j (* 12 pi)
       e 0
 )
 (while (< e j)
  (setq x (sin (* e i)))
  (setq y (sin e))
  (command "_point" (list (+ x (car pStart))(+ y (cadr pStart))))
  (setq e (+ e (/ 1.0 steps))) ; steps
  (setq i (+ i c))
 )
)

(defun c:lisaju1 (/ snapp
                    steps pStart
 )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")
 (initget (+ 2 4)) numero intero>0
 (setq steps (getint "\n steps [100]: "))
 (if (= steps nil)(setq steps 100))
 (setq pStart (getpoint "\n seleziona un punto nel disegno..."))
 (lissajous1)
 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del Lisp

Command: lisaju1
steps [100]: Invio
seleziona un punto nel disegno...

LISAJU1.LSP

Command: lisaju1
steps [100]: 998
seleziona un punto nel disegno...

LISAJU1.LSP

Analisi del Lisp

Notare che nell'istruzione che incrementa e ho scritto (setq e (+ e (/ 1.0 steps))) e non (setq e (+ e (/ 1 steps))) questo perché si deve forzare il numero intero (o la variabile) come reale per non ottenere come risultato 0. Esempio:
Command: (setq x 12)
12
Command: (setq y (/ 1 x))
0
Quindi si deve forzare in questo modo:
Command: (setq y (/ 1.0 x))
0.0833333
Test con una variante minima:

 (while (< i j)
  (setq x (sin (* e i)))
  (setq y (sin e))
  (command "_point" 
   (list (+ x (car pStart))(+ y (cadr pStart)))
  )
  (setq e (+ e (/ 1.0 steps))) ; steps
  (setq i (+ i c))
 )

Command: lisaju1
steps [100]: 50
seleziona un punto nel disegno...

LISAJU1.LSP (variante)

Nella seconda parte del tutorial mostrerò come sviluppare un Lisp per disegnare nello spazio le figure di Lissajous (con entità punti, linee e sfere) compreso il riquadro di dialogo (file DCL) per l'input dei dati.

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 7 Maggio 2005