2017-12-06 5 views
2

Wie würde man das Mauskoordinatensystem drehen, wenn eine Drehung auf ein Canvas angewendet wird? Wenn ich den Canvas-Bereich rotiere, bleibt die Maus relativ zu den gedrehten Komponenten in der gleichen Position. Ich möchte, dass die Mauskoordinaten die Drehung der Komponente berücksichtigen, anstatt dass die Koordinaten die Position relativ zum Fenster sind, ohne Berücksichtigung der Drehung.Wie wird die Mausposition relativ zum Bildschirm beibehalten und die Komponentenrotation ignoriert?

Ich habe ein Bild zur Verfügung gestellt, um mehr von dem zu illustrieren, was ich bekomme. Die schwarze Box stellt eine Form als Referenz dar und die violette Box liegt auf den Mauskoordinaten. Rotation example image

ganz links Bild - Nicht rotierte Leinwand Bild Mitte - gedrehter Leinwand als Java es Ganz rechts Bild sieht - Gewünschtes Ergebnis

Mein Beispielcode ein Canvas simuliert, die durch Drücken der linken oder rechten Pfeiltasten dreht. Diese Simulation zeigt, dass die Maus relativ zu den gedrehten Komponenten relativ zu meiner Maus auf dem Bildschirm verbleibt.

Gibt es eine Möglichkeit, diese neuen Koordinaten zu transformieren oder zu berechnen (in der Abbildung ganz rechts gezeigt), so dass sie unabhängig von der Drehung auf meiner Maus im Fenster einrasten?

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'? Die Berechnung der neuen Position des violetten Quadrats ist eine einfache geometrische Koordinatentransformation, und dann bewegen Sie die Maus zu den neuen Koordinaten. Die Koordinatentransformation ist eine reine Geometriefrage, die nicht mit der Programmierung zusammenhängt, und Referenzinformationen sind an vielen Stellen im Web verfügbar. –

+0

@JimGarrison Ich habe versucht, einen Basisroboter zu implementieren, aber ich endete mit den gleichen Ergebnissen. Irgendeine Idee, wie ich das mit einem Roboter machen könnte? Ich bin ziemlich neu dafür, Entschuldigung –

Antwort

3

Die Mausposition wird absolut angegeben, aber die Boxzeichnung ist nach der Transformation. Sie müssen die umgekehrte Transformation für die Mausposition durchführen, um sie zum Zeiger zurück zu bringen.

 //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); 
     } 
Verwandte Themen