Ich hätte folgende Aufgabe in Matlab zu lösen und bräuchte dringend eure Hilfe:
Der Mittelpunkt einer Kugel S mit Radius r > 0 bewegt sich entlang des Strahls mit Ausgangspunkt A (aus dem R^3) und Richtungsvektor v (ungleich 0). Zwei weitere Punkte P, Q ∈ R^3 definieren eine Strecke im dreidimensionalen Raum. Schreiben sie ein Computerprogramm, das entscheidet, ob die bewegliche Kugel entlang ihrer Laufbahn die Strecke trifft oder nicht.
Nun habe ich folgenden mathematischen Ansatz gewählt:
1) Zuerst eine Gleichung der Geraden im R^3 aufstellen: X= P + t*PQ
2) Aufstellen der Normalebene E zur Geraden g durch den Mittelpunkt M, wobei der Richtungsvektor meiner Geraden ja mein Normalvektor ist und ich E somit direkt in Normalform schreiben kann.
3) Ermittlung des Schnittpunktes von g mit E, idem g in E eingesetzt wird und danach nach t umgeformt. Anschließend erhält man den Schnittpunkt durch Einsetzen von t in g.
4) Überprüfen, ob der Schnittpunkt S von A ausgehend in Richtung v liegt oder in Richtung -v (in Richtung v liegt er wenn t >= 0 gilt)
5) Berechnen ob der Abstand zwischen dem Mittelpunkt M und dem Schnittpunkt S kleiner gleich oder größer dem Radius r ist.
So weit hätte ich meinen mathematischen Ansatz gewählt. Meine Frage lautet nun: Stimmt dieser?
Und anschließend würde ich auf alle Fälle großzügige Hilfe beim Schreiben eines Programmes in Matlab brauchen, da ich dabei nicht sehr erfahren bin und ich mich nicht gut auskenne:
Ich hätte mir überlegt meinen einzelnen Punkt und Vektoren als Vektoren in Matlab zu definieren. Anschließend die Gerade und Ebene zu definieren, diese zu schneiden, den SP zu berechnen. Und dann mit "If" als erste Alternative, wenn t >=0, dann mach weiter und wenn t<0, dann funktionierts ja nicht und weiterführend mit if, wenn der Abstand eben kleiner gleich dem Radius ist trifft die Kugel die Gerade und wenn der Abstand größer ist eben nicht. Hierbei bräuchte ich Hilfe bei der Umsetzung in Matlab.
Bis jetzt habe ich folgendes probiert:
Code:
% Veränderbare Werte
P = [p_x, p_y, p_z]; % Punkt P im R^3
Q = [q_x, q_y, q_z]; % Punkt Q im R^3
A = [a_x, a_y, a_z]; % Punkt A im R^3 - Ausgangspunkt des Strahls
v = [v_x, v_y, v_z]; % Richtungsvektor v
M = [m_x, m_y, m_z]; % Mittelpunkt M der Kugel S
r = 5; % Radius der Kugel S
% Formeln syms x y z; % symbolische Variablen
g: X = P + t*(Q-P); % Gleichung der Gerade, welche durch P und Q geht
k = (q_x-p_x)*m_x + (q_y-p_y)*m_y + (q_z-p_z)*m_z;
E: (q_x-p_x)*x + (q_y-p_y)*y + (q_z-p_z)*z = k; % Gleichung der Normalebene zu g
Allerdings habe ich bereits bei meiner Definition von P folgende Fehlermeldung erhalten: Incorrect use of '=' operator. Assign a value to a variable using '=' and compare values for equality
using '=='.
Kann mir nun jemand helfen, was ich bis jetzt falsch gemacht habe und wie ich nun am besten weiter vorgehen könnte.
% Definition der Punkte und Vektoren
P = [p_x, p_y, p_z]; % Punkt P im R^3
Q = [q_x, q_y, q_z]; % Punkt Q im R^3
A = [a_x, a_y, a_z]; % Punkt A im R^3 - Ausgangspunkt des Strahls
v = [v_x, v_y, v_z]; % Richtungsvektor v
M = [m_x, m_y, m_z]; % Mittelpunkt M der Kugel S
% Formeln syms x y z t; % symbolische Variablen
g = P + t*(Q-P); % Gleichung der Gerade, welche durch P und Q geht
k = (q_x-p_x)*m_x + (q_y-p_y)*m_y + (q_z-p_z)*m_z;
E = (q_x-p_x)*x + (q_y-p_y)*y + (q_z-p_z)*z + k; % Gleichung der Normalebene zu g
t= (k-(p_x*q_x-p_x^2 + p_y*q_y-p_y^2 + p_z*q_z-p_z^2))/((q_x-p_x)^2 + (q_y-p_y)^2 + (q_z-p_z)^2);
D = P + t*(Q-P); % Berechnung des Durchstoßpunktes von g mit E
% Berechnung des Abstandes von M zu D
d_x = D(1,1);
d_y = D(1,2);
d_z = D(1,3);
Allerdings habe ich bereits bei meiner Definition von P folgende Fehlermeldung erhalten: Incorrect use of '=' operator. Assign a value to a variable using '=' and compare values for equality
using '=='.
Das ist merkwürdig, da in der Zeile kein Syntaxfehler enthalten ist. Kopiere das doch nochmal in ein leeres Editor-Fenster.
Das "g:" und "E:" in den drei letzten Zeilen sind dagegen keine gültige Syntax.
Zudem wirst du konkrete Werte für p_x, p_y, p_z, q_x, q_y, q_z etc. vorgeben müssen, um dein Programm laufen zu lassen.
Es wäre nachvollziehbarer, was du wo machen willst, wenn du die Vorgehensweise oben als Kommentare in deinen Code reinschreibst.
Wie du eine if-Abfrage schreibst, siehst du in der Doku bzw. im MATLAB Onramp.
Ich persönlich würde den Abstand zwischen der Gerade PQ und dem Strahl berechnen. Sollte der Punkt auf PQ, in dem der Abstand minimal wird, außerhalb der Strecke liegen oder t < 0 sein, dann würde ich mit den nächstgelegenen Endpunkten von PQ bzw. dem Strahl weiterarbeiten.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
das gute ist: das Programm läuft soweit.
Weniger gut: du definierst in A, v, M, g und E etliche Variablen, die du später nicht verwendest. a_x, a_y, a_z werden nicht verwendet, aber A ist wohl ohnehin von der Bedeutung her das gleiche wie M und somit überflüssig?
Und worüber ich mir wirklich Gedanken machen würde: in deinen Berechnungen kommen weder v noch v_x, v_y und v_z vor...
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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
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.