cg-Cad

Lisp »Tips 'n Tricks »Funzioni ricorsive in AutoLISP »1 | 2 | 3 | 4 | 5 | 6 | 7

RULER

Questo è un esempio di programma con due chiamate ricorsive, e disegna le linee presenti su un righello. L'algoritmo (implementato in C) è il seguente:

rule(int l, int r, int h)
{
   int m = (l+r)/2;
   if (h>0)
   {
      mark(m,h);
      rule(l,m,h-1);
      rule(m,r,h-1);   
   }
}

Da: "Algoritmi in C++", R. Sedgewick Ed. Addison-Wesley

La funzione mark(m,h) disegna una linea lunga h unità in posizione m.
"L'idea alla base di questo metodo è la seguente: per tracciare i segni in un intervallo innanzitutto bisogna tracciare il segno più lungo che sta nel mezzo. Questa operazione divide l'intervallo in due parti uguali.
I segni corti in ciascuna delle due metà sono tracciati riapplicando ad esse la stessa procedura.
Conviene prestare particolare attenzione alla condizione di terminazione di un programma ricorsivo, onde evitare che questo continui all'infinito la propria esecuzione. Nel programma in esempio rule termina quando la lunghezza della linea da tracciare h è 0." (Op. cit.)

;;;
;;;    ruler.lsp  - 11 Febbraio 2004
;;;    (C) by Claudio Piccini
;;;    http://www.cg-cad.com/
;;;
;;;    Disegna le linee presenti su un righello
;;;

; converte angolo da gradi in radianti
(defun g2r (a)
 (* pi (/ a 180.0))
)

(defun mark (m h)
 (setq p3 (list (+ (car p1) m) (cadr p1)))
 (setq p4 (polar p3 (g2r 90) h))
 (command "_line" p3 p4 "")
)

(defun rule (l r h)
 (setq m (/ (+ l r) 2))
 (if (> h 0)
  (progn
   (mark m h)
   (rule l m (- h 1))
   (rule m (+ r 1)(- h 1))
  )
 )
)

(defun ruler (l r h)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")
 (setq p1 (getpoint "\nclicca un punto nel disegno:"))
 (rule l r h)
 (setvar "osmode" snapp)
 (command "_redraw")
)
;;;eof

Si deve caricare il lisp, scegliendo in modo opportuno r e h; ad esempio (ruler 0 8 3) disegna questo righello:

ruler.lsp

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 11 Febbraio 2004