WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Zu einem Vektor einen Vektor mit Winkel addieren

 

Derak
Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 07.04.2009, 13:37     Titel: Zu einem Vektor einen Vektor mit Winkel addieren
  Antworten mit Zitat      
Hallo liebe Matlabfreunde,

ich hab zwar schon über die Suchfunktion versucht mein Problem zu lösen aber hab leider nicht das passende für mein Problem gefunden.

Zu meinem Problem:

Ich hab 3 Vektoren a,b,c (siehe Bild im Anhang). Vektor a startet im Punkt A, Vektor b im Punkt B und die Vektoren a und c treffen sich im Punkt C.

Ich kenne vom Vektor a den Betrag (230) und die Start und Zielkoordinate. Desweitern kenne ich vom Vektor b den Betrag (34) und logischer Weise die Startkoodinaten. Dazu kommt noch der Winkel Alpha=92° zwischen a- und b-Vektor.
Nun möchte ich gern auf die Koordinaten vom Punkt C kommen.

Meine erste Frage wäre nun ob es eine andere Funktion in Matlab gibt die zu einem Vektor einen weiteren Vektor addiert unter Berücksichtung des winkels der zwischen beiden ist?

Ich habe folgende Funktion gefunden

Code:


[X,Y] = pol2cart((51.07*pi /180),34)

 


Hier ist es aber so das durch den Punkt B die X-Achse läuft und Matlab halt den PUnkt B mit den Koordinaten (0,0) versieht und von da aus mir die Koordinaten von der Pfeilspitze vom Vektor b ausgibt. Matlab rechnet schon mit dem Winkel zwischen Vektor b und der X-Achse und der Länge. Zu den X und Y Werten addiere ich noch die Ursprünglichen Koordinaten vom Punkt B und das Ergebniss für den Punkt C stimmt soweit auch (manuell nachgemessen). Beim Spiegeln des Systems stimmen die Werte aber schon nicht mehr Sad
Das Problem was ich nun hab ist, dass das ganze System (a,b,c)Vektor sich um dem Punkt C dreht und damit der Winkel zwischen b und a ständig durch die X-Achse geteilt wird.
Ich will am Ende überprüfen, egal bei welcher Position das System steht (wie es gedreht ist), ob der Abstand vom Punkt C zum Punkt B immer gleich ist.

Vielleicht hättet ihr ja auch einen anderen Ansatz. Ich danke euch schon mal für die Bemühungen

LG
Deark

Vektoren.jpg
 Beschreibung:

Download
 Dateiname:  Vektoren.jpg
 Dateigröße:  2.86 KB
 Heruntergeladen:  741 mal
Private Nachricht senden Benutzer-Profile anzeigen


Helmert
Forum-Century

Forum-Century


Beiträge: 121
Anmeldedatum: 04.09.08
Wohnort: Karlsruhe
Version: 2011a
     Beitrag Verfasst am: 07.04.2009, 14:36     Titel:
  Antworten mit Zitat      
Ich denke, daß pol2cart ein guter Ansatz ist. Wenn du eine Funktion haben möchtest, die die Koordinatendifferenzen in einem Rutsch zum Ausgangsvektor a addiert, wäre es auch kein großer Aufwand mehr, diese selber zu schreiben (siehe ggf. ">> help function").

Daß das Verfahren beim Spiegeln des Systems "nicht mehr funktioniert", ist evtl. nur ein Problem von Winkeldefinitionen und der Wahl des richtigen Quadranten beim (mehrdeutigen) Arkustangens. Konkretere Implementierungsdetails wären hier evtl. hilfreich.

Mein Vorschlag:

1. Bestimmung des Winkels zwischen Vektor a und der x-Achse unter Beachtung des Drehsinns, d. h., dieser Winkel kann Werte zwischen 0° und 360° (oder auch zwischen -180° und +180°) annehmen (-> Funktion atan2).

2. Addition des Winkels zwischen a und b. Auch hier Konsistenz bezüglich Vorzeichen bzw. Drehsinn beachten!

3. Berechnung der Koordinatendifferenzen mit pol2cart.

4. Addition zu den Koordinaten des Endpunktes von a.

Das sollte eigentlich universell funktionieren ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 07.04.2009, 15:42     Titel:
  Antworten mit Zitat      
Hallo Derak,

