2011-03-05 100 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