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();
}
}
}
'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. –
@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 –