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:
Lisp »Tips 'n Tricks
Ultimo Aggiornamento_Last Update: 11 Febbraio 2004
|