Marionetta, logica del movimento.

Ora che abbiamo una struttura che tiene traccia delle dipendenze tra i pezzi della marionetta, concentriamoci sulle operazioni minime che possiamo eseguire sui nodi della struttura . Queste operazioni devono mantenere la configurazione dei pezzi coerente.
La cosa più semplice è la traslazione di una semiretta, che si riduce alla traslazione del suo punto. Diciamo che se una semiretta trasla , mantenendo quindi invariato il suo angolo, le semirette direttamente dipendenti devono traslare dello stesso valore.
Per la rotazione di una semiretta, le cose sono più sottili. Se una semiretta ruota , varia solo il suo angolo. Le semirette direttamente dipendenti subiscono uno spostamento pari alla rotazione del loro punto della stessa quantità d’angolo , intorno al punto della semiretta che ha ruotato.
Codice.

type Spostamento = Punto -> Punto

spostamento :: Spostamento -> Semiretta -> Semiretta
spostamento f (Semiretta p t) = Semiretta (f p) t

rotazione :: Angolo -> Semiretta -> (Semiretta, Spostamento)
rotazione r (Semiretta p t) = (Semiretta p r, ruota p (r - t))

Intanto diamo un sinonimo alle variazioni di punti.
Sono di tipo Spostamento tutte le funzioni che dato un punto ne creano uno nuovo.

La funzione spostamento esegue la spostamento di una semiretta. Al punto della semiretta viene applicata lo spostamento, l’angolo rimane invariato.

La funzione rotazione, imposta il valore d’angolo alla semiretta e costruisce un nuovo Spostamento, pari alla rotazione, intorno al punto della semiretta, della variazione di angolo subita dalla semiretta stessa. Notiamo che alla funzione ruota vengono passati due argomenti. Manca infatti il punto da ruotare. Ma uno spostamento è proprio una funzione che prende un punto e ne crea uno nuovo, quindi “ruota p t” è di tipo Spostamento, come vuole la firma della funzione rotazione.

Adesso bisogna fare un salto di qualità e comporre i due effetti.
Si potrebbe pensare che i due effetti semplicemente si sommano e si ripercuotono sulle semirette successive, ma non è esattamente così.
Infatti lo Spostamento creato dalla rotazione è valido solo per le semirette direttamente dipendenti. Esso infatti varia a seconda della distanza della semiretta che lo subisce dal centro di rotazione e quindi è corretto solo per i pezzi direttamente vincolati al pezzo che ruota.
Ciò nonostante esso deve lasciare il segno perché abbiamo detto che se una semiretta trasla tutte le semirette dipendenti devono traslare ugualmente.
Quindi, quando spostiamo il punto di una semiretta a causa di una rotazione, questo spostamento diventa traslazione per le successive.
Creiamo quindi un valore che lasci separati i due effetti.


data Movimento = Movimento Spostamento Spostamento

spiazzamento :: Semiretta -> Semiretta -> Spostamento
spiazzamento (Semiretta q0 t) (Semiretta q1 r) p = p + (q1 - q0)

movimento :: (Angolo , Semiretta) -> Movimento -> (Semiretta, Movimento)
movimento (r,s) (Movimento rot tras) = let
   (rot', s') = rotazione r . spostamento rot . spostamento tras $ s
   in (s' , Movimento rot' (spiazzamento s s'))

Il datatype Movimento contiene i due spostamenti separati derivanti dalla rotazione del pezzo precedente e dalla sua rotazione.

La funzione spiazzamento ci serve a calcolare la traslazione finale del punto della semiretta, per passarlo alle successive.

Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...