cg-Cad

Lisp »Tips 'n Tricks »Algoritmo della polvere

L'algoritmo è il seguente:

K=numero casuale ]0-1[
a=3.14159

while i<=numero_cicli
 repeat numero_punti
  x=K*cos(a+K)+K*sin(a+K)
  y=K*cos(a+K)-K*sin(a+K)
  Point(x,y)
  a=a+0.5
  i=i+1
 end;
end; 

PLV

;|

   plv.lsp (C) 2005 by Claudio Piccini.
   www.cg-cad.com

|;

;|
   Genera un numero reale casuale compreso tra 0 e 1
   Vedi il tutorial n.37 "Numeri casuali"
   in AutoLISP Tips & Tricks Volume I        
|;

(defun rn ( / m b c ) 
 (if (not sd)(setq sd (getvar "DATE")))
 (setq m 65521 b 15937 c 33503) 
 (setq sd (rem (+ (* b sd) c) m))
 (* (/ sd m) 2)
)

(defun polvere ( / i a np nc p0 p1 )
 (setq i 0
       a pi
 )
 (initget (+ 2 4)) ; numero>0
 (setq np (getint "\n numero punti [100]: "))
 (if (= np nil)(setq np 100))
 (initget (+ 2 4)) ; numero>0
 (setq nc (getreal "\n numero cicli [1]: "))
 (if (= nc nil)(setq nc 1))
 (setq p0 (getpoint "\n seleziona un punto nel disegno..."))
 (while (<= i nc)
  (repeat np
   (setq p1 
    (list 
     (+ (+ (* (rn)(cos(+ a (rn))))(* (rn)(sin(+ a (rn)))))(car p0))
     (+ (- (* (rn)(cos(+ a (rn))))(* (rn)(sin(+ a (rn)))))(cadr p0))
    )
   )
   (command "_point" p1)
  )
  (setq i  (1+ i)
        a  (+ a 0.5)
        p0 p1
  )
 )
)

(defun c:plv ( / snapp )
 (setvar "cmdecho" 0)
 (setq snapp (getvar "osmode"))
 (command "_osnap" "_non")
 (polvere)
 (setvar "osmode" snapp)
 (command "_redraw")
 (setvar "cmdecho" 1)
 (princ)
)
;;;eof

Test del Lisp

Command: plv
numero punti [100]: Invio
numero cicli [1]: 10
seleziona un punto nel disegno...

PLV.LSP

Lisp »Tips 'n Tricks

Ultimo Aggiornamento_Last Update: 7 Maggio 2005