2011-03-05 35 views
2

後得到的絕對座標,我畫的Java 2D這樣的東西:如何改造

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

現在我要叩頭我sceen橢圓的座標。任何想法如何得到它?所以我需要從邏輯到物理空間的轉換。

回答

0

它很容易,有很多方法,但你不會在Ellipse2D中找到它們。

您可以使用它的父級RectangularShape,然後根據您希望得到多麼準確,您可以減去曲率的計算。

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

+0

我不知道這將如何解決我的問題。我只想要盒子的絕對座標,而不是每個像素的絕對座標。所以相同的參數,但物理位置不合邏輯。 – 2011-03-05 14:32:40

+0

你可以使用像我這樣鏈接的方法:g2.getCenterX(),g2.getMaxX()。如果你的周邊矩形的座標系是例如-1到1嘗試將這些方法給出的值乘以周圍矩形已除以2的像素數。 – 2011-03-05 14:40:33

0

如果您創建的橢圓

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

對於x g2.getTransform().getTranslateX() + ellipse.getX()

和y的參考g2.getTransform().getTranslateY() + ellipse.getY()

+0

不,那不是解決方案。我需要翻譯後的座標。否則,我只得到1,但正確的將是440x444或任何絕對座標。 – 2011-03-05 14:28:40

+0

@Jeny編輯!你可以試試這個嗎? – 2011-03-05 14:36:24

+0

這對於旋轉更復雜的變換不起作用... – dacwe 2011-03-05 14:51:07

2

獲取AffineTransformGraphics2D對象並使用transform(src, dst)方法轉到屏幕座標(您可以對任何點執行此操作)。如果你想要橢圓的路徑,你可以使用Ellipse2D.getPathIterator(AffineTransform at) - 它返回PathIterator

此示例獲取屏幕上的橢圓的中心點:

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

很酷。好主意啊!作品。謝謝。 PS:「Point2D screenPoint = at.transform(c,null);」可能會好一點。 – 2011-03-05 15:01:22

+0

@Jeny Jeppesen:Yepp!隨便你怎麼做! :) – dacwe 2011-03-05 16:01:01