我正在绘制这样的Java 2D:
g2.translate( getWidth() / 2, getHeight() / 2 );
g2.rotate( angle );
g2.draw( new Ellipse2D.Double( -1, -1, 1, 1 ) );
现在我想在我的场景上打开椭圆的坐标。知道如何获得它吗?所以我需要从逻辑空间到物理空间的转换。
答案 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()