Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 变换后如何得到绝对坐标_Java_Java 2d - Fatal编程技术网

Java 变换后如何得到绝对坐标

Java 变换后如何得到绝对坐标,java,java-2d,Java,Java 2d,我在画Java 2D的东西,像这样: g2.translate( getWidth() / 2, getHeight() / 2 ); g2.rotate( angle ); g2.draw( new Ellipse2D.Double( -1, -1, 1, 1 ) ); 现在我想知道椭圆在我的圆上的坐标。知道怎么弄吗?所以我需要从逻辑空间到物理空间的转换。这很简单,有很多方法,但是在Ellipse2D中找不到它们 您可以使用其父矩形形状,然后根据您希望它的精度,可以减去曲率 如果创建对椭圆

我在画Java 2D的东西,像这样:

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

现在我想知道椭圆在我的圆上的坐标。知道怎么弄吗?所以我需要从逻辑空间到物理空间的转换。

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

您可以使用其父矩形形状,然后根据您希望它的精度,可以减去曲率


如果创建对椭圆的引用

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()

从对象获取坐标并使用该方法转到屏幕坐标(可以对任何点执行此操作)。如果您想要椭圆的路径,您可以使用-它返回一个

此示例获取屏幕上椭圆的中心点:

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,但正确的是440x444或任何绝对坐标。@Jeny编辑!你能试试这个吗?我不知道这将如何解决我的问题。我只需要盒子的绝对坐标,而不是每个像素的绝对坐标。因此,相同的参数,但在物理位置上不符合逻辑。您可以使用我链接的一侧的方法,如:g2.getCenterX(),g2.getMaxX()。如果周围矩形的坐标系为-1:1,请尝试将这些方法给出的值乘以周围矩形的像素数除以2.5。好主意!作品谢谢PS:“Point2D screenPoint=at.transform(c,null);”可能会更好一些。@Jeny Jeppesen:是的!随你的便!:)