Vektor-Rotation

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

Freitag 7. März 2008, 16:18

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
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Freitag 7. März 2008, 16:21

Ö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!
BlackJack

Freitag 7. März 2008, 16:33

Nun ja zumindest in den Grenzen, die einem die endliche Darstellung von gebrochenen Zahlen innerhalb des Rechners auferlegen. ;-)
g4borg
User
Beiträge: 16
Registriert: Donnerstag 4. Oktober 2007, 20:38

Freitag 7. März 2008, 16:37

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.
EyDu
User
Beiträge: 4871
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Freitag 7. März 2008, 16:37

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 ;-)
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Freitag 7. März 2008, 16:37

Code: Alles auswählen

from decimal import Decimal
;)
g4borg
User
Beiträge: 16
Registriert: Donnerstag 4. Oktober 2007, 20:38

Freitag 7. März 2008, 16:42

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.
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

Freitag 7. März 2008, 17:19

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.
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

Freitag 7. März 2008, 17:30

Doch es funktioniert jetzt mit deiner (g4borg) Variante. Vielen Dank!
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

Freitag 7. März 2008, 17:49

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
BlackJack

Freitag 7. März 2008, 18:01

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.
kame
User
Beiträge: 49
Registriert: Samstag 23. Februar 2008, 14:45
Kontaktdaten:

Samstag 8. März 2008, 01:31

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.
g4borg
User
Beiträge: 16
Registriert: Donnerstag 4. Oktober 2007, 20:38

Sonntag 16. März 2008, 13:13

wäre sdl nicht klüger zum benutzen?
Antworten