Vektor im R3 drehen?

P

Pumpanickel

Gast
Huhu,

ich möchte Vektoren im R3 drehen, habe dazu folgende drei Methoden
implementiert:

Java:
public Vector spinX(double aAngle) {
		Vector temp = new Vector(this);
		double tempX = temp.getX();
		double tempY = ((Math.cos(Math.toRadians(aAngle) * temp.getY()) -     (Math.sin(Math.toRadians(aAngle) * temp.getZ())))); 
		double tempZ = ((Math.sin(Math.toRadians(aAngle) * temp.getY()) + (Math.cos(Math.toRadians(aAngle) * temp.getZ()))));
		temp.setX(tempX);
		temp.setY(tempY);
		temp.setZ(tempZ);
		return temp;
	}
	
	public Vector spinY(double aAngle) {
		Vector temp = new Vector(this);
		double tempX = ((Math.cos(Math.toRadians(aAngle) * temp.getX()) + (Math.sin(Math.toRadians(aAngle) * temp.getZ()))));
		double tempY = temp.getY();
		double tempZ = ((-Math.sin(Math.toRadians(aAngle) * temp.getX()) + (Math.cos(Math.toRadians(aAngle) * temp.getZ()))));
		temp.setX(tempX);
		temp.setY(tempY);
		temp.setZ(tempZ);
		return temp;
	}
	
	public Vector spinZ(double aAngle) {
		Vector temp = new Vector(this);
		double tempX = ((Math.cos(Math.toRadians(aAngle) * temp.getX()) - (Math.sin(Math.toRadians(aAngle)))));
		double tempY = ((Math.sin(Math.toRadians(aAngle) * temp.getX()) + (Math.cos(Math.toRadians(aAngle)))));
		double tempZ = temp.getZ();
		temp.setX(tempX);
		temp.setY(tempY);
		temp.setZ(tempZ);
		return temp;
	}

Jetzt weiß ich nur nicht ob ich das alles korrekt gemacht habe.
Es irritiert mich ein wenig das für den Vektor 1,2,3 und einer Drehung um
90° der Vektor 1,0,-0 rauskommt.....
 
P

Pumpanickel

Gast
Huhu,

was meinst du mit Ebene?
Richtung macht doch java immer Mathematisch korrekt gegen den Uhrzeigersinn oder nicht?
 

HimBromBeere

Top Contributor
Naja, es macht einen Unterschied, ob du in der xy-Ebene eine Drehung machst, oder in der yz-Ebene, oder ...
Ob und in welche Richtung JAVA das automatisch macht, entzieht sich meiner Kenntnis.
 
P

Pumpanickel

Gast
Also das mit der Drehung habe ich mit Vektoren im R2 usprobiert.
Wenn ich beispielsweise den Vektor 1,2 um 90° drehe kommt -2,1
raus, also gegen den Uhrzeigersinn.

Puuuhhh das mit den Ebenen wusste ich nicht....wie teile ich ihm
mit in welcher Ebene ich drehen muss, kann mir das Bildlich iwie
nicht vorstellen....
 

XHelp

Top Contributor
Bei dir sieht die Klammersetzung falsch aus:
eq.latex
 

Illuvatar

Top Contributor
Naja, zu sagen in welcher Ebene man dreht oder um welche Achse ist ja das Gleiche. Du hast ja auch drei Methoden, um um verschiedene Achsen zu drehen. Du hast allerdings eben nicht dazugesagt, welche davon du verwendest ;)
Das Problem scheint tatsächlich die Klammersetzung zu sein, wie XHelp gesagt hat, außerdem fehlen bei der dritten Methode [c]*temp.getY()[/c] - Teile, glaub ich.

Edit: Hier mal als Beispiel, wie ich denke, dass man das lesbarer schreiben könnte - dann sieht man auch schneller, wo der Fehler liegt. Ich nehme mal an, deine Vektorklasse hat irgendwelche [c]x,y,z[/c] - Membervariablen.
Java:
    public Vector spinX(double aAngle) {
        double phi = Math.toRadians(aAngle);
        double tempX = x;
        double tempY = Math.cos(phi) * y - Math.sin(phi) * z;
        double tempZ = Math.sin(phi) * y + Math.cos(phi) * z;
        return new Vector(tempX, tempY, tempZ);
    }
Ohne den Rest deiner Klasse zu kennen, schätze ich, dass das das Gleiche machen würde wie dein (korrigierter) Code.
 
Zuletzt bearbeitet:
P

Pumpanickel

Gast
Java:
double tempY = ((Math.cos(Math.toRadians(aAngle) * temp.getY()) - (Math.sin(Math.toRadians(aAngle) * temp.getZ()))));

= (0 + (cos(aAngle) * Y) - (sin(aAngle) * Z))

stimmt doch oder?
 
P

Pumpanickel

Gast
Richtig gezwungen werde ich nicht ;)

Hab mir allerdings gewisse Eigenheiten angewöhnt
die ich nicht mehr los bekomme was Übersichtlichkeit
(Was ich darunter Verstehe ;)) angeht.

