2011-03-05 8 views
2

je dessine des choses Java 2D comme ceci:Comment obtenir les coordonnées absolues après transformation

g2.translate(getWidth()/2, getHeight()/2); 
g2.rotate(angle); 
g2.draw(new Ellipse2D.Double(-1, -1, 1, 1)); 

Maintenant, je veux kow les coordonnées de l'ellipse sur mon sceen. Une idée de comment l'obtenir? J'ai donc besoin de la conversion de l'espace logique à l'espace physique.

Répondre

0

C'est facile, il y a beaucoup de méthodes, vous ne les trouvez pas dans Ellipse2D cependant.

Vous pouvez utiliser sa forme RectangularShape parente, puis en fonction de la précision que vous souhaitez obtenir, vous pouvez soustraire la comptabilisation de la courbure.

http://download.oracle.com/javase/1.4.2/docs/api/java/awt/geom/RectangularShape.html

+0

Je ne sais pas comment cela va résoudre mon problème. Je veux juste les coordonnées absolues de la boîte, pas de chaque pixel. Donc le même paramètre mais sur des positions physiques non logiques. –

+0

Vous pouvez utiliser des méthodes du côté i lié comme ceci: g2.getCenterX(), g2.getMaxX(). Si votre rectangle d'entourage a un système de coordonnées de par ex. -1 à 1 essayer de multiplier la valeur que ces méthodes vous donnent avec le nombre de pixels que votre entourage-rectangle a divisé par 2. –

0

Si vous créez une référence à l'ellipse

g2.translate(getWidth()/2, getHeight()/2); 
g2.rotate(angle); 
Ellipse2D.Double ellipse = new Ellipse2D.Double(-1, -1, 1, 1); 
g2.draw(ellipse); 

pour x g2.getTransform().getTranslateX() + ellipse.getX()

et pour y g2.getTransform().getTranslateY() + ellipse.getY()

+0

Non ce n'est pas la solution. J'ai besoin des coordonnées après la traduction bien sûr. Sinon, je reçois juste 1, mais correct serait 440x444 ou quelles que soient les coordonnées absolues. –

+0

@Jeny Edited! pouvez-vous essayer cela? –

+0

Cela ne fonctionne pas pour les transformations plus complexes avec rotation ... – dacwe

2

Obtenez le AffineTransform de l'objet Graphics2D et utilisez la méthode transform(src, dst) pour accéder aux coordonnées de l'écran (vous pouvez le faire pour n'importe quel point). Si vous voulez le chemin de l'ellipse, vous pouvez utiliser Ellipse2D.getPathIterator(AffineTransform at) - il renvoie un PathIterator.

Cet exemple obtient le point central de l'ellipse à l'écran:

public static void main(String[] args) { 

    JFrame frame = new JFrame("Test"); 


    frame.add(new JComponent() { 
     @Override 
     protected void paintComponent(Graphics g) { 
      super.paintComponent(g); 

      Graphics2D g2 = (Graphics2D) g; 

      g2.translate(getWidth()/2, getHeight()/2); 
      g2.rotate(Math.PI); // some angle 

      Ellipse2D.Double ellipse = new Ellipse2D.Double(-10, -10, 10, 10); 
      g2.draw(ellipse); 

      Point2D c = new Point2D.Double(
        ellipse.getCenterX(), 
        ellipse.getCenterY()); 

      AffineTransform at = g2.getTransform(); 
      Point2D screenPoint = at.transform(c, new Point2D.Double()); 

      System.out.println(screenPoint); 
     } 
    }); 

    frame.setSize(400, 300); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setVisible(true); 
} 
+0

Cool. C'est une bonne idée! Travaux. Merci. PS: "Point2D screenPoint = at.transform (c, null);" pourrait être un peu mieux. –

+0

@Jeny Jeppesen: Yepp! Fais comme tu veux! :) – dacwe

Questions connexes