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

Koordinatentransformation 3D-->2D

 

Kn3ipnt3rrorist
Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.11.16
Wohnort: Dresden
Version: ---
     Beitrag Verfasst am: 01.11.2016, 10:39     Titel: Koordinatentransformation 3D-->2D
  Antworten mit Zitat      
Moin Leute,

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?

Danke schonmal im Voraus
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.11.2016, 12:14     Titel: Re: Koordinatentransformation 3D-->2D
  Antworten mit Zitat      
Hallo Kn3ipnt3rrorist,

Was sind Deine Inputs gebnau?

Zitat:
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.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Kn3ipnt3rrorist
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.11.16
Wohnort: Dresden
Version: ---
     Beitrag Verfasst am: 01.11.2016, 13:11     Titel:
  Antworten mit Zitat      
Zitat:
Du hast 3 Punkte als karthesische Koordinaten gegeben, richtig? ODer hast Du die Normale der Ebene bereits gegeben?


ich habe die 3 Punkte des Dreiecks gegeben, musste mir aber die Normale sowieso bereits berechnen

Zitat:
Handelt es sich um ein schiefwinkliges Koordinaten-System oder ist es ein rechtwinkliges Dreieck?


ist dann leider schiefwinklig




Meinst du bei Wikipedia die Möglichkeit nach der Ursprungsgerade? und nutz ich da dann den berechneten Vektor aus Z-Achse und Normalenvektor?
Private Nachricht senden Benutzer-Profile anzeigen
 
Kn3ipnt3rrorist
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.11.16
Wohnort: Dresden
Version: ---
     Beitrag Verfasst am: 01.11.2016, 13:41     Titel:
  Antworten mit Zitat      
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
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 02.11.2016, 12:52     Titel:
  Antworten mit Zitat      
Hallo Kn3ipnt3rrorist,

Zitat:
ich habe die 3 Punkte des Dreiecks gegeben, musste mir aber die Normale sowieso bereits berechnen

Poste doch mal als Matlab-Code, was Du genau hast. Dann muss man sich das nämlich nicht ausdenken, wenn man Beispiel-Code antworten möchte.

Zitat:
Zitat:
Handelt es sich um ein schiefwinkliges Koordinaten-System oder ist es ein rechtwinkliges Dreieck?

ist dann leider schiefwinklig

Das Koordinaten-Sytsem ist wirklich schiefwinklig, also nicht-karthesisch?

Zitat:
Meinst du bei Wikipedia die Möglichkeit nach der Ursprungsgerade?

Dort findest Du die Formel, um eine Rotations-Matrix um eine beliebige Achse zu berechnen.

Zitat:
und nutz ich da dann den berechneten Vektor aus Z-Achse und Normalenvektor?

Probiere es doch einfach mal aus. Oder male es Dir auf Papier auf.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Kn3ipnt3rrorist
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 21
Anmeldedatum: 01.11.16
Wohnort: Dresden
Version: ---
     Beitrag Verfasst am: 02.11.2016, 13:26     Titel:
  Antworten mit Zitat      
ok dann jetzt nochmal ausfürhlich:

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
    if 0<=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
    if 0<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^^
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.