2011-03-05 2 views
2

후 절대 좌표를 얻는 방법 :이 같은 자바 2D 물건을 그리기 오전 변환

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

지금 내 sceen에 타원의 좌표를 KOW 싶다. 어떤 아이디어로 그것을 얻는가? 그래서 논리적 공간에서 물리적 공간으로의 전환이 필요합니다.

답변

0

그것의 쉬운, 많은 방법이있다, 당신은 Ellipse2D에서 그러나 그들을 찾아 내지 않는다.

부모 RectangularShape를 사용할 수 있습니다. 그러면 원하는 정확도에 따라 곡률 계산을 뺄 수 있습니다.

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

+0

나는이 내 문제를 해결하는 방법을 모른다. 모든 픽셀이 아니라 상자의 절대 좌표를 원합니다. 그래서 같은 매개 변수지만 논리적이 아닌 물리적 위치에. –

+0

g2.getCenterX(), g2.getMaxX()와 같이 링크 된 측면의 메소드를 사용할 수 있습니다. 주변 사각형에 좌표계가있는 경우 (예 : -1에서 1까지 주변 사각형이 2로 나눈 픽셀 수를 제공하는 값을 곱하려고합니다. –

0

당신이 타원

와 y에 대한 X g2.getTransform().getTranslateX() + ellipse.getX()에 대한

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

에 대한 참조를 만들 경우 g2.getTransform().getTranslateY() + ellipse.getY()

+0

아니요 해결책이 아닙니다. 물론 번역 후 좌표가 필요합니다. 그렇지 않으면 1을 얻지 만 정확하면 440x444 또는 절대 좌표가됩니다. –

+0

@Jeny Edited! 이거해볼 수 있니? –

+0

회전이있는 복잡한 변환에는 작동하지 않습니다. – dacwe

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); 
} 
+0

차가움. 그거 좋은 생각이야! 공장. 감사. 추신 : "Point2D screenPoint = at.transform (c, null);" 조금 더 좋을지도 모릅니다. –

+0

@Jeny Jeppesen : 옙! 당신이 원하는대로하십시오! :) – dacwe