View Single Post
Old 02-05-2008, 00:38   #2
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
l'esempio con le immagini

Ecco il problema:

Avvio l'applicativo/test e posiziono il puntatore del mouse esattamente nel primo pixel in alto a sinistra del JPanel su cui avviene il rendering: in pratica sto puntando alle ccordinate x0y0 del sistema di riferimento in "device space".

Nei primi due JTextField sopra a sinistra leggo che non viene applicata nessuna traslazione al sistema di riferimento: sarebbe dunque lecito attendersi che le coordinate in "device space" di valore x0y0 convertite in "user space" valessero sempre x0y0 (in quanto non abbiamo applicato trasformazioni al Graphics2D).

[vedi: image01.jpg]


Invece si nota come le coordinate "user space" siano rimappate a x-13y-117 (internamente il remapping viene effettuato prendendo la reference alla AffineTransform del Graphics2D usandola per produrre un'altra AffineTransform equivalente all'inversa di se stessa da usare per trasformare le coordinate del punto del mouse) invece che corrispondere a x0y0, appunto.

Come dicevo nel post precedente, è verosimile che quel x-13y-117 applicato come traslazione al punto x0y0 del JPanel me lo porti a combaciare col punto x0y0 del JFrame che lo contiene? A me sembra di sì...

Cmq, continuando l'esempio: ora inserisco una traslazione di 100 per le X
[vedi: image02.jpg]

e una traslazione di 100 per le Y
[vedi: image04.jpg]


Esaminando le utlime voci a destra, sotto la stringa "Transform propertyes", vediamo stampati i valori della AffineTransform del Graphics2D aggiornati ai valori attuali e la traslazione è come ci aspettiamo: vale 100 per entrambe le coordinate e quindi in caso di trasformazione inversa dovrebbe andare tutto bene ma...

ho inserito un repaint(e quindi un refetch) di quei valori anche quando il mouse scatena l'evento MouseEntered nel JPanel e qui "casca l'asino"
[vedi: image05.jpg]


Come si vede ora i valori di traslazione si sono riaggiornati ma invece di presentarci l'atteso x100y100 è compraso un bel x113y217 che pare proprio tenenre conto dell'offset visto prima (x-13y-117) e che si nota come "errore" nella conversione della posizione del mouse: nel JPanel sono sopra l'origine traslata, il che significa che se come "screen/device space" le coordinate del mouse sono x100y100 (corretto perchè abbiamno applicato al Graphics2D una traslazione di x100y100) continuano però a essere rimappate in "user space" come x-13y-117, invece che come mi aspettavo legittimamente, cioè x0y0.

Ricordo che metre le coordinate stampate in "screen space" sono ricavate dal MouseEvent.getX()/.getY() le coordinate stampate in "user space" sono quelle del mouse rimappate da una AffineTransform che è l'inversa della AffineTransform del Graphics2D.

La mia domanda è: sono un nubbione da chilo e ho commesso qualche fesseria palese nel codice (il link nel post precedente, la classe rilevante è quella custom che estende JPanel per fare il rendering) o c'è sotto dell'altro?

Qualcuno ha idea da cosa sia dovuto il problema o in alternativa conosce delle "best practice" in materia che magari vede chiaramente non applicate qui, o ancora ci sono parti di codice nell'uso delle AffineTransform che gli "puzzano"?

Vi prego: ho davvero bisogno di capire perchè si comporta così e come rimediare dato che al click del mouse io devo neccessariamente risalire alle coordinate esatte del mio modello dati per selezionare/manovrare correttamente le figure da riposizionare nella lastra: le loro coordinate finali e i relativi percorsi devono combaciare a video rispetto a come verrano poi tagliati nell'effettivo dal CN sulla lastra, non posso permettermi errori di posizionamento.

Grazie mille a chiunque ha una anche minima idea della cosa e me la comunica.
A proposito: buonanotte
banryu79 è offline   Rispondi citando il messaggio o parte di esso