//classe q gera um plano cartesiano import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.AffineTransform; import java.awt.geom.Ellipse2D; import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.Point2D; import java.text.DecimalFormat; import java.util.Random; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; public class Teste5 extends JComponent { private static final BasicStroke STROKE_FINO = new BasicStroke(0.1f); protected void paintComponent(Graphics g1) { Graphics2D g = (Graphics2D) g1; Dimension size = getSize(); AffineTransform scalePlano = AffineTransform.getScaleInstance( size.width / 100d, size.height / 100d); AffineTransform scaleTela = AffineTransform.getScaleInstance( 100d / size.width, 100d / size.height); //transforma a tela num plano cartesiano 100x100 com a origem no centro //faz com que a imagem seja distorcida proporcionalmente ao redimensionamento da janela g.transform(scalePlano); g.translate(50, 50); g.scale(1, -1); //opcoes do traço g.setStroke(STROKE_FINO); g.setColor(Color.BLACK); g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //XOR só pra aparecer melhor g.setXORMode(Color.white); g.drawLine(0, -100, 0, 100); g.drawLine(-100, 0, 100, 0); drawStringSemTransformacoes("(0,0)", 0, 0, g, scalePlano, scaleTela); g.setPaintMode(); //matriz identidade, retorna ao sistema de coordenadas padrao (pixels) g.setTransform(new AffineTransform()); } /** * @param string TODO * @param x TODO * @param y TODO * @param g * @param scalePlano * @param scaleTela */ private void drawStringSemTransformacoes(String string, int x, int y, Graphics2D g, AffineTransform scalePlano, AffineTransform scaleTela) { //mantém a origem (0,0) no meio da tela, mas retira retorna à proporção e orientação // originais da tela g.scale(1, -1); g.transform(scaleTela); //imprime a string g.drawString(string, x, y); g.transform(scalePlano); //volta ao espaço cartesiano g.scale(1, -1); } /** * @param posicaoPlano * @param xTela * @param yTela */ public void calculaPosicaoPlano(Point2D posicaoPlano, double xTela, double yTela) { Dimension sz = this.getSize(); double sx = ((xTela * 200) / sz.width) - 100; double sy = -(((yTela * 200) / sz.height) - 100); posicaoPlano.setLocation(sx, sy); } public static void main(String[] args) { final Teste5 t = new Teste5(); final JLabel l = new JLabel("Posição: "); JFrame f = new JFrame(); f.getContentPane().setLayout(new BorderLayout()); f.getContentPane().add(t, BorderLayout.CENTER); f.getContentPane().add(l, BorderLayout.SOUTH); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setSize(500, 500); f.setVisible(true); t.addMouseMotionListener(new MouseMotionAdapter() { private Point2D p = new Point2D.Double(); private DecimalFormat df = new DecimalFormat("00.00"); { this.df.setPositivePrefix("+"); } public void mouseMoved(MouseEvent evt) { t.calculaPosicaoPlano(p, evt.getX(), evt.getY()); l.setText("Posição: (" + df.format(p.getX()) + "; " + df.format(p.getY()) + ")"); } }); } }