2D-Grafik Bild in Richtung Maus drehen

Lastone

Mitglied
Hallo zusammen,

Ich habe ein Problem und zwar will ich dass wenn ich mit der Maus in mein Panel klicke das Bild dort hin zeigt.

Ich probiere das momentan mit Graphics2D (rotate).

Momentan habe ich:
Java:
 public void Mouseleft(MouseEvent e) {
    			
    	if (e.getButton() == MouseEvent.BUTTON1) {
    		
    		Xl = e.getX();
    		Yl = e.getY();
    		
    		
    		
    	    xturret = (pictankturret.getIconWidth() / 2);
    	    yturret = (pictankturret.getIconHeight() / 2);
    	    
    	    float xDistance = Xl - xturret;
    	    float yDistance = Yl - yturret;
    	    rotationAngle = (Math.atan2(yDistance, xDistance));

und im paint:

Java:
public void paint(Graphics g) {
        super.paint(g);

        Graphics2D g2d = (Graphics2D)g;
        
        
        // turret zeichnen
        g2d.rotate(tank.getrotationAngle());
        g2d.drawImage(tank.getImage2(),250,250, this);
        
        Toolkit.getDefaultToolkit().sync();
        g.dispose();
    }

aber irgendwie funktioniert das mit dem drehen so gar nicht...
Das Bild soll ja auf der stelle gegen den Mauszeiger drehen.

Vielen Dank schon im vorraus.
Freundliche Grüsse
Lastone
 
Da ich bis jetzt leider immernoch keine Antwort erhalten habe und ich leider auch noch keine Lösung habe, pushe ich hier nochmals...
Bin um jede Hilfe dankbar.
MLG
 
Ich konnte es nun ein bisschen anpassen jedoch tritt noch immer nicht der gewünschte effekt auf... ich glaube ich berechne irgendwas falsch oder zeichne das anschliesend falsch... es wird einfach nicht um den gewünschten Winkel gedreht.

code:
Java:
  //Mouse-Listener Linksclick!
    public void Mouseleft(MouseEvent e) {
    			
    	
    	if (e.getButton() == MouseEvent.BUTTON1) {
    		
    		Xl = e.getX();
    		Yl = e.getY();
    		
    	    
    	    float xDistance = Xl - xturret;
    	    float yDistance = Yl - yturret;
    	    rotationAngle = Math.toDegrees((Math.atan2(yDistance, xDistance)));
    	    
    			// Left-click -> position-outprint!
    			System.out.println("Left-click - X:" + Xl + " Y:" + Yl);
    			System.out.println(rotationAngle);
    			
    			// Drehen des turrets.
    	        tx.rotate(Math.toRadians(rotationAngle), xturret, yturret);
    			
    	}	
    	}

und natürlich:

Java:
	public void paint(Graphics g) {
        super.paint(g);
   // turret zeichnen
        g2d.drawImage(tank.getImage2(), tank.rotateTurret(), this);
        
        Toolkit.getDefaultToolkit().sync();
        g2d.dispose();
    }

wobei "tank.rotateTurret()" natürlich das tx(AffineTransform) ist.
 
Also als erstes ist
Code:
paint(Graphics g)
ganz schlecht, da das unter Umständen auch das zeichnen des JFrames beeinflussen kann. Besser ist da
Code:
paintComponent(Graphics g)
. Das aber nur am Rande.

Hast du keine Screenshots, die das etwas besser illustrieren, wie sich das Bild falsch dreht ?
 
Zuletzt bearbeitet:
okay vielen dank für den tipp mit der Paintmethode werde ich somit auch noch anpassen...

für mein "rotateproblem" habe ich nun einen Screenshot angehängt (hoffe lässt sich öffnen).

Beim Kreuz habe ich halt einfach einmal geklickt und die Drehung ist (wie man sieht) minimal.

Die Ausgangsposition bleibt also das bild selbst bewegt sich nicht nur halt der Drehungswinkel stimmt nicht!
 

Anhänge

  • Beispiel.jpg
    Beispiel.jpg
    29,4 KB · Aufrufe: 38
Zuletzt bearbeitet:
Ah super! Das hilft schon weiter! 😉
Was bringt dir denn
Code:
rotationAngle
? Stimmt dieser Wert?
Mir scheint es so, als habe sich das Bild um die Hälfte gedreht, oder um ein Drittel? Was passiert bei einem weiteren Klicken auf der gleichen Position?
Außerdem, wieso konvertierst du einmal den Winkel von Radian in Grad und dann wieder in Radian? Nur für den Output oder?

[EDIT][TIPP]Stackoverflow mit gleichem Problem und super Antwort![/TIPP][/EDIT]
 
Zuletzt bearbeitet:
Also bei dem Beispiel hatte ich ungefähr einen Wert von 30... was auch stimmt das bild dreht sich ja etwa um diese 30... aber es sollten ja weitaus mehr sein (schätzungweise 60-80?!)

Wenn ich erneut auf dieselbe Position klicke dreht es sich (natürlich wie erwartet) erneut um diese 30.

Ja das mit dem Konvertieren war nur für den Output gedacht (damit ich sehe was da falsch läuft! 😉)

Daraus schliesse ich halt das was mit der Berechnung meines "rotationAngle" nicht stimmen muss!?

P.s danke für den Link habe ich auch schon gefunden --> war leider nur wenig aufschlussreich für mich( ich rechne es ziemlich genauso wie dort wie du vielleicht gesehen hast:bahnhof🙂
 
Zuletzt bearbeitet:
Ja genau, ich würde es mal direkt mit
Code:
rotationAngle =Math.atan2(yturret - Yl, xturret - Xl) - Math.PI /2;
versuchen!

PS: Ja dachte ich mir, allerdings hast du ein Minuszeichen und ein
Code:
+180
vergessen, das wirft das ganze dann doch ein wenig aus der Bahn 😉
 
Zuletzt bearbeitet:
Kommt der Sache schon ein bisschen näher!

Nur wie du siehst stimmt es leider immernoch nicht ganz.... :S

code:

Java:
    	    rotationAngle = Math.toDegrees(Math.atan2(yturret - Yl, xturret - Xl) - Math.PI / 2);
 

Anhänge

  • Beispiel2.jpg
    Beispiel2.jpg
    32,8 KB · Aufrufe: 31
Zuletzt bearbeitet:
Es darf nicht in Grad sein, das weißt du nicht wahr? 😉
Diese Zeile war hoffentlich nur, um die Grad auszugeben 😉

Hast du denn genau die Position der Mitte des Bildes? Mir scheint es, als ob du die linke obere Ecke benutzt 😉 vielleicht +5 px jeweils?
 
ist nur zur Ausgabe gedacht, rechne es anschliessend ja wieder um in radiant 🙂 und ja das AffineForm verlangt ja einen Wert in radiant


noch zur bestätigung 😉 :
Java:
    	    rotationAngle = Math.toDegrees(Math.atan2(yturret - Yl, xturret - Xl) - Math.PI / 2);
    	    
    			// Left-click -> position-outprint!
    			System.out.println("Left-click - X:" + Xl + " Y:" + Yl);
    			System.out.println(rotationAngle);
    			
    			// Drehen des turrets.
    	        tx.rotate(Math.toRadians(rotationAngle), xturret, yturret);

sollte eigentlich die mitte vom bild haben :
Java:
   private int xturret = (pictankturret.getIconWidth() / 2);
   private int yturret = (pictankturret.getIconHeight() / 2);
 
Eigentlich dürfte die Umwandlung allein nicht so einen großen Unterscheid hervorrufen...

Aber die Position ist doch:
Code:
xturret= pictankturret.getIconWidth()/2 + pictankturret.getPosition().x
oder? 😉
 
Sorry die Methode gibt es ja gar nicht 😉 Nein ich meine einmal, die Position, von der an, das Icon gemalt wird und dann muss man da noch die Hälfte der Breite des Icons hinzufügen, um das Zentrum des Icons zu haben!
 
ach ich dachte schon ich habe da irgendwas verpassst! :lol:

nunja also ich habe hier für die position(nur testhalber halt irgendwo im panel):
Java:
  AffineTransform tx = AffineTransform.getTranslateInstance(250, 250);

ist halt die position wo es anschliessend gezeichnet wird.
Wie meinst du nun soll ich mein "xturret" und "yturret" anpassen?
 
dann wirds unschön sobald ich das teste 😳
es verschwindet nämlich irgendwo im nirgendwo sobald ich reinklicke😉

aber ich habe nun was anderes getestet was bis anhin funktioniert! (natürlich nur beim ersten Klick) 😱
wenn ich nähmlich:
Java:
   AffineTransform tx = AffineTransform.getTranslateInstance(0, 0);
auf 0 setze (also oben links in der Ecke) funktioniert es. (siehe Screenshot)
 

Anhänge

  • Beispiel3.png
    Beispiel3.png
    38,3 KB · Aufrufe: 31
Zuletzt bearbeitet:
Achja klar hattest ja recht!:toll:

Hatte nun die Erleuchtung :idea:

Java:
    	    rotationAngle = Math.toDegrees(Math.atan2(yturret - Yl + 250, xturret - Xl + 250) - Math.PI / 2);

muss man natürlich hier noch jeweils die 250 dazurechnen sonst stimmt ja die Achse nicht mehr überein!
(Resultat in Anhang)

Jetzt wartet noch ein bisschen mehr Mathe auf mich :bae:
soll sich ja auch beim 2 Klick nochmals korrekt drehen 😉 und muss ja noch auf mein kleines "Pänzerchen" gezeichnet werden.

Aber vielen Dank für deine Mühe und Aufwand! 🙂

Melde mich wieder wenn das nächste Problem vor der Tür steht
 

Anhänge

  • Beispiel4.jpg
    Beispiel4.jpg
    21,6 KB · Aufrufe: 28

Neue Themen


Zurück
Oben