Vielen Dank :D
 

Marco13

Top Contributor
Wenn man sowas schreibt wie
Java:
public Vector spinX(double aAngle) {
        Vector temp = new Vector(this);
        double tempX = temp.getX();
        double tempY = ((Math.cos(Math.toRadians(aAngle) * temp.getY()) -     (Math.sin(Math.toRadians(aAngle) * temp.getZ())))); 
        double tempZ = ((Math.sin(Math.toRadians(aAngle) * temp.getY()) + (Math.cos(Math.toRadians(aAngle) * temp.getZ()))));
        temp.setX(tempX);
        temp.setY(tempY);
        temp.setZ(tempZ);
        return temp;
    }
und dann nicht darauf kommt, da
Java:
public Vector spinX(double aAngle) {
    double rAngle = Math.toRadians(aAngle);
    Vector temp = new Vector(this);
    double tempX = temp.getX();
    double tempY = ((Math.cos(rangle * temp.getY()) -     (Math.sin(rAngle * temp.getZ())))); 
    double tempZ = ((Math.sin(rAngle * temp.getY()) + (Math.cos(rAngle * temp.getZ()))));
    temp.setX(tempX);
    temp.setY(tempY);
    temp.setZ(tempZ);
    return temp;
}
oder besser sogar
Java:
public Vector spinX(double aAngle) {
    double rAngle = Math.toRadians(aAngle);
    double ca = Math.cos(rAngle);
    double sa = Math.sin(rAngle);
    Vector temp = new Vector(this);
    double tempX = temp.getX();
    double tempY = // irgendwas kompaktes ohne viele Klammern
    double tempZ = // irgendwas kompaktes ohne viele Klammern
    temp.setX(tempX);
    temp.setY(tempY);
    temp.setZ(tempZ);
    return temp;
}
draus zu machen wird weder mit der Wartung des Programms noch mit der Performance seinen Spaß haben.
 

AlexSpritze

Bekanntes Mitglied
Per Quaternionen:

Java:
public static double[] _(double angle, double[] axis, double[] v) {
    //normalize axis
    double length = 1.0 / MathUtils.norm3(axis);
    double x = axis[0] * length;
    double y = axis[1] * length;
    double z = axis[2] * length;

    //convert degree to radiants
    double half = 0.01745329251994329547 * angle * 0.5d;
    double sin_theta = Math.sin(half);
    double w = Math.cos(half);
    x = x * sin_theta;
    y = y * sin_theta;
    z = z * sin_theta;

    double inverseX = -x;
    double inverseY = -y;
    double inverseZ = -z;
    double inverseW = w;

    //multiply with vector v
    double a = -x * v[0] - y * v[1] - z * v[2];
    double b = w * v[0] + y * v[2] - z * v[1];
    double c = w * v[1] + z * v[0] - x * v[2];
    double d = w * v[2] + x * v[1] - y * v[0];

    w = a;
    x = b;
    y = c;
    z = d;

    return new double[]{
              w * inverseX + inverseW * x + y * inverseZ - inverseY * z,
              w * inverseY + inverseW * y + z * inverseX - inverseZ * x,
              w * inverseZ + inverseW * z + x * inverseY - inverseX * y};
  }

