Image nach MausMotion rotieren

Syny

Mitglied
Hallo Leute,

ich hatte vor ein Bild je nachdem wie der Mauszeiger steht zu rotieren, um genau zu sein soll die rechte Mitte des Bildes immer Richtung des Mauszeigers zeigen solange dieser im JFrame ist. Habe nun versucht immer den Winkel berechnen zu lassen mit ( arctan((y2 - y1)/(x2 - x1))) )wobei x1,y1 der Punkt auf dem Bild und x2,y2 der Punkt der Mauszeigerposition ist. Dies habe ich dann mit Math.toDegrees umgeformt um damit
später die Graphics Komponente zu drehen.

Und hier entsteht nun wahrscheinlich das Problem.
Java:
private void drawPlayer(Graphics2D g){
		rota = player.getRotation();
		double newRota= old-rota;
		BufferedImage blankCanvas = new BufferedImage(player.getLook().getWidth(),player.getLook().getHeight(),BufferedImage.TYPE_INT_ARGB);
		g.rotate(newRota,player.f_PosX+(player.getLook().getWidth())/2,player.f_PosY+(player.getLook().getHeight())/2);
		g.drawImage(player.getLook(),(int)player.f_PosX,(int)player.f_PosY,null);															
		old = rota;
		
	}
Die getRotation Methode gibt folgendes zurück:
Java:
return(Math.toDegrees(Math.tanh(((f_yPointer-(f_PosY+(getLook().getHeight()))/2))/((f_xPointer-(f_PosX+(getLook().getWidth())))))));

Also drehen tut es sich schon beim bewegen des Mauszeigers nur einfach nicht in die Richtung von diesem. Ich weiß nicht wie ich das umsetzen soll ich muss ja bei jedem zeichnen die Rotation berechnen die die Differenz von der neuen Mausposition zur Alten beschreibt.

Hat da jemand eine Idee bzw. kennt eine andere Methode?

MFG Syny

PS: Hoffe mein Anliegen ist einigermaßen Verständlich 🙂
 
Bin mir nicht sicher was du genau willst, aber:

1. Jedes JPanel / JFrame hat eine paintComponent() Methode die man beim zeichnen in das jeweilige JPanel überschreibt ! Da drin malst du deinen Kram hin. Bei dir scheint es die drawPlayer Methode zu sein - die kann von Java nicht automatisch updated werden !


2. Du brauchst dann die Rotation als Klassenvariable, im MotionListener berechnest du diese Variable immer neu. Ganz zum Schluss kommt ein repaint() hin, das ruft automatisch die paintComponent() methode aufs neue auf und lässt den inhalt neu zeichnen !

3. In der painComoponent Methode benutzt zu diese Variable um die Drehung darzustellen.

-------

Alternativ:
Jedes JFrame, JPanel etc. hat diese paintMethode in sich. Wenn du nun direkt im ActionListener zeichnen willst, dann benutzt du das Objekt (JPanel bla) in dem gezeichnet werden soll mit bla.getGraphics().drawRectangle.....

Ist der ActionListener im Panel implementiert in dem auch gezeichnet wird (class bla extends JPanel), ist es this.getGraphics() was dir das Graphics2D Objekt vom JPanel zurück gibt, auf dass du dann außerhalb der paintComponent() Methode zugreifen und reinmalen kannst.
 
Zuletzt bearbeitet:
Aiaiai,

so viel Nichtwissen in einem Post hab' ich schon lang nichtmehr gesehen dcc.

Ein JFrame hat keine paintComponent.
getGraphics() sollte man, wenn man passive rendering betreiben möchte nicht verwenden.
und falls man active rendering betreiben möchte, muss man andere Dinge beachten.

der TO hat offensichtlich nicht mit Swing, sondern mit der Mathematik die dahintersteckt, Probleme.

Ich hab' dem TO mal ne private Nachricht geschrieben, die das Problem mit der AffineTransform-Klasse löst.
 
Uiuiui,

