Newsgroup: it.comp.lang.delphi
Titolo: Problema con l ' arrotondamento in grafica ?

 Salve a tutti . Ho steso un piccolo programmino dove volevo testare la 
rotazione di una figura ( un triangolo ) , disegnandola semplicemente su 
una Form . Fin qui tutto a posto , e anche la rotazione riesce 
perfettamente , ma c'è un piccolo problema : ho notato che a lungo 
andare , cioè dopo aver fatto ruotare piu' volte la figura , quando essa 
ritorna alla posizione originale , non è proprio la stessa di quella 
alla partenza . Mi spiego meglio : come riferimento ho messo tre punti 
blu nella Form che rappresentano le coordinate iniziali del triangolo , 
e dopo averlo fatto ruotare piu' volte , quando esso ritorna alla sua 
posizione iniziale , le coordinate dei suoi vertici non combaciono piu' 
con quelli iniziali , cioè c'è una perdita di precisione dovuta al 
continuo arrotondamento della funzione round . Qualcuno mi sa dare un 
suggerimento su come ovviare a questo inconveniente ? Forse c'è un 
fattore di correzione ? Se si quale ? Grazie a tutti....
--- posted by geoForum on 
http://www.delphiedintorni.it

 fattore di correzione ? Se si quale ? Grazie a tutti....
Quando visualizzi la figura ruotata, non usare mai valori memorizzati ma 
calcolati dalle coordinate originali, in modo che la nuova posizione sia 
sempre una funzione dell'originale, alla quale quindi ritornerai con i 
parametri di spostamento a zero
-- 
================================================================
Alberto Rubinelli - A2 SISTEMI 
news.aioe.org
 ThunderBird 2.0.0.4
Via Costantino Perazzi 22 - 28100 NOVARA - ITALY
Tel 0321 640149   Fax 0321 391769   BBS 0321 392320
Mail: 
alb...@oldcomputers.de
skype: albertorubinelli  ICQ : 49872318
Visita il mio museo di computers: 
http://www.oldcomputers.it
================================================================


Scusa , ma non capisco cosa vuoi dire......puoi spiegarmi gentilmente 
con qualche breve esempio ? Grazie....


 con qualche breve esempio ? Grazie....
Prendi per esempio che il tuo oggetto abbia come zero le coordinate x,y
Quando lo ruoti , tu penso te le ricalcoli ed avrai dei nuovi valori, 
poi quando torni indietro, ricalcoli nuovamente e cosi' hai l'errore di 
arrotondamento.
bene, immagina di posizionare il tuo oggetto spostando l'origine a x+K1, 
y+K2
In questo modo tu conservi sempre l'origine, usi degli offset.
ho fatto un esempio banale, dopo il calcolo puo' essere piu' complesso
Ciao.Alberto.



Forse intendi una traslazione degli assi rispetto all'origine e quindi 
far ruotare la figura rispetto a un punto ( centro ) , e questo è quello 
che ho fatto . Guarda , qui c'è un frammento di codice dove spiega il 
calcolo che effettuo per l'arrotondamento e la successiva 
visualizzazione nelle coordinate grafiche . Puoi dargli un'occhiata 
veloce e dirmi dov'è l'errore ? Grazie.....
//Traslazione dei 3 punti(grafici) nella nuova origine
(CenterX,CenterY ) !!!
      X1 := X1 - CenterX; Y1 := CenterY - Y1;
      X2 := X2 - CenterX; Y2 := CenterY - Y2;
      X3 := X3 - CenterX; Y3 := CenterY - Y3;
// Calcolo delle nuove coordinate ruotate rispetto alla nuova origine !!!
      X1 := round(X1*Cos(Radiants)) - round(Y1*Sin(Radiants));
      Y1 := round(X1*Sin(Radiants)) + round(Y1*Cos(Radiants));
      X2 := round(X2*Cos(Radiants)) - round(Y2*Sin(Radiants));
      Y2 := round(X2*Sin(Radiants)) + round(Y2*Cos(Radiants));
      X3 := round(X3*Cos(Radiants)) - round(Y3*Sin(Radiants));
      Y3 := round(X3*Sin(Radiants)) + round(Y3*Cos(Radiants));
// Trasformazione delle coordinate ruotate in coordinate grafiche !!!
      X1 := X1 + CenterX; Y1 := CenterY - Y1;
      X2 := X2 + CenterX; Y2 := CenterY - Y2;
      X3 := X3 + CenterX; Y3 := CenterY - Y3;
//Ridisegno del triangolo nelle coordinate ruotate ( coordinate  
grafiche ) !!!
      PaintTriangle(Self);



Ho risolto il problema memorizzando in tre variabili le coordinate 
iniziali e quindi attuo la rotazione sempre a partire da quelli . 
L'errore ( legittimo ) dell'arrotondamento era dovuto al fatto che 
attuavo la rotazione di un grado rispetto al punto precedente già 
arrotondato , quindi è chiaro che alla lunga c'era perdita di 
precisione......:-D . Attuando invece la rotazione sempre dal punto 
originale , non c'è nessuna perdita di precisione e la figura rimane ( 
in termini di grandezza s'intende ) sempre la stessa . Grazie per 
l'aiuto , alla prossima......ciao ;-D !!!


 iniziali e quindi attuo la rotazione sempre a partire da quelli . 
esatto, era proprio quello che cercavo di dire :)
