Problem mit Skalarprodukt und Winkel zwischen Vektoren

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
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hi Leute, ich versuch den Winkel eines Vektors im Raum zu bestimmen und würde dazu gerne das Skalarprodukt benutzen.

Ich hab diese Formel benutzt genutzt ganz unten: http://www.mathe-online.at/materialien/ ... ktoren.htm

Idee ist, das ich diesen Winkel immer gegen den Einheitsvektor der x Achse machen will und somit mein b = (1,0,0) ist.

Wenn ich das für ein Beispiel durchspiele mit einem Vektor a = (4,4,4) erwarte ich doch eigentlich einen Vektor vom Nullpunkt zur Koordinate 4,4,4. Und nun erwarte ich eigentlich einen Winkel von 45°

Wenn ich das aber in meine Formel einsetze:

Code: Alles auswählen

import math
>>> x=4
>>> y=4
>>> z=4
>>> result = math.degrees(math.acos(x/math.sqrt(x*x + y*y + z*z)*math.sqrt(1) ))
>>> print result
54.7356103172
Da ich ja einen Einheitsvektor benutze kann ich eigentlich die Formel wie dargestellt nutzen, aber wieso kommt da 54° raus und nicht eben die 45?

Ich habe auch noch dieses Beispiel gefunden http://www.tutorials.de/forum/attachmen ... rodukt.png
Die benutzen eine andere Formel, die ich mir nicht erklären kann.

Würde mich über Hilfe sehr freuen.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

würmchen hat geschrieben:Und nun erwarte ich eigentlich einen Winkel von 45°
Die Erwartung ist falsch; die 54.74° sind korrekt.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

He, numerix ist schneller. Aber um es deutlicher zu machen: Wenn du deinen Vektor z.B. auf die x-y-Ebene projizierst (also den Vektor (4, 4, 0) betrachtest), hast du die 45 Grad. In deinem Szenario liegt aber die Ebene, wo du den Winkel messen willst, schraeg im Raum, da hast du dann etwas mehr als 45 Grad... Naja, ist schwer zu erklaeren.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

In der Sekunde in der ich numerix Antwort gelesen habe ist es mir auch wie ein Geistesblitz gekommen... :-)

Jetzt frag ich mich nur ob ich es für mein Vorhaben benutzen kann.

Ich hab zwei Vektoren im Raum und würde gerne messen, wie die zueinander verdreht sind... Ich glaub ich hab da irgendwie Interpretationsschwierigkeiten :-) Hat da jemand eine Idee wie man sowas analysieren kann?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Rebecca hat geschrieben:Naja, ist schwer zu erklaeren.
... weil es ein Problem der räumlich-geometrischen Vorstellung ist.
Ein einfaches, altes, aber für diese Art von Visualisierung ausreichendes Programm ist DreiDGeo. Dort lässt sich das dreidimensionale System einfach mit der Maus verdrehen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

würmchen hat geschrieben:Ich hab zwei Vektoren im Raum und würde gerne messen, wie die zueinander verdreht sind... Ich glaub ich hab da irgendwie Interpretationsschwierigkeiten :-) Hat da jemand eine Idee wie man sowas analysieren kann?
Deine Aussage ist sehr schwammig, aber willst du vlt. in Kugelkoordinaten rechnen? Da waerst du bei dem Vektor (4, 4, 4) auch wieder je bei 45 Grad. :wink:
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Also ich weiß nicht genau wie ich es am besten mache...
Um es mir vorzustellen hab ich mein Problem mit matplotlib im 3D Raum gezeichnet und da versuch ich mir gerade was anständiges zu überlegen...

Ich hab mal mein Programm in Pastebin gepostet, weil es recht lang ist...
http://pastebin.org/301150

Wenn man das ausführt sieht man 4 Dreiecke die jeweils im Mittelpunkt mit einer Linie verbunden sind. Diese beiden Linien möchte ich vergleichen.

Also sprich, um welchen Winkel hat sich Vektor 1 (rote Dreiecke) zu Vektor 2 (gelbe Dreiecke) verdreht...

