转换后如何获得绝对坐标

时间:2011-03-05 14:17:04

标签: java java-2d

我正在绘制这样的Java 2D:

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

现在我想在我的场景上打开椭圆的坐标。知道如何获得它吗?所以我需要从逻辑空间到物理空间的转换。

3 个答案:

答案 0 :(得分:2)

AffineTransform对象获取Graphics2D并使用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);
}

答案 1 :(得分:0)

它很简单,有很多方法,但是你在Ellipse2D中找不到它们。

您可以使用其父RectangularShape,然后根据您希望的精确度,您可以减去曲率的计算。

  

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

答案 2 :(得分: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()