Disegnare una circonferenza con centro e raggio dati.
Si definisce il centro (Xc,Yc) e si costruisce la circonferenza di raggio dato.
Il metodo consiste nell'applicare la definizione di curvatura considerando che la circonferenza ha una curvatura costante.
Con un po' di disinvoltura si può partire dalla definizione di angolo:
un angolo (ovviamente misurato in radianti) è il rapporto tra la lunghezza s dell'arco di circonferenza sotteso dai lati dell'angolo e la lunghezza R del raggio (nota 1:
θ = s/R
La lunghezza di un arco di circonferenza è, allora, pari a
s = R * θ
Se si vuole far percorrere allo sprite un arco di circonferenza occorre suddividere l'arco in brevissimi tratti rettilinei (lo sprite conosce solo il moto rettilineo) e disegnare i singoli tratti modificando ogni volta l'inclinazione dello sprite ripetendo l'operazione per tutte le volte in cui si è suddiviso l'arco.
Si utilizza l'espressione desunta dalla precedente:
∆s = R * ∆θ
Se si vuole disegnare l'intera circonferenza, l'operazione va ripetuta per tutto l'angolo giro (nota 2).
Si suddivide l'angolo giro in un numero di parti "numParti" ritenute sufficienti a rappresentare la circonferenza.
Empiricamente, usando scratch, va bene suddividere la circonferenza in qualche centinaio di parti ma è meglio almeno 500 (nota 3)
Il processo è il seguente:
si inseriscono i dati del centro Xc e Yc,
il raggio "R" (in passi),
il numero di parti "numParti" con cui suddividere il giro
si calcola il segmento incrementale ∆s = 2πR/numParti
senza disegnare nulla
si posiziona lo sprite nel centro Xc,Yc
si allontana lo sprite di una quantità pari al raggio in una direzione a caso o scelta a piacere
si ruota lo sprite di 90° (la tangente alla circonferenza in quel punto è perpendicolare al raggio)
si fa indietreggiare lo sprite di una quantità pari a metà di ∆s (nota 4)
si abbassa la penna dello sprite e,
per un numero di volte pari a numParti
si disegna un segmento lungo ∆s
si ruota lo sprite di un angolo corrispondente a 360/numParti (nota 5)
ripetere il ciclo
Base teorica
Più solidamente:
si definisce curvatura (link a "vialattea.net") il limite del rapporto fra la variazione dell'angolo compiuto dalla tangente alla curva per due punti successivi e la lunghezza dell'arco di curva fra i suddetti due punti:
L'inverso di "k" è il raggio di curvatura che è il raggio del cerchio osculatore (nota 6).
Dall'espressione si deduce che l'incremento ∆s è:
che è l'espressione già ricavata in altro modo e che, ovviamente, contiene un errore di approssimazione dato che stiamo trattando incrementi finiti e non infinitesimali (da cui la nota 2).
Note
nota 1: sia la lunghezza dell'arco che il raggio hanno la stessa unità di misura; eseguendo il rapporto tra due lunghezze l'unità di misura usata è indifferente e l'ampiezza dell'angolo θ (teta) è un numero. Spesso si dice che è un numero "puro" che non so cosa significhi se non che è adimensionato. Più importante è osservare che, data l'abitudine di misurare gli angoli con numeri in gradi sessagesimali, conviene precisare sempre che si tratta di un rapprto fra lunghezze e quindi è opportuno precisare "radianti" o "rad". Il radiante è l'angolo che intercetta un arco di circonferenza pari alla lunghezza del raggio. Un angolo giro è quindi pari a 2π radianti, un radiante è pari ad un angolo di 360/2π gradi (poco più di 57 gradi).
nota 2: è un'operazione di integrazione numerica, la posizione finale dipende dall'accumulo di tutte le variazioni di posizione assunte precedentemente solo che anche gli errori si accumulano. L'errore è dovuto al fatto che si approssima un arco di circonferenza fra due punti con la sua corda; quanto più vicini sono i punti tanto minore è l'errore totale.
nota 3: aumentare il numero di suddivisioni serve a minimizzare gli errori di approssimazione che si accumulano a causa del procedimento di integrazione numerica adottato.
nota 4: per quanto piccolo ∆s, si commettono errori di integrazione minori se si effettua l'operazione indicata (vedi anche articolo poligoni). Infatti l'angolo tra il raggio e la tangente è retto, non è retto l'angolo tra il raggio ed il segmento incrementale ∆s; il disegno della circonferenza partirebbe con una inclinazione impercettibile ad un primo sguardo che diventa evidente se si disegnano più circonferenze identiche in sovrapposizione. Provare!
nota 5: in Scratch l'argomento delle rotazioni è in gradi sessadecimali: angolo giro di360 gradi, frazioni di grado in decimali.
nota 6: cioè quel cerchio che nel punto in considerazione "bacia" la curva