Habt Ihr ne Idee wie ich das am besten mache? Ich weiß nicht ob sich da Kugelkoordinaten eher anbieten? Aber mein Reales Problem ist schon so im normalen Raum angeordnet...

Ich glaube irgendwie muss ich jeden Vektor immer nur auf eine Ebene Projizieren und da eben immer die Winkel zu x, y und z nehmen... Was denkt ihr?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

würmchen hat geschrieben:Also sprich, um welchen Winkel hat sich Vektor 1 (rote Dreiecke) zu Vektor 2 (gelbe Dreiecke) verdreht...
Wenn du von Winkel und verdrehen sprichst, ist ja auch wichtig, um welche Achse "verdreht" wird...
Habt Ihr ne Idee wie ich das am besten mache? Ich weiß nicht ob sich da Kugelkoordinaten eher anbieten? Aber mein Reales Problem ist schon so im normalen Raum angeordnet...
Kugelkoordinaten sind genau so "im normalen Raum" wie euklidische Koordinaten...
Ich glaube irgendwie muss ich jeden Vektor immer nur auf eine Ebene Projizieren und da eben immer die Winkel zu x, y und z nehmen... Was denkt ihr?
Jo, das klingt immer noch nach Kugelkoordinaten. Lies doch einfach mal den Wikipedia-Artikel dazu. Der Vektor (4, 4, 4) in Kugelkoordinaten ist z.B. (45Grad, 45Grad, sqrt(4**2, 4**2, 4**2)). Wie gesagt, da sind die 45 Grad an die du zuerst gedacht hast!
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

@würmchen: Anmerkungen nicht zur Sache, sondern zum Quelltext allgemein:

Die Docstrings für die `__init__()`-Methoden stehen an der falschen Stelle. So dokumentieren sie gerade die Klassen.

Die `__iter__()`-Methoden könnte man auch mit `iter()` schreiben. Für `Point.__iter__()` zum Beispiel so:

Code: Alles auswählen

    def __iter__(self):
        return iter([self.x, self.y, self.z])
Andererseits könnte man auch einfach nur ``yield`` benutzen bei sehr wenigen Werten. Zum Beispiel `Edge.__iter__()`:

Code: Alles auswählen

    def __iter__(self):
        yield self.A
        yield self.B
Die Klassen sollten von `object` erben, damit es "new style"-Klassen sind und man zum Beispiel auch mit `property()` arbeiten könnte. Das ist bei einigen "Getter"-Methoden sicher eine Alternative.

`Edge.edge` wird nirgends verwendet. Und es sollte dieses Attribut auch nicht geben, denn die Information ist redundant.

Die Namensgebung entspricht nicht immer den mathematischen Erwartungen. `getMiddlePoint()` ist im Englischen eher `getCenter()` -- übrigens ein prima Kandidat für ein `property()`. `getDistance()` berechnet die Länge der Kante. Hier würde sich das Überladen von `__len__()` für anbieten.

Sowohl `Edge` als auch `Triangle` stellen Sachen mit den Attributen von `Point`-Exemplaren an, die eigentlich in die Verantwortung von `Point` gehören. Auf einem `Point` würde der Name `getDistance()` auch Sinn machen, weil das der mathematische Sprachgebrauch für den Abstand zwischen zwei Punkten ist. Die Betragsfunktion ist übrigens überflüssig, weil durch das quadrieren schon alle Werte unter der Wurzel positiv werden. So könnten die ersten drei Klassen aussehen (ungetestet): http://paste.pocoo.org/show/221051/
würmchen
User
Beiträge: 255
Registriert: Mittwoch 7. November 2007, 14:17

Hi BlackJack,

vielen vielen Dank für die Kommentare! Ich bin mit den Namen auch noch nicht so zufrieden und Änder dann hier und da immer noch ab und passe an. Ich find Deine Vorschläge gut und auch Dein Beispielcode, vielen Dank!
Antworten