um einen "Pfeil"* in der Ebene eindeutig festzulegen, braucht man vier Werte. Das können sein:

1. x- und y-Komponente des Fußpunkts und x- und y-Komponente der Spitze ("a_x_start, a_y_start, a_x_end, a_y_end")

2. x- und y-Komponente des Fußpunkts, Länge und Winkel zur x-Achse ("a_x_start, a_y_start, a_betrag, a_winkel")

3. x- und y-Komponente des Fußpunkts, Differenz zwischen Spitze und Fußpunkt in x- und y-Richtung ("a_x_start, a_y_start, a_x_diff, a_y_diff")

Zwischen diesen Notationen kann man hin- und herrechnen. Zwischen 1 und 3 geht mit einfacher Addition bzw. Subtraktion, zwischen 2 und 3 geht in Matlab mit pol2cart und cart2pol. Direkt zwischen 1 und 2 kann man nicht umrechnen.

Code:
c_x_diff = c_x_end - c_x_start;
c_y_diff = c_y_end - c_y_start;
d_x_end = d_x_start + d_x_diff;
d_y_end = d_y_start + d_y_diff;
[a_winkel,a_betrag] = cart2pol(a_x_diff,a_y_diff);
[b_x_diff,b_y_diff] = pol2cart(b_winkel,b_betrag);


Um nun zwei Pfeile aneinanderzuhängen, ist es am günstigsten, wenn der erste in der ersten Notation vorliegt und der zweite in der dritten:

Code:
c_x_start = a_x_start;
c_y_start = a_y_start;
c_x_end = a_x_end + b_x_diff;
c_y_end = a_y_end + b_y_diff;


Weiß man anstelle des Winkels zur x-Achse von einem Pfeil nur den Winkel zu einem anderen Pfeil, muss man letzteren erst in die zweite Notation bringen. Dann kann man den neuen Pfeil konstruieren:

Code:
winkel_a_b = 92;
[a_winkel,a_betrag] = cart2pol(a_x_diff,a_y_diff);
b_winkel = a_winkel + (winkel_a_b/180)*pi;


Hierbei muss man auf die Lage der Pfeil zueinander achten. Ein positiver Winkel zwischen a und b heißt, dass man von a aus gegen den Uhrzeigersinn laufen muss, um b zu erreichen.

Ich hoffe, das hilft Dir weiter.

Herzliche Grüße
Bijick

* Als Vektor bezeichnet man die Differenz zwischen Spitze und Fußpunkt in x- und y-Richtung. Dieser hat seinen Fußpunkt also immer im Koordinatenursprung.

PS: Zu spät... vielleicht nutzt es trotzdem. Smile
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 08.04.2009, 09:27     Titel:
  Antworten mit Zitat      
Erstmal vielen Dankt für die Hinweise. Ich hab gestern noch versucht bissel was zu progen aber kam nicht sehr weit.
Das ist momentan der Stand:

Code:

clear all;
clc;

%Start- und Endpunkt vom Vektor a
B=[646 472];
A=[820 623];

%Länge des Vektors b
b = 34;

%manuell gemessener Winkel
angle_a_x = 51.07;
angle_a_x = angle_a_x*pi /180

%Berechnung des Punktes C
[b_x_diff,b_y_diff] = pol2cart(angle_a_x,b);

C=[CC(1)+b_x_diff;CC(2)-b_y_diff]
 


Hierbei errechnet er mit auch die richtigen Koordinaten für den Punkt C. Aber wie gesagt da das System mit dem Vektor a und Vektor b um den Punkt C rotiert ändert sich ständig der Winkel zwischen b-Vektor und der angenommenen X-Achse die durch den Punkt B geht.

Wenn ich versuche den Winkel automatisch zu messen mit dieser Funktion

Code:

angle_a_x = atan2(B(2),B(1));
 


bekomme ich immer einen falschen Winkel. Meine Vermutung ist das Matlab die "X-Achse" nicht durch den Punkt B legt. Ich bräuchte aber so eine Funktion die das kann. Hätte noch jemand eine Idee oder Hinweis?

LG
Derak
Private Nachricht senden Benutzer-Profile anzeigen
 
Helmert
Forum-Century

Forum-Century


