Ich hab eine im Raum liegende Ebene E, in dieser liegt ein Dreieck D. Ich möchte nun die normalen kartesischen Koordinaten so transformieren, dass 2 Achsen in besagter ebene liegen, ich also die dritte vernachlässigen kann. Außerdem sollen die beiden übrigen Koordinatenachsen entlang 2 der Dreiecksseiten zeigen.
Ich muss Also den Ursprung in einen Dreieckspunkt verschieben, mein Koordinatensystem um alle 3 Raumrichtungen drehen, und die übrigen beiden Achsen gegeneinander verdrehen.
Bis auf das verschieben fehlt mir da der Ansatz, hat da jemand nen Plan?
Ich hab eine im Raum liegende Ebene E, in dieser liegt ein Dreieck D.
Du hast 3 Punkte als karthesische Koordinaten gegeben, richtig? ODer hast Du die Normale der Ebene bereits gegeben?
Zitat:
so transformieren, dass 2 Achsen in besagter ebene liegen, ich also die dritte vernachlässigen kann. Außerdem sollen die beiden übrigen Koordinatenachsen entlang 2 der Dreiecksseiten zeigen.
Handelt es sich um ein schiefwinkliges Koordinaten-System oder ist es ein rechtwinkliges Dreieck?
Eine Drehung geschieht immer um eine Achse herum. Diese Achse liegt in Deinem Fallsenkrecht zur Z-Achse und zur Normalen der Ebene, bzw. des Dreiecks. Diese Normale erhältst Du über das Kreuzprodukt.
Wie man die Rotations-Matrix um eine Achse berechnet, verrät Dir WikiPedia, z.B. https://de.wikipedia.org/wiki/Drehmatrix.
Versuche es mal und poste, wie weit Du gekommen bist.
bzw lass ich das schiefwinkelige eventuell auch weg. da bin ich mir noch nicht komplett sicher ob das letzendlich den aufwand wert ist. Wichtig wäre vorerst die Rotationsmatrix auf jedenfall
Input ist:
1. die matrix Tri, eine 3x3 Matrix, mit 3 Punkten und jweiligen X,Y,Z koordianten
2. Der Punkt P mit X,Y,Z koordinaten
in folgendem Segment projiziere ich mir den Punkt P in die ebene, in der das Dreieck Tri liegt, und bestimme den Abstand von P zu dieser
Code:
function[d, Ppro]=PproTri(P1, Tri) % Projektion von Punkt in Ebne definiert durch 3 Punkte, Berechnung abstand % des Punkte von der Ebene % Input: Dreieck als 3*3 Matrix mit [A B C]*[X;Y;Z] % Punkt als 1*3 Vektor mit [X;Y;Z] % output: Projezierter Punkt Ppro und ABstand d
A=Tri(:,1); %1.-3. Punkt des Dreiecks
B=Tri(:,2);
C=Tri(:,3);
RV1=A-B; % Richtungsvektoren
RV2=A-C;
N=cross(RV1,RV2); %Normalenvektor
Normal=(N/((N(1,1))^2+(N(2,1))^2+(N(3,1))^2)); %normiert
d=Normal(1,1)*A(1,1)+Normal(2,1)*A(2,1)+Normal(3,1)*A(3,1);
lambda=(d-P1(1,1)*Normal(1,1)-P1(2,1)*Normal(2,1)-P1(3,1)*Normal(3,1))...
/((Normal(1,1))^2+(Normal(2,1))^2+(Normal(3,1))^2);
Ppro=[P1(1,1)+lambda*Normal(1,1);P1(2,1)+lambda*Normal(2,1);...
P1(3,1)+lambda*Normal(3,1)]; %projizierter Punkt
d=(P1(1,1)-Ppro(1,1))^2+(P1(2,1)-Ppro(2,1))^2+(P1(3,1)-Ppro(3,1))^2;
% Ausgabe - projizierter Punkt in Dreiecksebene % - Abstand Projizierter Punkt zu Originalpunkt % Als nächstes Koordinatentransformation -> Fallunterscheidung -> Abstand % zur nächstgelegenen Fläche zu d addieren(Pytahgoras).
Im nächsten Schritt würde die Koordiatentransformation folgen, damit ich im übernächsten codeabschnitt den Abstand von Projizierten Punkt zur nächstegelegenen Dreiecksfläche im 2-Dimensionalen bestimmen kann.
Das sieht dann wie folgt aus
Code:
function[dend]=distPproTri(Tri,P1,d) % in transformiertem Koordinatensystem Abstand von projeziertem Punkt Ppro % zu Dreieck. Dabei fallunterscheidung je nachdem zu welcher Kante/ welchem % Punkt Ppro den kürzesten Abstand hat
%
% Tri= [Ax Bx Cx; Ay By Cy; Az Bz Cz] % % Anstiege der einzelnen Kanten bestimmen --> Normalenvektoren %
%
%eventuell mit "schiefem" KS möglich, beide Achsen entlang von
% Dreiecksseiten
A=Tri(:,1);
B=Tri(:,2);
C=Tri(:,3);
X=P1(1,1);
Y=P1(2,1);
mAB=((B(2,1)-A(2,1))/(B(1,1)-A(1,1))); %Anstieg gerade AB
mBC=((B(2,1)-C(2,1))/(B(1,1)-C(1,1))); % Anstieg gerade BC
mNAB=((-1)/mAB);
mNBC=((-1)/mBC);
rNAB=Y-mNAB*X; % r wert der normalengeraden durch P zu AB
rNBC=Y-mNBC*X; % r wert der normalengeraden durch P zu BC
rBC=C(2,1)-mBC*C(1,1); % r Wert der geraden BC if Y<=0 if0<=X && X<C(1,1)
Dzus=Y^2; %Abstand Punkt - gerade AC(da X-Achse nur Y koordinate relevant
elseif X<0
Dzus=((X-A(1,1))^2+(Y-A(2,1))^2); %Abstand Punkt - Punkt A
else
Dzus=((X-C(1,1))^2+(Y-C(2,1))^2); %Abstand Punkt - Punkt C
end end if Y>0 if X<0 if Y<(mNAB*X)
Dzus=((X-A(1,1))^2+(Y-A(2,1))^2);%Abstand Punkt - Punkt A
else %Abstand punkt - gerade AB --> gerade durch C mit normalenanstieg
% YN=mNAB*X+rN, Xs,Ys koordinaten des Schnittpunkts
Xs=rNAB/(mAB-mNAB);
Ys=mNAB*Xs+rNAB;
Dzus=((X-Xs)^2+(Y-Ys)^2);
end end if0<X && X<=B(1,1) if Y<mAB*X %Anstieg dreieecksseite
Dzus=0;
elseif mAB*X<Y && Y<(mNAB*X+(B(2,1)-mNAB*B(1,1)))
%Y über dreieck aber unter Normalengerade
Xs=rNAB/(mAB-mNAB);
Ys=mNAB*Xs+rNAB;
Dzus=((X-Xs)^2+(Y-Ys)^2); %Abstand Punkt - gerade AB
elseif Y>(mNAB*X+(B(2,1)-mNAB*B(1,1)))
Dzus=((X-B(1,1))^2+(Y-B(2,1))^2); %Abstand Punkt - Punkt C
end end if B(1,1)<X && X<C(1,1) if Y>(mNBC*X+(B(2,1)-(mNBC*B(1,1))));%Anstieg normale
Dzus=((X-B(1,1))^2+(Y-B(2,1))^2); %Abstand Punkt - Punkt B
elseif(mNBC*X+(B(2,1)-mNBC*B(1,1)))>Y && Y>(mBC*X+rBC)
Xs=(rBC-rNBC)/(mNBC-mBC);
Ys=mNBC*Xs+rNBC;
Dzus=(X-Xs)^2+(Y-Ys)^2; % Abstand Punkt - gerade BC elseif Y<(mBC*X+rBC)%Anstieg gerade
Dzus=0;% Punkt liegt im Dreieck end end if X>C(1,1) if Y>(mNBC*X+(C(2,1)-(mNBC*C(1,1))))
Xs=(rBC-rNBC)/(mNBC-mBC);
Ys=mNBC*Xs+rNBC;
Dzus=(X-Xs)^2+(Y-Ys)^2;
%Abstand Punkt - gerade BC
else
Dzus=(X-C(1,1))^2+(Y-C(2,1))^2; %Abstand Punkt - Punkt C
end end end
dend=d+Dzus;
da bekomme ich am Ende einen Entfernungsfehler den ich schlussendlich über die Farbe plotte will.
Ursprünglich wollte ich den 2. geposteten Codeabschnitt gern in einem schiefen KS lösen, da ich dann weniger If Zweige benötigt hätte. Hab es nun aber mit dem orthogonalen gelöst. Ich benötige also eine Translation des Ursprungs auf dem Punkt A + eine Drehung des koordinatensystems, sodass mein Dreieck in der X-Y Ebene liegt und die Strecke AC auf der X-Achse
Ich hoffe das war jetzt hilfreich^^
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.