Hab sogar schon überlegt das in irgendein Mathe-Forum zu posten, aber versuchs erstmal hier…
Habe nen Programm, das mir Bilder anzeigt. Wollte nun drehen einbauen und hab jedes Bild erstmal hardcodiert auf 90° Drehung. Das zeichnen funktioniert auch problemlos, nur… Die Berechnungen danach, mit denen man das bild umherschieben kann stimmen nun ja nicht mehr, da das ganze Koordinatensystem gedreht wurde. Nun heißts da also den Winkel in die Berechnungen einzubeziehen und da haperts ganz gehörig… Meine Winkelberechnungszeiten im koordinatensystem sind schon was her, hab mir daher die Formeln ausem Netz gezogen:
http://puu.sh/xoh1W/8a52d211fc.png
Hab dann diese versucht einzubauen und scheitere komplett…
Hier die Code-Ausschnitte:
private int computeCoordinate(boolean newX, int x, int y, int degree) {
return newX ? (int) Math.round(x * Math.cos(degree) - y * Math.sin(degree)) : (int) Math.round(x * Math.sin(degree) + y * Math.cos(degree));
// return newX ? x : y;
}
bzw der Mouselistener komplett mit Aufruf der Methode:
//Framelistener
MouseAdapter adapter = new MouseAdapter() {
private boolean firstPress = false;
private Point loc;
private int pressedButton = MouseEvent.NOBUTTON;
@Override
public void mousePressed(MouseEvent e) {
switch (pressedButton = e.getButton()) {
case MouseEvent.BUTTON1:
if (!firstPress) {
firstPress = true;
int mouseX = e.getX(), mouseY = e.getY();
// mouseX = computeCoordinate(true, mouseX, mouseY, imgCmp.getRotationDegree());
// mouseY = computeCoordinate(false, mouseX, mouseY, imgCmp.getRotationDegree());
loc = new Point(mouseX, mouseY);
System.out.println(loc);
}
break;
case 4:
prevButton.doClick();
break;
case 5:
nextButton.doClick();
break;
default:
break;
}
}
@Override
public void mouseReleased(MouseEvent e) {
firstPress = false;
}
@Override
public void mouseDragged(MouseEvent e) {
if (loc != null && pressedButton == MouseEvent.BUTTON1) {
int mouseX = e.getX(), mouseY = e.getY();
mouseX = computeCoordinate(true, mouseX, mouseY, imgCmp.getRotationDegree());
mouseY = computeCoordinate(false, mouseX, mouseY, imgCmp.getRotationDegree());
int movedX = loc.x - mouseX;
int movedY = loc.y - mouseY;
int newCurrX = imgCmp.getCurrX() - movedX;
int newCurrY = imgCmp.getCurrY() - movedY;
System.out.println("NewX1: " + newCurrX + "; NewY1: " + newCurrY);
newCurrX = computeCoordinate(true, newCurrX, newCurrY, imgCmp.getRotationDegree());
newCurrY = computeCoordinate(false, newCurrX, newCurrY, imgCmp.getRotationDegree());
System.out.println("NewX2: " + newCurrX + "; NewY2: " + newCurrY);
System.out.println(imgCmp.getRotationDegree());
imgCmp.setCurrX(newCurrX);
imgCmp.setCurrY(newCurrY);
imgCmp.repaint();
loc.x = e.getX();
loc.y = e.getY();
}
}
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int hBef = imgCmp.getCurrH();
int wBef = imgCmp.getCurrW();
imgCmp.setScaleFactor(imgCmp.getScaleFactor() - (e.getUnitsToScroll() / 100.0));
imgCmp.repaint();
imgCmp.computeCurrWAndH();
imgCmp.setCurrX(imgCmp.getCurrX() - (imgCmp.getCurrW() - wBef) / 2);
imgCmp.setCurrY(imgCmp.getCurrY() - (imgCmp.getCurrH() - hBef) / 2);
scaleTextField.setText("" + Math.round(imgCmp.getScaleFactor() * 100.0));
}
private int computeCoordinate(boolean newX, int x, int y, int degree) {
return newX ? (int) Math.round(x * Math.cos(degree) - y * Math.sin(degree)) : (int) Math.round(x * Math.sin(degree) + y * Math.cos(degree));
// return newX ? x : y;
}
};
Wenn ich die Berechnungen so lasse, schauen die Ergebnisse ganz schnell so aus:
java.awt.Point[x=966,y=556]
NewX1: -1288; NewY1: -1599
NewX2: 2007; NewY2: 2511
90
NewX1: 115; NewY1: 876
NewX2: -835; NewY2: -1139
90
NewX1: -2722; NewY1: -2772
NewX2: 3698; NewY2: 4548
90
NewX1: 1815; NewY1: 2916
NewX2: -3420; NewY2: -4364
etc
Hab schon mehrmals versucht mit den Vorzeichen rumzuspielen, aber… Es geht einfach ncih. Wer von euch mit ner Lösung parat? Versuchs solange weiter bzw. suche nach anderen Formeln