後得到的絕對座標,我畫的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