Come disegnare una spirale usando segmenti di cerchi diversi?

1

Ho un vecchio plotter che non può gestire la stampa di vere spirali. Ho bisogno di aiuto per sviluppare un algoritmo per approssimare una spirale.

Ecco un sotto-script LISP che ho scritto che usa semicerchi di vari raggi per disegnare una spirale:

(setq inner_radius 1e3)  ; The spiral grows from inner radius to outer radius
(setq coil_thickness 35) ; This is the half-pitch of the spiral, pitch is 70
(setq outer_radius (+ 2.4e3 (* 2 coil_thickness)))
(while (< inner_radius outer_radius)
        (setq P1 (list 0 inner_radius))
        (setq P2 (list inner_radius 0))
        (setq P3 (list 0 (* -1 inner_radius)))
        (setq P4 (list (- (- inner_radius) coil_thickness) coil_thickness))
        (setq P5 (list 0 (+ inner_radius (* coil_thickness 2))))
        (command "ARC" P1 P2 P3) ; Draws a 3 point arc through P1, P2 and P3
        (command "ARC" P3 P4 P5) ; Draws a 3 point arc through P3, P4 and P5
        (setq inner_radius (+ inner_radius (* coil_thickness 2)))
)

Sto usando AutoCAD per implementare lo script. Il codice qui è un cop-out: posso implementare una vera spirale in AutoCAD ma il plotter, che lo traccerà, è datato e non è in grado di gestire una vera spirale. Può gestire solo archi di cerchio e segmenti di linea. Sto cercando un metodo che possa implementare una migliore approssimazione della spirale. Ad esempio, ho provato a pensare a quartcircles (invece dei semicerchi che ho usato nella suddetta sotto-sceneggiatura), ma non sono riuscito a trovare uno schema praticabile.

    
posta Shashank Sawant 17.02.2014 - 02:45
fonte

2 risposte

3

La mia prima scelta sarebbe quella di usare solo i segmenti della linea corta per approssimare la spirale. Una spirale in coordinate polari è solo:

R = a + b * Theta

Lo pseudo-codice approssimativo per una generazione a spirale che utilizza i segmenti di linea dovrebbe essere qualcosa del tipo:

LastPoint = (0, 0)
DeltaTheta = 0.01   //Radians, Make smaller for a finer resolution
NumTurns = 4
CONSTANT_A = 0
CONSTANT_B = 1

For Theta = 0 to NumTurns*2*PI STEP DeltaTheta
   ThisR = CONSTANT_A + CONSTANT_B * Theta
   ThisPoint = (ThisR * cos(Theta), ThisR * sin(Theta))
   DrawLine(LastPoint, ThisPoint)
   LastPoint = ThisPoint
Next Theta

Se riesci a rendere abbastanza piccolo il parametro DeltaTheta , dovresti riuscire a ottenere una spirale dall'aspetto relativamente dignitoso. Per una spirale più fluida, potresti voler controllare le curve di Bezier, supponendo che il tuo plotter li supporti. Un'altra opzione sarebbe quella di utilizzare archi arbitrari che corrispondono alla pendenza della spirale su ciascuna estremità.

    
risposta data 17.02.2014 - 17:59
fonte
1

Attualmente stai alternando il centro tra due punti, puoi migliorare la tua approssimazione aumentando il numero di punti. Attualmente stai usando due punti separati da pitch / 2, puoi usare tre punti in un triangolo equilatero il cui edge è pitch / 3, quattro punti in un quadrato con pitch edge / 4, ... n punti in un poligono regolare con n lati i cui bordi sono pitch / n. La tua spirale sarà quindi formata da un arco di 360 / n gradi con un raggio crescente di passo / n per passo.

    
risposta data 17.02.2014 - 17:57
fonte

Leggi altre domande sui tag