Das geht dann allgemein um jede Achse im Dreidimensionalen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Vektor vs List Java Basics - Anfänger-Themen 4
L Klassen Vektor Klasse Java Basics - Anfänger-Themen 2
E Variable (Vektor) in andere Methode übergeben Java Basics - Anfänger-Themen 4
O Matrix, Vektor Java Basics - Anfänger-Themen 9
J Compiler-Fehler Fehler bei Vektor (E extends Object declared in class Vector) Java Basics - Anfänger-Themen 9
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
S Variablen Vektor zur Berechnung verwenden Java Basics - Anfänger-Themen 4
E Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 7
M transposen Vektor transformieren Java Basics - Anfänger-Themen 8
M Vektor Rechnung Java Basics - Anfänger-Themen 6
B Stützstellen (Vektor) erzeugen? Java Basics - Anfänger-Themen 8
R Matrix-Vektor-Multiplikation Java Basics - Anfänger-Themen 13
B Vektor addieren Java Basics - Anfänger-Themen 4
F Funktion eines JButton in einen Vektor verlagern Java Basics - Anfänger-Themen 4
Z Matrix mit Vektor multiplizieren Java Basics - Anfänger-Themen 13
M Map mit Vektor: Element hinzufügen Java Basics - Anfänger-Themen 21
A vektor bearbeiten?? Java Basics - Anfänger-Themen 9
V Position in einem Vektor Java Basics - Anfänger-Themen 3
N Vektor mit eigener Datenstruktur sortieren Java Basics - Anfänger-Themen 20
A Wie greif ich auf Elemente eines Arrays in einem Vektor zu? Java Basics - Anfänger-Themen 6
D Array? ArrayList? Vektor? ...? Java Basics - Anfänger-Themen 6
C OOP Aus Vektor zufällig einen Eintrag wählen und in Array[][] schreiben Java Basics - Anfänger-Themen 5
Z Summe von Vektor-Elementen Java Basics - Anfänger-Themen 5
S Variable über den Vektor bestimmen Java Basics - Anfänger-Themen 20
J klasse vektor addition Java Basics - Anfänger-Themen 10
M Vektor Klasse Problem Java Basics - Anfänger-Themen 12
M Reihenfolge von Objekten im Vektor Java Basics - Anfänger-Themen 3
G Vektor auslesen und als int Variable casten Java Basics - Anfänger-Themen 4
G Mothoden von Objekten in Vektor aufrufen Java Basics - Anfänger-Themen 4
F ComboBox im Vektor auslesen, Vektor<JComboBox> Java Basics - Anfänger-Themen 6
G Probleme mit Datenstrukturen (Vektor, HashMap) Java Basics - Anfänger-Themen 5
T Koordinaten eines Vektor übergeben Java Basics - Anfänger-Themen 21
J Vektor in Vektor speichern? Java Basics - Anfänger-Themen 10
J Vektor null setzen Java Basics - Anfänger-Themen 10
R Vektor in verketteter Liste Java Basics - Anfänger-Themen 14
J Vektor + auf Elemente zugreifen funktioniert nicht Java Basics - Anfänger-Themen 11
H Vektor auslesen und durchsuchen Java Basics - Anfänger-Themen 4
G Vektor Java Basics - Anfänger-Themen 1
C "null" Element Vektor abfragen Java Basics - Anfänger-Themen 7
C vektor erschaffen Java Basics - Anfänger-Themen 2
C Ein Element aus Mehrdimensionalem Vektor lesen Java Basics - Anfänger-Themen 2
L Vektor befüllen? Java Basics - Anfänger-Themen 3
G Doppelte (Paar) Werte in einem Vektor finden Java Basics - Anfänger-Themen 6
S kartesischer Vektor im n-dimensionalen Raum. Java Basics - Anfänger-Themen 7
G Objekte in einen Vektor speichern Java Basics - Anfänger-Themen 4
M Vektor, gefüllt mit Objekten einer selbstdefinierten Klasse Java Basics - Anfänger-Themen 4
C checken ob ein Vektor leer ist Java Basics - Anfänger-Themen 3
J tast-Eingabe_(Vektor)Skalar-produkt Java Basics - Anfänger-Themen 19
G elemente in einem vektor nach ihren eigenschaften sortieren Java Basics - Anfänger-Themen 2
G Problem clone und Vektor Java Basics - Anfänger-Themen 4
M Vektor sortieren Java Basics - Anfänger-Themen 7
P Vektor toString? Java Basics - Anfänger-Themen 2
T Hashtable und Vektor Java Basics - Anfänger-Themen 3
I einlaggern von Objekten in ein Vektor Java Basics - Anfänger-Themen 10
G Vektor Java Basics - Anfänger-Themen 3
B Bild per KeyListener drehen Java Basics - Anfänger-Themen 1
N Bild drehen Java Basics - Anfänger-Themen 3
R Java ImageIcon drehen Java Basics - Anfänger-Themen 6
R Image drehen Java Basics - Anfänger-Themen 1
J Reihenfolge im Vector lässt sich nicht drehen Java Basics - Anfänger-Themen 9
I String um 90 Grad drehen Java Basics - Anfänger-Themen 17
B Erste Schritte Drehen in Graphics2d Java Basics - Anfänger-Themen 2
K Quadratische Matrix um 90° drehen Java Basics - Anfänger-Themen 5
O BufferedImage drehen, falsch positioniert Java Basics - Anfänger-Themen 5
A Array drehen Java Basics - Anfänger-Themen 2
S Drehen RGB Würfel Java Basics - Anfänger-Themen 18
G Shape um eigene Achse drehen Java Basics - Anfänger-Themen 2
L Array drehen Java Basics - Anfänger-Themen 8
S Drehen eines Pfeils im Flug Java Basics - Anfänger-Themen 10
F Bild drehen Java Basics - Anfänger-Themen 9
A Javaspiel im Handy mit Drehen Java Basics - Anfänger-Themen 12
A Grafik2d Objekte drehen, Idee da, Problem in Umsetzung Java Basics - Anfänger-Themen 3
A Denkanstoß: Drehen eines Bildes (Matrix) Java Basics - Anfänger-Themen 5
S JPG drehen, skalieren und speichern Java Basics - Anfänger-Themen 15
D Image drehen Java Basics - Anfänger-Themen 6
S Zeichnung drehen Java Basics - Anfänger-Themen 13
H Drehen von Label Java Basics - Anfänger-Themen 2
R 2dimensionales array um 90 grad drehen Java Basics - Anfänger-Themen 2
T Bild drehen + richtige größe berechnen Java Basics - Anfänger-Themen 4
J Kann man ein JFrame/JWindow 90/-90 drehen? Java Basics - Anfänger-Themen 9
B array drehen Java Basics - Anfänger-Themen 11
G Aufgabe rekursiv Zahlen drehen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben