HOME OGGETTI 3D LIBRI CORSI TUTORIAL FORUM SHOP CONTATTI   LOGIN









Autore Topic: Movimenti sul piano  (Letto 2501 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

marcomasetti

  • Newbie
    ...sono qui da poco, il mio miglior amico è il pulsante RICERCA
  • *
  • Post: 183
Movimenti sul piano
« il: 20 Giugno 2012, 22:48 »
Il linguaggio GDL prevede rotazioni e traslazioni. La difficoltà nell’effettuare i movimenti è che ogni volta viene trascinato il sistema di riferimento assieme all’oggetto in una nuova posizione, così che il nuovo movimento viene calcolato a partire da quest’ultima.  Per le sole traslazioni non ci sono problemi, ma quando si effettuano rotazioni, queste cambiano anche i valori delle traslazioni; inoltre ogni rotazione viene sempre effettuata attorno all’origine degli assi, riferita all’ultima posizione L, non a quella globale iniziale G.
Per chiarire con un esercizio come funzionano le cose considero il solo movimento su piano.
Premetto alcuni concetti che sono di aiuto per semplificare le cose.
Nella teoria dei vettori bidimensionali esiste un particolare ambito che è quello dei numeri complessi:
un numero complesso è un vettore (x,y) espresso nella forma: x+i*y, dove i rappresenta la parte detta immaginaria, che altro non è che il versore dell’asse y=(0,1). Il prodotto si esegue normalmente come per i numeri reali, con la sola differenza che i^2=-1, fatto che non rappresenta un assurdo. Infatti in questo caso il prodotto esprime una rotazione attorno all’origine.
Un vettore (x,y) può sempre essere scritto nella forma:   sqr(x^2+x^2)*(cos(al), sin(al)),
dove  sqr(x^2+x^2) è il modulo o lunghezza del vettore, al è l’angolo che il vettore forma con l’asse x.
Valgono le formule: al=acs(x/sqr(x^2+x^2)) oppure al=asn(y/sqr(x^2+x^2)) o ancora, per -90<al<90, al=atn(y/x).   Infatti:
x= sqr(x^2+x^2)*cos(al), y= sqr(x^2+x^2)*sin(al), y=x*tan(al)
Il prodotto fra due vettori espressi come numeri complessi, fornisce un terzo vettore, dove il modulo risulta essere il prodotto tra i moduli, mentre l’angolo al è dato dalla somma dei due angoli originari.
Ricordare questa proprietà permette di ricavare, senza bisogno di manuali, diverse formule di trigonometria ed in particolare la formula per ruotare un vettore dato attorno all’origine.
Come esempio ruotiamo il punto (x,y) di un angolo be  (ricordando che i^2=-1) :
(x+i*y)*(cos(be)+i*sin(be)) = x*cos(be)-y*sin(be)  +i*( y*cos(be)+x*sin(be) )
Il numero complesso ottenuto è il vettore  ( x*cos(be)-y*sin(be), x*sin(be)+y*cos(be) )
Pertanto queste sono pure le nuove coordinate del vettore (x,y) ruotato dell’angolo be, formula che corrisponde nel linguaggio GDL a:
rot2 be

Esempio:

rot2 be
line2 x1,y1, x2,y2
del 1  !cancella l’ultimo movimento

equivale a:

xa= x1*cos(be)-y1*sin(be)
ya= x1*sin(be)+y1*cos(be)
xb= x2*cos(be)-y2*sin(be)
yb= x2*sin(be)+y2*cos(be)
line2 xa,ya, xb,yb

Vogliamo ora ricavare una formula per spostare un oggetto da un punto A1=(xa1,ya1) a un punto A2=(xa2,ya2), facendolo poi ruotare di un angolo be.

nel linguaggio GDL:
add2 xa2-xa1, ya2-ya1
rot2 be
line2 x1,y1, x2,y2
del 2               !cancella gli ultimi 2 movimenti

L’oggetto ruoterà attorno a quel punto che inizialmente costituiva l’origine e che attualmente ha coordinate assolute xa2-xa1, ya2-ya1. L’ordine dei movimenti non può essere scambiato.
Altrimenti occorrerebbe scrivere:
rot2 be
(xa2-xa1)*cos(-be)- (ya2-ya1)*sin(-be) , (xa2-xa1)*cos(-be)+(ya2-ya1)*sin(-be)
Questo perché, avendo effettuato la rotazione, il vettore spostamento viene ora visto ruotato di –be.

Le trasformazioni di coordinate equivalgono a:
xa= x1*cos(be) - y1*sin(be) + xa2-xa1
ya= x1*sin(be) +y1*cos(be) + ya2-ya1
xb= x2*cos(be)- y2*sin(be) + xa2-xa1
yb= x2*sin(be) +y2*cos(be)+ ya2-ya1
line2 xa,ya, xb,yb

Più complesso è far ruotare un oggetto di un angolo be non attorno all’origine, ma attorno a un determinate punto C di cooordinate xc,yc.  In questo caso occorre considerare un nuovo oggetto identico, ma spostato del vettore (-xc,-yc)

Le trasformazioni di coordinate equivalgono a:
xa= (x1-xc)*cos(be) - (y1-yc)*sin(be) +xc
ya= (x1-xc)*sin(be) +(y1-yc)*cos(be) +yc
xb= (x2-xc)*cos(be) - (y2-yc)*sin(be) +xc
yb= (x2-xc)*sin(be) +(y2-yc)*cos(be) +yc
line2 xa,ya, xb,yb
 
L’origine attorno a cui avviene la rotazione sarà, relativamente all’oggetto, il punto C, che però ora coincide con l’origine, effettuata poi la rotazione occorre traslare il tutto secondo il vettore OC, ma poiché è avvenuta la rotazione, il vettore spostamento non è più (xc,yc) , ma:
xc*cos(-be)- yc*sin(-be) , yc*cos(-be)+xc*sin(-be)

Pertanto nel linguaggio GDL:
rot2 be
add2 –xc +xc*cos(be)+ yc*sin(be) , -yc+ yc*cos(be)-xc*sin(be)
line2 x1,y1, x2,y2
del 2

Se poi si volesse traslare il tutto di x,y:
add2 x,y
rot2 be
add2 –xc +xc*cos(be)+ yc*sin(be) , -yc+ yc*cos(be)-xc*sin(be)
line2 x1,y1, x2,y2
del 3


I movimenti rigidi del piano, anche se composti di rotazione e traslazione, possono essere ridotti ad una unica rotazione, considerando una eventuale traslazione come una rotazione con centro all’infinito.
Per verificare la  validità delle formule con un oggetto GDL non troppo elementare, vogliamo determinare il centro di rotazione di un versore che si sposta  dalla posizione A1 alla posizione A2, ruotando di be.
Le coordinate del versore iniziale sono  (cos(ga),sin(ga)) con punto di applicazione A1=(xa1,ya1),
le coordinate del versore finale sono  (cos(ga+be),sin(ga+be)) con punto di applicazione A2=(xa2,ya2).

Il centro di rotazione  C si trova sull’asse del segmento A1-A2, il cui punto medio M ha coordinate:
xm=(xa1+xa2)/2
ym=(ya1+ya2)/2
Costruendo il triangolo isoscele A1-A2-C è evidente che l’angolo A1-C-A2 ha ampiezza be, se infatti per ipotesi il versore iniziale fosse ortogonale a C-A1, cioè tangente al cerchio con centro C per A1, il versore finale sarebbe ancora tangente al cerchio, essendo poi ruotato di be, l’angolo al centro deve valere appunto be.       Posto d=A1-A2, risulta:
d=sqr((xa2-xa1)^2+(ya2-ya1)^2)
detta h l’altezza del triangolo A1-A2-C, risulta: d/2=h*tan(be/2)
h=d/(2* tan(be/2))
Il raggio del cerchio, cioè il lato del triangolo C-A1:
r=sqr(d^2/4+h^2)
L’inclinazione del vettore A1-A2 è data dall’angolo al:
al=acs(  (xa2-xa1)/d )
Poiché il centro C si trova sull’asse di A1-A2 a distanza h, le sue coordinate sono:
xc=xm-h*sin(al)
yc=ym+h*cos(al)

Di fatto abbiamo determinato il centro xc,yc dell’arco A1-A2, dato l’angolo al centro be:
xa1=
ya1=
xa2=
ya2=
be=    !fine parametri
xm=(xa1+xa2)/2
ym=(ya1+ya2)/2
d=sqr((xa2-xa1)^2+(ya2-ya1)^2)
h=d/(2* tan(be/2))
al=acs(  (xa2-xa1)/d )
r=sqr(d^2/4+h^2)  !raggio
xc=xm-h*sin(al)
yc=ym+h*cos(al)
La verifica è stata effettuata sull’oggetto gsm:   rotazioni 2D.gsm

Il cui script 2D è il seguente:
xa1=
ya1=
xa2=
ya2=
ga=
be=
!fine parametri

xm=(xa1+xa2)/2
ym=(ya1+ya2)/2
d=sqr((xa2-xa1)^2+(ya2-ya1)^2)
al=acs(  (xa2-xa1)/d )
h=d/(2* tan(be/2))

r=sqr(d^2/4+h^2)  !raggio
xc=xm-h*sin(al)
yc=ym+h*cos(al)

pen 21
line2 xa1,ya1, xa2,ya2
line2 xc,yc, xm,ym
line2 xc,yc, xa2,ya2
line2 xa1,ya1, xc,yc
arc2 xc,yc,r,-90+al-be/2,-90+al+be/2
pen 20
line2 xa1,ya1,xa1+cos(ga),ya1+sin(ga)
line2 xa2,ya2,xa2+cos(ga),ya2+sin(ga)

line2 xa2,ya2,xa2+cos(ga+be),ya2+sin(ga+be) !vettore ruotato e traslato

pen 6
rot2 be
add2 -xc +xc*cos(be)+ yc*sin(be) , -yc+ yc*cos(be)-xc*sin(be)
line2 xa1,ya1,xa1+cos(ga),ya1+sin(ga)            !vettore ruotato e traslato, verifica 1
del 2

pen 4
xa= (xa1-xc)*cos(be) - (ya1-yc)*sin(be) +xc
ya= (xa1-xc)*sin(be) +(ya1-yc)*cos(be) +yc
xb= (xa1+cos(ga)-xc)*cos(be) -(ya1+sin(ga)-yc)*sin(be) +xc
yb= (xa1+cos(ga)-xc)*sin(be) +(ya1+sin(ga)-yc)*cos(be) +yc
line2 xa,ya, xb,yb               !vettore ruotato e traslato, verifica 2
« Ultima modifica: 03 Agosto 2012, 21:32 da marcomasetti »

claudio-aster

  • MODERATOR
    ...non tutti i supereroi indossano il mantello
  • *
  • Post: 880
Re:Movimenti sul piano
« Risposta #1 il: 21 Giugno 2012, 11:50 »
benvenuto Marco! e grazie della lezione e dell'oggetto  ;)


qui potrai senza dubbio trovare qualche appassionato che sfiderà scipione  per cogliere e condividere spunti interessanti su questi argomenti vintage,
non aspettarti 'na gran calca pero!  :2funny:


ancora benvenuto, con simpatia,


claster

ZioBob

  • Che pacchia un forum senza spocchia!
  • ADMIN
    ...ho creato questo spazio e lo amo
  • *
  • Post: 5.099
Re:Movimenti sul piano
« Risposta #2 il: 21 Giugno 2012, 17:31 »
Argomenti di questa complessità possono anche spaventare chi vorrebbe avvicinarsi al GDL solo per fare i suoi oggettini d'arredo ... ma chi studia algebra per altri motivi, potrebbe accorgersi che la programmazione aiuta "vedere" le formule (e soprattutto i loro risultati) in un modo più diretto e dinamico.
 
-Roberto Corona-
archiradar  Staff