|
|
Winkel zwischen 2 Vektoren |
|
Lemming |

Forum-Anfänger
|
 |
Beiträge: 35
|
 |
|
 |
Anmeldedatum: 14.10.10
|
 |
|
 |
Wohnort: Chemnitz
|
 |
|
 |
Version: 2009b
|
 |
|
|
 |
|
Verfasst am: 23.10.2010, 00:57
Titel: Winkel zwischen 2 Vektoren
|
 |
Hallo!
Ich habe ein kleines Problem.
Ich habe 2 Vektoren (L2L3 und L1L3). Ich möchte den Winkel zwischen diesen beiden Vektoren bestimmen.
Alles kein Problem, wenn der Winkel unter 180° ist (mit acos(dot(...)..).
Aber wenn der Winkel offensichtlich über 180° ist, zeigt es mir einen kleineren Winkel an.
Hat jemand eine Idee, wie ich den Winkel bestimmen kann?
Vielen Dank!
MfG
|
|
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 23.10.2010, 12:09
Titel:
|
 |
Hallo,
ich würde ja sagen, dass der Winkel zwischen zwei Vektoren immer < 180 ist.
Meine Vermutung: du möchtest den Winkel von einem Vektor gegen den Uhrzeigersinn zu einem anderen Vektor.
bzw. umgekehrt, je nachdem von welchem Vektor zu welchem du willst.
Grüße,
Harald
|
|
|
Lemming |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 35
|
 |
|
 |
Anmeldedatum: 14.10.10
|
 |
|
 |
Wohnort: Chemnitz
|
 |
|
 |
Version: 2009b
|
 |
|
|
 |
|
Verfasst am: 23.10.2010, 12:23
Titel:
|
 |
Es geht dabei um eine Gelenk, welches überstreckt wird.
Nicht immer... aber manchmal.
Deshalb werden die Winkel größer 180°.
|
|
|
Harald |

Forum-Meister
|
 |
Beiträge: 24.499
|
 |
|
 |
Anmeldedatum: 26.03.09
|
 |
|
 |
Wohnort: Nähe München
|
 |
|
 |
Version: ab 2017b
|
 |
|
|
 |
|
Verfasst am: 23.10.2010, 13:55
Titel:
|
 |
... jetzt fehlt nur noch, ob dir mit meinem Vorschlag geholfen ist oder nicht.
Grüße,
Harald
|
|
|
Lemming |
Themenstarter

Forum-Anfänger
|
 |
Beiträge: 35
|
 |
|
 |
Anmeldedatum: 14.10.10
|
 |
|
 |
Wohnort: Chemnitz
|
 |
|
 |
Version: 2009b
|
 |
|
|
 |
|
Verfasst am: 23.10.2010, 13:58
Titel:
|
 |
Ich habe 3D Koordinaten.
Da ist es schwierig deine Lösung zu verwenden, da hier x und y Koordinaten verwendet werden.
Gibt es noch eine andere Möglichkeit?
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 23.10.2010, 22:12
Titel: Re: Winkel zwischen 2 Vektoren
|
 |
|
 |
|
Hallo Lemming,
das einfach aussehende Problem ist weder mathematisch, noch physikalisch, noch numerisch trivial.
Mathematisch gesehen ist der Winkel zwischen zwei 3D Vektoren immer <= 180 Grad. Um einen Drehsinn zwischen die Winkel zubekommen, braucht man auf jeden Fall einen dritten Vektor, der die Drehrichtung vorgibt. Diesen dritten Vektor darf man allerdings nicht einfach z.B. per Kreuzprodukt aus den beiden anderen berechnen.
Also benötigst Du eine Möglichkeit die Gelenk-Achse zu definieren. Ein Vektor der auf einem der beiden anderen senkrecht steht und ungefähr in Richtung der Gelenk-Achse steht wäre gut.
Dann kommt das numerische Problem: ACOS oder ASIN haben jeweils starke Ungenauigkeiten bei 0, 90, 180, 270 Grad. Zwar sind die Fehler immer weniger als 1/1000 Grad, aber wenn Du z.B. die Bewegung optimieren möchtest, können die Ableitungen unstetig werden und damit unsinnige Werte liefern. Harald's Vorschlag mit ATAN2 ist deutlich besser, benötigt aber auch die dreifache Rechenzeit. Trotzdem: Winkel niemals mit ACOS oder ASIN berechnen!
Ein Vorschlag zur Berechnung:
Nicht so hübsch, nicht wahr?!
Folgendes wird berechnet: Zunächst werden beide Vektoren normiert und das Punkt- und Kreuzprodukt berechnet.
Dann wird der Winkel zwischen dem Kreuzprodukt und dem Orientierungsvektor bestimmt: Wenn der weniger als 90 Grad ist, ist der Angle < 180, bei mehr als 90 Grad ist Angle > 180. Bei 0 und 180 Grad verschwindet aber das Kreuzprodukt zwischen den Vektoren, deshalb die Abfrage mit "N1dotN2 < -1 + 5*eps".
Für den Einsatz in richtigen Programmen muss das natürlich noch für [N x 3] oder [3 x N] Arrays aufgebohrt werden. Für das Normieren der Vektoren benutze ich das C-Mex File DNorm2 (siehe FEX), aber "sqrt(sum(V1 .* V2))" tut's auch.
Bitte teste das ausgiebig vor einer ernsthaften Benutzung!
Gruß, Jan
|
|
|
ernie&bert1999 |
Gast
|
 |
Beiträge: ---
|
 |
|
 |
Anmeldedatum: ---
|
 |
|
 |
Wohnort: ---
|
 |
|
 |
Version: ---
|
 |
|
|
 |
|
Verfasst am: 03.08.2015, 13:32
Titel:
|
 |
Hallo,
ich habe gerad ein ähnliches Problem, ich möchte mir die Winkel eines Gelenks anschauen. Auch bei mir werden die Winkel größer als 180°, aber das Gelenk befindet sich nicht an einem Punkt im Raum sondern bewegt sich im Raum. Ich habe deinen Code benutzt, jedoch bin ich mir nicht sicher ob ich das richtig verstanden habe. Ich habe drei Punkte P1, P2 und P3. mich interessiert der Winkel zwischen P1P2 und P2P3, was ja die Vektoren V1 und V2 sind. Ich bin mir nun aber nicht sicher, wie ich den Orientierungsvektor festlegen soll, zumal ich keine klare Ausgangslage habe.
Danke schonmal im Voraus.
|
|
|
Jan S |

Moderator
|
 |
Beiträge: 11.057
|
 |
|
 |
Anmeldedatum: 08.07.10
|
 |
|
 |
Wohnort: Heidelberg
|
 |
|
 |
Version: 2009a, 2016b
|
 |
|
|
 |
|
Verfasst am: 03.08.2015, 15:36
Titel:
|
 |
Hallo ernie&bert1999,
Zitat: |
Ich bin mir nun aber nicht sicher, wie ich den Orientierungsvektor festlegen soll, zumal ich keine klare Ausgangslage habe. |
Dann ist das Problem unlösbar.
Wenn Du einfach nur 3 Punkte hast und keine Informationen darüber, wie die Gelenk-Achse liegt, ist es unmöglich zu bestimmen, ob ein Winkel "überstrckt" ist, also größer als 180 Grad. Dafür liegen einfach nicht genügend Informationen vor.
Gruß, Jan
|
|
|
|
|
Einstellungen und Berechtigungen
|
|
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
|
|
Impressum
| Nutzungsbedingungen
| Datenschutz
| FAQ
| RSS
Hosted by:
Copyright © 2007 - 2025
goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.
|
|