Seite 1 von 1

Vektor-Rotation

Verfasst: Freitag 7. März 2008, 16:18
von kame
Irgendwie konnte ich dazu nichts finden.

Ich habe einen Vektor

erstervekotr = vector(a,b,c)

Ich möchte diesen um 22,5 Grad gegen den Uhrzeigersinn drehen.

Dabei soll der y-Wert (b) immer gleich bleiben.

1.
norm(vector)

2.
... ?

3.
aneu = ...?
bneu = ...?

4.
zweitervektor = vector(aneu,b,cneu)

Ich komme leider nicht weiter.

Gruß kame

Verfasst: Freitag 7. März 2008, 16:21
von audax
Öhm. Dein Text ist unverständlich.

Ansonsten...es scheint sich bei deinem Problem um ein reines Mathe-Problem zu handeln. Führe also den Vorgang per Hand auf Papier mit einem Bleistift aus und übertrage das ganze nach Python.

Python respektiert die Gesetze der Mathematik, ehrlich!

Verfasst: Freitag 7. März 2008, 16:33
von BlackJack
Nun ja zumindest in den Grenzen, die einem die endliche Darstellung von gebrochenen Zahlen innerhalb des Rechners auferlegen. ;-)

Verfasst: Freitag 7. März 2008, 16:37
von g4borg
wenn y gleich bleiben soll, ist das eine rotation in einer ebene, womit du polarkoordinaten nehmen kannst und einen vektor(x,y) drehen kannst, wobei y in diesem fall dann z des 3d ist.

also, stichwort: polarkoordinate

aus v3d(x,y,z) machst du ein v2d(x,y) mit v2d(x=v3d.x, y=v3d.z)
rechnest nun v2d in polarkoordinaten um, rotierst es dort, und rechnest wieder zurück.

Verfasst: Freitag 7. März 2008, 16:37
von EyDu
Da aber auch diese Nebeneffekte ausreichend mathematisch erarbeitet wurden und man daher weiss, in welchen Grenzen man sich bewegt, ist ja alles wieder in bester Ordnung ;-)

Verfasst: Freitag 7. März 2008, 16:37
von audax

Code: Alles auswählen

from decimal import Decimal
;)

Verfasst: Freitag 7. März 2008, 16:42
von g4borg
eventuell hilft dir das

Code: Alles auswählen

    def rot(self, angle):
        x = self.vector[0] * math.cos(angle) - self.vector[1] * math.sin(angle)
        y = self.vector[0] * math.sin(angle) + self.vector[1] * math.cos(angle)
wobei hier keine rücksicht auf rad/deg oder normierung nehme, weil es nur ein codesnippet aus einem 2d ballerspiel ist.

den rest musst du mit hilfe des mathebuches lösen.

Verfasst: Freitag 7. März 2008, 17:19
von kame
Vielen Dank erstmal.

Code: Alles auswählen

from visual import *

# Erster Vektor
axis = vector(0.8,0.6,0.9)
cylinder(pos=(0,0,0), axis=axis, radius=0.05, color=color.red)

# Neuer Vektor
axisnew = vector(0,0,0)

# 3-D Polarkoordinatenberechnung
r = sqrt(axis.x**2+axis.y**2+axis.z**2)
r_0 = sqrt(axis.x**2+axis.z**2)
phi = acos(axis.z/r_0)
theta = acos(r_0/r)
print "r:", r, "r_0:", r_0, "phi:", phi, "theta:", theta

# 2-D
axis2d = vector(axis.x,axis.z)
r2d = sqrt(axis.x**2+axis.z**2)
alpha = asin(axis.z/r2d) # Winkelbestimmung
alphaneu = alpha + pi/2 
x = cos(alphaneu)*sqrt(axis.x**2+axis.y**2)
z = sin(alphaneu)*sqrt(axis.x**2+axis.y**2)

cylinder(pos=(0,0,0), axis=(x,axis.y,z), radius=0.05, color=color.green)
Das habe ich bisher. Aber die Vektoren sind noch nicht gleich lang.
Muss ich jetzt noch was zurückrechnen? Oder habe ich einen Fehler gemacht?

@g4borg
Deinen zuletzt geposteten Kommentar verstehe ich leider noch nicht so richtig. Hmmm.

Verfasst: Freitag 7. März 2008, 17:30
von kame
Doch es funktioniert jetzt mit deiner (g4borg) Variante. Vielen Dank!

Verfasst: Freitag 7. März 2008, 17:49
von kame
http://paste.pocoo.org/show/32128/

Ich hab mal den ganzen Code gepostet. Irgendwie klappt das noch nicht mit der Drehung des Schiffes.

Die relevante Stelle findet ihr in Zeile 95!

Ihr braucht das Visual-Modul um den Code ausfuehren zu koennen. Ich wuerde mich sehr freuen wenn mir jemand weiterhelfen koennte.

Uebrigens, bei einem Klick auf die Wellen entsteht ein neues Wellenzentrum.

Und wenn man die Pfeiltasten drueckt, dreht sich das Schiff. Aber eine Sache ist faul.

Gruss kame

Verfasst: Freitag 7. März 2008, 18:01
von BlackJack
Wie wär's denn mal mit Dokumentation lesen?

Auf der Inhaltsseite gibt's einen Link der mit Rotating an Object beschriftet ist. Oh Wunder, die Objekte haben eine `rotate()`-Methode. Wer hätte das gedacht.

Und eine allgemeine Funktion um Vektoren zu drehen gibt's in dem Modul auch.

Verfasst: Samstag 8. März 2008, 01:31
von kame
Dokumentationen lesen ist das eine. Aber sich erinnern ist das andere. Ich habe sogar in einem anderen Programm schon einmal die Rotate-Funktion benutzt, aber....

Viele Dank fuer den Tipp. Alles funktioniert jetzt bestens.

Verfasst: Sonntag 16. März 2008, 13:13
von g4borg
wäre sdl nicht klüger zum benutzen?

Verfasst: Sonntag 16. März 2008, 14:14
von BlackJack
Warum?