zuerst mal danke für die Antworten und die PN werde mir die gleich mal durchlesen. Aber ja mir ging es einzig und allein um die Mathematik dahinter daher wollte ich auch nicht den ganzen Code posten.
1. Jedes JPanel / JFrame hat eine paintComponent() Methode die man beim zeichnen in das jeweilige JPanel überschreibt ! Da drin malst du deinen Kram hin. Bei dir scheint es die drawPlayer Methode zu sein - die kann von Java nicht automatisch updated werden !

Die wird natürlich mit jedem Durchlauf neu geupdated es bewegt sich ja nur nicht in die richtige Richtung 🙂

2. Du brauchst dann die Rotation als Klassenvariable, im MotionListener berechnest du diese Variable immer neu. Ganz zum Schluss kommt ein repaint() hin, das ruft automatisch die paintComponent() methode aufs neue auf und lässt den inhalt neu zeichnen !

Die x und y variable wo der Mauszeiger sich gerade befindet wird auch mit jedem Durchlauf neu übergeben habe mir den auch schon ausgeben lassen das stimmt soweit.

3. In der painComoponent Methode benutzt zu diese Variable um die Drehung darzustellen.

Ja da liegt das eigentliche Problem die Berechnung um wie viel es sich drehen muss stimmt wohl nicht 🙂


MFG Syny
 
Aiaiai,

so viel Nichtwissen in einem Post hab' ich schon lang nichtmehr gesehen dcc.

Ein JFrame hat keine paintComponent.
getGraphics() sollte man, wenn man passive rendering betreiben möchte nicht verwenden.
und falls man active rendering betreiben möchte, muss man andere Dinge beachten.

der TO hat offensichtlich nicht mit Swing, sondern mit der Mathematik die dahintersteckt, Probleme.

Ich hab' dem TO mal ne private Nachricht geschrieben, die das Problem mit der AffineTransform-Klasse löst.

Was ein Blödsinn du redest und dann auch noch andere des Unwissens bezichtigen !
Schau dir die API genauer an. Man kann definitiv auf JFrame plotten und dessen paint Methoden überschreiben, allerdings muss diese evntl manuell aufgerufen werden (bei Swing).

Das Teil erbt schließlich auch von java.awt.Container !
Und wieso schreibst PMs, lass die Leute doch sehen was du erzählst :x

Das hier zeichnet jedenfalls wunderbar auf JFrame.

Java:
package test;

import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;

public class Test extends JFrame {

	Test() {
		setPreferredSize(new Dimension(500, 500));
		setVisible(true);
		pack();
	}

	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawRect(0, 0, 50, 50);
	}

	public static void main(String[] args) {
		Test t = new Test();
	}
}
 
Zuletzt bearbeitet:
Also es gibt da grundsätzlich zwei verschiedene Wege um diese Rotation zu verwirklichen.

1. per Trigonometrie. Das bedeutet in diesem Fall mit Math.atan2 (nicht Math.atan!) den Winkel berechnen und damit dann rotieren.
2. eine Rotationsmatrix direkt aus den Koordinaten berechnen und die dann dem Konstruktor von AffineTransform übergeben. (d.h. Mausposition - Rotationszentrum, das Ergebnis normalisieren und dann new AffineTransform(x, y, -y, x, 0, 0))
 
Was ein Blödsinn du redest und dann auch noch andere des Unwissens bezichtigen !
Schau dir die API genauer an. Man kann definitiv auf JFrame plotten und dessen paint Methoden überschreiben, allerdings muss diese evntl manuell aufgerufen werden (bei Swing).

Das Teil erbt schließlich auch von java.awt.Container !
Und wieso schreibst PMs, lass die Leute doch sehen was du erzählst :x

Natürlich kann man paint(Graphics g) auf einem JFrame überschreiben. Hier hast du nur zwei Probleme:

1. ist paint != paintComponent (Wie du oben Behauptet hast)
2. sollte man diese nicht überschreiben, da man dann über Komponenten zeichnet.

Und warum ich hier keinen Quellcode poste liegt wohl an http://tinyurl.com/onsowkh .
 

Neue Themen


Zurück
Oben