Beiträge: 121
Anmeldedatum: 04.09.08
Wohnort: Karlsruhe
Version: 2011a
     Beitrag Verfasst am: 08.04.2009, 10:15     Titel:
  Antworten mit Zitat      
Das ist schon mal ein Ansatz; allerdings müßte an der einen oder anderen Stelle noch optimiert werden. Ich würde folgendes Vorgehen vorschlagen:

Zunächst kann man den Vektor a durch die Koordinatendifferenzen seiner Endpunkte ausdrücken:
Code:

vektor_a = B-A;
 

Dann berechnest Du den Winkel zwischen dem Vektor a und einer x-Achsen-Parallele durch Punkt A:
Code:

richtung_AB = atan2(vektor_a(2),vektor_a(1);
 

Dann drehst du den Winkel um (Berechnung des Gegenrichtungswinkels):
Code:

richtung_BA = richtung_AB - pi
 

(Das gleiche Ergebnis könntest du übrigens auch so erzielen:)
Code:

richtung_BA = atan2(A(2)-B(2),A(1)-B(1)) - pi;
 

Jetzt hast du die Richtung von B nach A (bezogen auf die Richtung der x-Achse). Um die Richtung von A nach C zu bekommen, mußt du den von den Vektoren a und b eingeschlossenen Winkel (manuell gemessen?!?) zu richtung_BA hinzuzählen. (Beim Messen mußt du immer auf den Drehsinn achten, d. h. den Winkel zwischen a und b im mathematisch positiven Drehsinn messen.)
Code:

richtung_BC = richtung_BA + angle_a_x;
 

Dann noch die Koordinatendifferenzen zwischen B und C sowie die Koordinaten von C berechnen:
Code:

[b_x_diff,b_y_diff] = pol2cart(angle_a_x,b);
C=[B(1)+b_x_diff;B(2)+b_y_diff] ;
 


Funktioniert's?
Private Nachricht senden Benutzer-Profile anzeigen
 
Derak
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 40
Anmeldedatum: 23.10.08
Wohnort: BZ
Version: R14
     Beitrag Verfasst am: 08.04.2009, 15:02     Titel:
  Antworten mit Zitat      
Also nochmals vielen vielen Dank für die Erklärungen und Hinweise.

mein Code sieht nun wie folgt aus:

Code:


clear all;
clc;

%Start- und Endpunkt vom Vektor a
B=[646 472];
A=[820 623];

%B=[684 417];
%A=[510 263];

%Vektor zwischen A und B
vektor_a = A-B;

%Winkel
richtung_AB = atan2(vektor_a(2),vektor_a(1));
richtung_BA = richtung_AB - pi ;

%Betrag Vektor b zur Drehmitte
a = 34;

%Lage der Vektoren
b = A(2)-B(2);

%Einschlusswinkel zwischen a- und b-Vektor
c= 92.02

if b >= 0
        angle_a_x = richtung_AB*180 /pi
        angle_b_x = c-angle_a_x
        [BC_x_diff,BC_y_diff] = pol2cart(angle_b_x,a);
        CCP=[B(1)+BC_x_diff;B(2)-BC_y_diff]
else
        angle_a_x = richtung_BA*180 /pi;
        angle_b_x = 180-(360+angle_a_x)
        angle_a_x = c+angle_b_x
        [BC_x_diff,BC_y_diff] = pol2cart(angle_a_x,a);
        CCP=[B(1)+BC_x_diff;B(2)-BC_y_diff]
end

Bildmitte = [1280/2 1024/2];
Verschiebung = sqrt((Bildmitte(1)-CCP(1))^2+(Bildmitte(2)-CCP(2))^2)

 


also mit den Werten A und B sowie den auskommentierten Werten A und B zeigt er mir nun die annähernd richtigen Werte. Da ich momentan nur 2 Wertepaare hab kann ich mein Script noch nicht wirklich testen. Werd aber versuchen das heute bzw. morgen noch zu tätigen und gegebenfalls würde ich bei auftauchenden Problemen nochmal eure Hilfe brauchen. Aber soweit funzt alles.
Was ich nur festgestellt hab ist das den vektor_a falschherum deffiniert hab als Helmert gepostet hatte. Ob ich den Fehler im anschluss selbst irgendwo im Script behoben hab kann ich nicht mal sagen Very Happy

OK also danke nochmal

LG
Derak
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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 | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 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.