Rotationsalgorithmus unvollständig

Neue Frage »

Auf diesen Beitrag antworten »
Tommy1234 Rotationsalgorithmus unvollständig

Hallo,

seit längerem beschäftige ich mich mit Rotationen und kann auch schon einige Erfolge verbuchen. Allerdings komme ich bei einem Algorithmus für die Rotaion nicht weiter. Ich arbeite in Java SE.

Das Programm macht folgendes:

Es wird per JButton ein Sprite erzeugt, welches angeklickt und damit rot umrandet wird. Wenn man nun irgendwo in das JFrame klickt dreht sich das Sprite um sich selbst bis es den Winkel zwischen Maus und Sprite erreicht hat und bewegt sich zum Mauszeiger hin.(Hoffe soweit verständlich!).

Aufbau:
Im Konstruktor hab ich den Anfangswinkel mit 0 initialisiert, so dass sich dieser erst zur Laufzeit verändert. Ausserdem hab ich eine eigene Methode, die den Winkel dann zur Laufzeit berechnet und zurückgibt als Double. Der Winkel ist im Bogenmaß. Darüber hinaus habe ich noch für die vier Quadranten Anpassungen vorgenommen, dass ein vollständiger Kreis entsteht. Also von 0 bis 2 PI.

Für die Rotation nehme ich AffineTransform mit dessen Methode rotate(), die einen Winkel im Bogenmaß erwartet.

Das ganze ist in 2D und aus der Vogelperspektive.

Nun zu meinem Problem:

Ich hab mir gedacht ich nehme eine Ganzzahl und erhöhe bzw. vermindere diese um eins und übergebe diese dann der rotate-Methode. Ganzzahl deshalb, weil ich hier auf Gleichheit prüfen kann. Das Problem ist, wie decke ich alle Fälle(damit meine ich, dass die Rotation von Quadrant zu Quadrant korrekt!!! funktioniert) ab? Mein bisheriger Code deckt fast alle Fälle ab außer, wenn ich vom 4ten in den ersten will und umgekehrt, er nimmt nämlich da immer den längeren Weg.

Hier mal die Methode:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:

public double rotate(int soll){
		
		if(soll > ist){
			
				if(i==360){
					i=0;
				}
				if(i!=soll){
					i++;
				}
				else{
					ist=soll;
				}
		}
		else if(soll < ist){
			
			
				if(i==0){
					i=360;
				}
				if(i!=soll){
					i--;
				}
				else{
					ist=soll;
				}
			
		}
		
		
		
		return Math.toRadians(i);
	}







Wäre für Denkanstöße dankbar.

Gruß Tommy
 
Auf diesen Beitrag antworten »
eulerscheZahl

Ungetestet, sollte aber klappen. Wenn nicht, bitte etwas mehr Code, damit ich mir nicht extra selbst eine Testfunktion schreiben muss.
code:
1:
deltaPhi = (soll-ist+360) % 360; //deltaPhi ist im Bereicht [0; 359]

if (deltaPhi < 180) {
//...
}
else {
//...
}[/code]
Auf diesen Beitrag antworten »
Tommy1234

Vielen Dank. Es funktioniert. Du bist der erste nach zahlreichen Foreneinträgen, der mein Problem auf Anhieb verstanden hat.

Herzlichen Dank.

Gruß Tommy
 
Neue Frage »
Antworten »


Verwandte Themen