Cait Sith
07-12-2011, 12:40
Sto facendo una classe per fare un grafico. Dato che il sistema di riferimento del pannello e quello della linea che devo disegnare è diverso ho pensato di usare una affinità.
In pratica una parte del mio pannello definita dal rettangolo BoxArea è quella dedicata al grafico. I limiti di questo rettangolo devono corrispondere ai limiti delle coordinate del grafico Xmin, Xmax, Ymin e Ymax che possono essere qualsiasi.
Ora io volevo associare l'affinità all'oggetto Graphics2D in modo da non dovermi più preoccupare di trasformare ogni cosa che disegno. Purtroppo se la riscalatura tra le due coordinate è grande ho una linea che è spessa quasi quanto il pannello (ramo 1 dell'if). Per ora ho risolto applicando l'affinità direttamente all'oggetto che devo disegnare (ramo due dell'if)
Graphics2D g2=(Graphics2D)g;
sx=((double)boxArea.width)/(Xmax-Xmin);
sy=((double)boxArea.height)/(Ymax-Ymin);
tx=-sx*Xmin+((double)boxArea.x);
ty=-sy*Ymin+((double)boxArea.y);
AffineTransform at=new AffineTransform(sx,0.0,0.0,sy,tx,ty);
g2.setColor(Color.BLUE);
if (true) {
// non funziona bene
g2.setTransform(at);
g2.draw(new Line2D.Double(0.1, 0.1, 0.9, 0.9));
} else {
// funziona bene
g2.draw(at.createTransformedShape(new Line2D.Double(0.1, 0.1, 0.9, 0.9)));
}
Ciò che mi interessa dell'affinità è solo la forma, non le proprietà della figura come lo spessore della linea.
Dato che dovrei disegnare più oggetti, mi piacerebbe applicare la trasforamzione direttamente all'oggetto Graphics2D e poi non preoccuparmi più, per non dover generare un sacco di oggetti.
C'è un modo per risolvere la cosa?
In pratica una parte del mio pannello definita dal rettangolo BoxArea è quella dedicata al grafico. I limiti di questo rettangolo devono corrispondere ai limiti delle coordinate del grafico Xmin, Xmax, Ymin e Ymax che possono essere qualsiasi.
Ora io volevo associare l'affinità all'oggetto Graphics2D in modo da non dovermi più preoccupare di trasformare ogni cosa che disegno. Purtroppo se la riscalatura tra le due coordinate è grande ho una linea che è spessa quasi quanto il pannello (ramo 1 dell'if). Per ora ho risolto applicando l'affinità direttamente all'oggetto che devo disegnare (ramo due dell'if)
Graphics2D g2=(Graphics2D)g;
sx=((double)boxArea.width)/(Xmax-Xmin);
sy=((double)boxArea.height)/(Ymax-Ymin);
tx=-sx*Xmin+((double)boxArea.x);
ty=-sy*Ymin+((double)boxArea.y);
AffineTransform at=new AffineTransform(sx,0.0,0.0,sy,tx,ty);
g2.setColor(Color.BLUE);
if (true) {
// non funziona bene
g2.setTransform(at);
g2.draw(new Line2D.Double(0.1, 0.1, 0.9, 0.9));
} else {
// funziona bene
g2.draw(at.createTransformedShape(new Line2D.Double(0.1, 0.1, 0.9, 0.9)));
}
Ciò che mi interessa dell'affinità è solo la forma, non le proprietà della figura come lo spessore della linea.
Dato che dovrei disegnare più oggetti, mi piacerebbe applicare la trasforamzione direttamente all'oggetto Graphics2D e poi non preoccuparmi più, per non dover generare un sacco di oggetti.
C'è un modo per risolvere la cosa?