后得到的绝对坐标,我画的Java 2D这样的东西:如何改造
g2.translate(getWidth()/2, getHeight()/2);
g2.rotate(angle);
g2.draw(new Ellipse2D.Double(-1, -1, 1, 1));
现在我要叩头我sceen椭圆的坐标。任何想法如何得到它?所以我需要从逻辑到物理空间的转换。
后得到的绝对坐标,我画的Java 2D这样的东西:如何改造
g2.translate(getWidth()/2, getHeight()/2);
g2.rotate(angle);
g2.draw(new Ellipse2D.Double(-1, -1, 1, 1));
现在我要叩头我sceen椭圆的坐标。任何想法如何得到它?所以我需要从逻辑到物理空间的转换。
它很容易,有很多方法,但你不会在Ellipse2D中找到它们。
您可以使用它的父级RectangularShape,然后根据您希望得到多么准确,您可以减去曲率的计算。
http://download.oracle.com/javase/1.4.2/docs/api/java/awt/geom/RectangularShape.html
如果您创建的椭圆
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()
不,那不是解决方案。我需要翻译后的坐标。否则,我只得到1,但正确的将是440x444或任何绝对坐标。 – 2011-03-05 14:28:40
@Jeny编辑!你可以试试这个吗? – 2011-03-05 14:36:24
这对于旋转更复杂的变换不起作用... – dacwe 2011-03-05 14:51:07
获取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);
}
很酷。好主意啊!作品。谢谢。 PS:“Point2D screenPoint = at.transform(c,null);”可能会好一点。 – 2011-03-05 15:01:22
@Jeny Jeppesen:Yepp!随便你怎么做! :) – dacwe 2011-03-05 16:01:01
我不知道这将如何解决我的问题。我只想要盒子的绝对坐标,而不是每个像素的绝对坐标。所以相同的参数,但物理位置不合逻辑。 – 2011-03-05 14:32:40
你可以使用像我这样链接的方法:g2.getCenterX(),g2.getMaxX()。如果你的周边矩形的坐标系是例如-1到1尝试将这些方法给出的值乘以周围矩形已除以2的像素数。 – 2011-03-05 14:40:33