2017-12-06 27 views
2

회전이 Canvas에 적용될 때 마우스 좌표계를 회전시키는 방법은 무엇입니까? 캔버스를 회전하면 마우스가 회전 된 구성 요소와 동일한 위치에 유지됩니다. 나는 마우스 좌표가 회전을 고려하지 않고 좌표를 창에 상대적인 위치 대신 구성 요소의 회전을 고려하도록하고 싶습니다.화면에 상대적으로 마우스 위치를 유지하고 구성 요소 회전을 무시하는 방법은 무엇입니까?

나는 내가 무엇을 얻고 있는지 더 설명하기 위해 그림을 제공했다. 검은 색 상자는 참조 용 모양을 나타내고 자주색 상자는 마우스 좌표에 있습니다. Rotation example image

왼쪽 사진 - 회전되지 않은 캔버스 중동 그림 - 회전 캔버스 자바가 보는대로 맨 오른쪽 사진 - 내 예제 코드가 왼쪽 또는 오른쪽 화살표 키를 눌러 회전하는 캔버스를 시뮬레이션

원하는 결과. 이 시뮬레이션은 마우스가 화면상의 마우스를 기준으로하는 것이 아니라 회전 된 구성 요소를 기준으로 한 위치에 머무르는 방식을 보여줍니다.

회전에 관계없이 창에서 내 마우스에 고정되도록 이러한 새로운 좌표 (가장 오른쪽 이미지에 표시됨)를 변환하거나 계산하는 방법이 있습니까?

package rotation; 

    import java.awt.Canvas; 
    import java.awt.Color; 
    import java.awt.Graphics; 
    import java.awt.Graphics2D; 
    import java.awt.MouseInfo; 
    import java.awt.Point; 
    import java.awt.event.KeyAdapter; 
    import java.awt.event.KeyEvent; 
    import java.awt.geom.AffineTransform; 
    import java.awt.image.BufferStrategy; 

    import javax.swing.JFrame; 

    @SuppressWarnings("serial") 
    public class RotationExample extends Canvas implements Runnable{ 

     boolean isRunning = false; 
     boolean left = false; 
     boolean right = false; 
     AffineTransform transform = new AffineTransform(); 
     double rotation = 0.0d; 

     public RotationExample() { 
      //Create jframe 
      JFrame f = new JFrame(); 
      f.setSize(500, 500); 
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      f.setResizable(false); 
      f.setUndecorated(true); 

      //Add key listener 
      this.addKeyListener(new KeyAdapter() { 
       public void keyPressed(KeyEvent e) { 
        int k = e.getKeyCode(); 
        //Set left and right variables 
        if(k == KeyEvent.VK_LEFT) left = true; 
        if(k == KeyEvent.VK_RIGHT) right = true; 
       } 

       public void keyReleased(KeyEvent e) { 
        int k = e.getKeyCode(); 
        if(k == KeyEvent.VK_LEFT) left = false; 
        if(k == KeyEvent.VK_RIGHT) right = false; 
       } 
      }); 

      f.add(this); 
      f.setVisible(true); 
      start(); 
     } 

     public void render() { 
      BufferStrategy bs = this.getBufferStrategy(); 
      if(bs == null){ 
       this.createBufferStrategy(3); 
       return; 
      } 

      Graphics g = bs.getDrawGraphics(); 
      Graphics2D gt = (Graphics2D) g; 

      gt.setTransform(transform); 

      gt.clearRect(0, 0, 500, 500); 

      //Increment rotation based on left or right variables 
      if(left) rotation += 0.001; 
      else if(right) rotation -= 0.001; 

      //Rotate around middle of frame 
      gt.rotate(rotation, 250, 250); 

      //Draw black rectangle in middle 
      gt.setColor(Color.BLACK); 
      gt.fillRect(175, 175, 150, 150); 

      //Draw red up arrow 
      gt.setColor(Color.RED); 
      gt.fillPolygon(new int[] {250, 300, 270, 270, 230, 230, 200}, new int[] {200, 250, 250, 300, 300, 250, 250}, 7); 

      //Draw rectangle at mouse coordinates 
      gt.setColor(Color.MAGENTA); 
      Point m = MouseInfo.getPointerInfo().getLocation(); 
      gt.fillRect((int) m.getX() - 8, (int) m.getY() - 8, 16, 16); 

      bs.show(); 
      gt.dispose(); 
     } 

     public static void main(String[] args) { 
      new RotationExample(); 
     } 

     public void start() { 
      isRunning = true; 
      new Thread(this).start(); 
     } 

     public void run() { 
      //Continuous rendering 
      while(isRunning) { 
       render(); 
      } 

     } 
    } 
+0

'java.awt.Robot'? 보라색 사각형의 새로운 위치를 계산하는 것은 간단한 기하학적 좌표 변환이며, 마우스를 새로운 좌표로 이동시킵니다. 좌표 변환은 프로그래밍과 관련이없는 순수한 기하학 질문이며 참조 정보는 웹에서 많은 장소에서 사용할 수 있습니다. –

+0

@JimGarrison 기본 로봇 구현을 시도했지만 동일한 결과가 발생했습니다. 내가 로봇으로 어떻게이 일을 할 수 있었는지 아는 어떤 생각? 나는 이것에 상당히 처음이다, 사과 –

답변

3

마우스 위치는 절대적으로보고되지만 상자 그림은 변형 된 것입니다. 포인터를 다시 가져 오려면 마우스 위치에 대한 역변환을 수행해야합니다.

 //Draw rectangle at mouse coordinates 
     gt.setColor(Color.MAGENTA); 
     Point m = MouseInfo.getPointerInfo().getLocation(); 
     try { 
      gt.getTransform().createInverse().transform(m, m); 
      gt.fillRect((int) m.getX() - 8, (int) m.getY() - 8, 16, 16); 
     } catch (java.awt.geom.NoninvertibleTransformException e) { 
      System.err.println(e); 
     }