# Rotation einer Grafik in swing



## Maxim6394 (9. Nov 2011)

ich hab die position einer grafik, die sich auch ändert und ich hab die position des cursors im swing fenster.
jetzt will ich diese grafik rotieren, dass sie immer zur position des cursors zeigt. ich glaub das hat mehr mit mathe zu tun aber vieleicht gibts da ein par tricks. hat jemand eine idee?


----------



## Michael... (9. Nov 2011)

grundsätzlich müsste man dazu die Graphik selbst zeichnen. Ist das Vorgehen dazu bekannt? von JComponent erben, deren paintComponent(Graphics g) überschreiben...
Dann kann man per MouseMotionListener an der Komponente die Maus "verfolgen",den Winkel zwischen Objekt und Mausposition berechnen und die Graphik entsprechend ausrichten.

Ähnlich (hier wird erst beim MouseKlick ausgerichtet und gezeichnet) aber eventuell zur Erläuterung zu komplex:
http://www.java-forum.org/java-basics-anfaenger-themen/123667-blitze-linien-zeichnen.html#post800160


----------



## bERt0r (9. Nov 2011)

JavaReference.com : Java, J2EE, Examples, Articles, Forum, Books, News : Example -> Rotating image using Java 2D AffineTransform class


----------



## Maxim6394 (9. Nov 2011)

bERt0r hat gesagt.:


> JavaReference.com : Java, J2EE, Examples, Articles, Forum, Books, News : Example -> Rotating image using Java 2D AffineTransform class



mein browser crasht bei dem link.

ich vermute jetzt dass ich mit dem tangens richtig den winkel berechnen kann. ich schaff aber irgendwie nicht es anzuwenden. ich dachte mit Math.atan() bekommt man den winkel in grad aus einem tangens wert, bei mir kommen aber nur zahlen raus die immer kleiner sind als 2.


----------



## Marco13 (9. Nov 2011)

Wenn du ein KSKB posten würdest, hättest du mit dem http://www.java-forum.org/java-basics-anfaenger-themen/126389-grafik-rotieren.html schon jetzt kein Problem mehr.


----------



## Maxim6394 (9. Nov 2011)

der code ist zu unübersichtlich und durcheinander um ihn komplett wegen diesem einen problem zu posten, aber hier ist das wichtigste:


```
public void paint(Graphics g)
{
	super.paint(g);
	
	int gk=p.getX()-P.x;
	int ak=p.getY()-P.y;
	double tan=(double)ak/(double)gk; 

	g.drawRect(P.x,P.y,5,5);
	g.drawLine(p.getX(),p.getY(),P.x,P.y);


...


 pRotation=(float)Math.pow(tan,-1);
    g2d2.rotate(Math.toRadians(pRotation),p.getX()+p.getBounds().width/2,p.getY()+p.getBounds().height/2);
	g2d2.drawImage(p.getImg(),p.getX(),p.getY(),null);
}
```

das drawrect und drawline dient nur zur hilfe und hat sonst keine bedeutung. P ist der testpunkt, zu dem sich das bild drehen soll. p ist das spielerobjekt.

die linie zeigt immer richtig vom bild zu dem testpunkt, die rotation sieht aber absolut falsch aus.


----------



## Michael... (9. Nov 2011)

Maxim6394 hat gesagt.:


> die linie zeigt immer richtig vom bild zu dem testpunkt, die rotation sieht aber absolut falsch aus.


Die Linie wird ja auch direkt zum Punkt gezeichnet, während der Rotationswinkel falsch berechnet wird ==> einfach mal per System.out.println(...) ausgeben lassen.

Hinweis der Arkustangens ist nicht gleich 1/Tangens bzw. Tangens^-1 auch wenn er manchmal tan^-1 geschrieben wird.


----------



## Marco13 (9. Nov 2011)

Den Winkel kann man auch recht leicht mit Math (Java Platform SE 6) ausrechnen.


----------



## Maxim6394 (10. Nov 2011)

ich versteh immernoch nicht wie ich diesen winkel berechnen soll. ich gebe die ganze zeit alles aus was da berechnet wird aber es ist nie das richtige. hat keiner ne lösung?
in mathe ging das früher so dass man nur gekenkathete/ankathete rechnen musste und um aus dem tangens wert wieder den winkel zu kriegen tan^-1 benutzen.
ich teile ja gegenkathete durch ankathete um den tangens zu kriegen, trotzdem kommt mit atan() immer nur irgendwas falsches raus.

das bild rotiert niemals richtig dass es immer zu diesem einen punkt zeigt. es rotiert zum beispiel duzende male wenn ich es nur nach unten bewege, aber es sollte überhaupt nicht rotieren wenn es genau unter dem punkt ist.


----------



## Michael... (10. Nov 2011)

Maxim6394 hat gesagt.:


> ich versteh immernoch nicht wie ich diesen winkel berechnen soll.


Marco hat doch die einfachste Art gepostet: Math.atan2(int y, int x). Dieser Methode muss man nur die richtigen Werte übergeben und beachten das 0° bei 12 Uhr ist und der Winkel sich im Uhrzeigersinn vergrößert.


Maxim6394 hat gesagt.:


> in mathe ging das früher so dass man nur gekenkathete/ankathete rechnen musste und um aus dem tangens wert wieder den winkel zu kriegen tan^-1 benutzen.


Dann ist Dir hoffentlich auch noch in Erinnerung geblieben, dass abhängig davon in welchem Quadranten man sich befindet der erhaltene Wert korrigiert translatiert werden muss.

Nur um sicher zu gehen: Wie erwähnt ist das Kürzel tan^-1 nicht das selbe wie Tangenswert^-1, daher findet ich diese Schreibweise nicht gerade schön.


----------



## Maxim6394 (10. Nov 2011)

ich verstehe aber nicht welcher x und y wert übergeben werden soll. man braucht doch zum berechnen 2 punkte, also 2 mal x und 2 mal y.


----------



## Michael... (10. Nov 2011)

Maxim6394 hat gesagt.:


> ich verstehe aber nicht welcher x und y wert übergeben werden soll. man braucht doch zum berechnen 2 punkte, also 2 mal x und 2 mal y.


Die Methode geht vom Winkel eines beliebigen Punktes zu (0,0) aus. Wenn Dein Bezugspunkt nicht der Koordinatenursprung ist musst Du hier das Delta zu Deinem Bezugspunkt angeben.


----------



## Maxim6394 (10. Nov 2011)

und wie soll ich das machen? das ding nimmt doch scheinbar nur 2 parameter an, wie soll ich also den winkel zu einem anderen punkt als 0|0 berechnen lassen?

soll das so aussehen?

```
tan=Math.atan2(P.x-p.getX(), P.y-p.getY());
```

P ist der bezugspunkt zu dem sich die grafik drehen soll, p ist die position der grafik.

ich habs jetzt endlich. die rotation war anfangs immernoch nicht korrekt. rechts und links von dem bezugspunkt hat sich die grafik richtig gedreht, ober und unterhalb aber genau in die falsche richtung.
wenn ich -tan statt tan benutze dann rotiert es richtig zum bezugspunkt, aber immer um 180 grad in die andere richtung, weis der teufel wieso.
habs jetzt so gelöst:

```
-tan+Math.toRadians(180)
```


----------



## Michael... (10. Nov 2011)

steht doch in meinem letzten Post du musst das Delta also die Differenz der zwei y und die Differenz der zwei x Werte nehmen.
Musst mich bzgl. meiner 0 Grad Ausrichtung korrigieren - hatte da wohl was falch in Erinnerung.
Um das ganze abzukürzen hier ein Bsp.:

```
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class MouseFollowDemo extends JFrame {
	private double orientation;
	private int distance;
	private Point m;
	
	public MouseFollowDemo() {
		orientation = 0;
		distance = 100;
		m = new Point(200, 200);
		final JPanel panel = new JPanel() {
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				Graphics2D g2 = (Graphics2D)g.create();
				g2.drawRect(m.x-5, m.y-5, 10, 10);
				g2.translate(m.x, m.y);
				g2.drawString((int)Math.toDegrees(orientation) + "°", 10, 10);
				g2.rotate(orientation);
				g2.drawLine(0, 0, distance, 0);
				g2.dispose();
			}
		};
		panel.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseMoved(MouseEvent e) {
				int dx = e.getX()-m.x;
				int dy = e.getY()- m.y;
				orientation = Math.atan2(dy, dx);
				distance = (int)Math.sqrt(dx*dx+dy*dy);
				panel.repaint();
			}
		});
		add(panel);
	}
	
	public static void main(String[] args) {
		JFrame frame = new MouseFollowDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
```


----------

