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

3d-Kurve in 2d drehen/projeieren

 

cru
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 11.09.19
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.09.2019, 22:20     Titel: 3d-Kurve in 2d drehen/projeieren
  Antworten mit Zitat      
Hallo,

ich habe eine Kurve, die aus vielen Messpunkten (XYZ-Koordinaten der Punkte sind gemessen) besteht. Im Großen und ganzen liegen alle diese Punkte der Kurve in einer Ebene (Abweichungen von wenigen 1/1000 mm). Als erstes lasse ich mir die Kurve im 3D plotten, benötige aber zur Weiterverarbeitung die Kurve auf ein 2D-Koordinaten-System gedreht/projeziert.

Eine Idee wäre sich die Drehwinkel aus identischen Punkten errechnen zu lassen. Z.B. indem man den Anfangspunkt (A(XA,YA,ZA)) in den Koordinaten-Ursprung (A(UA,VA,WA)) =A(0,0,0) projeziert, den Endpunkt (C) auf die neue U-Achse. Einen Maßstab benötige ich nicht. Die Translation wären ja quasi die Koordinaten von A, aber wie komme ich auf die Drehwinkel der Drehmatrix. Die Drehmatrix benötige ich, um alle anderen Punkte der Kurve in das UVW-Koordinatensstem zu transformieren...

Vielleicht gibt es ja noch andere Ideen, die Messpunkte in ein 2D-Koordinatensystem zu überführen Question

Code:


%% 1. Messelemente einlesen

quelle_XYZ = 'S5_Kante1_XYZ2.txt';
fid_XYZ = fopen(quelle_XYZ);
format = '%s %f %f %f';
DATEI_XYZ = textscan(fid_XYZ,format,'headerlines',0);
fclose(fid_XYZ);

%% 2. Eingelesene Daten zuordnen

Pt_Name_XYZ   = DATEI_XYZ{1}; % [-]
X_XYZ       = DATEI_XYZ{2}; % [mm]
Y_XYZ       = DATEI_XYZ{3}; % [mm]
Z_XYZ       = DATEI_XYZ{4}; % [mm]

%% 3. 3d-Plot

figure(1)
plot3(X_XYZ,Y_XYZ,Z_XYZ)
xlabel('X')
ylabel('Y')
zlabel('Z')
grid on

%% 4. näherungsweise Ebene berechnen
% besser: ausgeglichene Ebene berechnen

anz_Pt = length(X_XYZ);     % [-] Anzahl der Punkte einer Kante

% A B C sind Punkte der Ebene
A_XYZ = [X_XYZ(1);Y_XYZ(1);Z_XYZ(1)]; % [mm] Anfangspunkt Kurve
B_XYZ = [X_XYZ(ceil(anz_Pt/2));Y_XYZ(ceil(anz_Pt/2));Z_XYZ(ceil(anz_Pt/2))]; %  [mm] mittlerer Punkt Kurve
C_XYZ = [X_XYZ(anz_Pt);Y_XYZ(anz_Pt);Z_XYZ(anz_Pt)]; %  [mm] Endpunkt Kurve

% Ebene berechnen
richtungsvektor_1 = B_XYZ - A_XYZ; % [mm]
richtungsvektor_2 = C_XYZ - A_XYZ; % [mm]
kreuzprodukt = cross(richtungsvektor_1,richtungsvektor_2); % [mm^2]
ebene = sum(A_XYZ.*kreuzprodukt); % [mm^3] Stützvektor A * Kreuzprodukt

% Ebenengleichung in Koordinatenform:   n1 * x1 + n2 * x2 + n3 * x3 = a

n1 = kreuzprodukt(1); % [mm]
n2 = kreuzprodukt(2); % [mm]
n3 = kreuzprodukt(3); % [mm]
a = ebene; % [mm^3]

% Abstand aller Punkte zur Ebene
dist = abs((n1 * X_XYZ(:))+(n2* Y_XYZ(:))+(n3* Z_XYZ(:))-a) / sqrt( n1^2 + n2^2 + n3^2 ); % [mm]
dist_mum = dist*1000; %[mum]

figure(2)
plot(1:1:anz_Pt,dist_mum)
xlabel('Punktnummer []')
ylabel('Distanz zur Ebene [\mum]')
grid on

%% 5. neues Koordinatensystem festlegen

a = norm(B_XYZ-C_XYZ);   % [mm] Abstand zwischen B und C
b = norm(A_XYZ-C_XYZ);   % [mm] Abstand zwischen A und C
c = norm(A_XYZ-B_XYZ);   % [mm] Abstand zwischen A und B

alpha = acosd((b^2+c^2-a^2)/(2*b*c)); % [deg] Winkel zwischen b und c bzw. an A
beta  = acosd((a^2+c^2-b^2)/(2*a*c)); % [deg] Winkel zwischen a und c bzw. an B
gamma = acosd((a^2+b^2-c^2)/(2*a*b)); % [deg] Winkel zwischen a und b bzw. an C

v_B_UVW_1 = c*sind(alpha); % [mm] Koordinaten v von B_UVW --> B_UVW(u,v,w)
u_B_UVW_1 = c*cosd(alpha); % [mm] Koordinaten u von B_UVW --> B_UVW(u,v,w)
v_B_UVW_2 = a*sind(gamma); % [mm] Koordinaten v von B_UVW --> B_UVW(u,v,w)
u_B_UVW_2 = c - a*cosd(gamma); % [mm] Koordinaten u von B_UVW --> B_UVW(u,v,w)
u_C_UVW = c; % [mm] Koordinaten u von C_UVW --> C_UVW(u,v,w)

A_UVW = [0;0;0];                % [mm] Koordinaten von A_UVW(u,v,w)
B_UVW_1 = [u_B_UVW_1;v_B_UVW_1;0];    % [mm] Koordinaten von A_UVW(u,v,w)
B_UVW_2 = [u_B_UVW_2;v_B_UVW_2;0];    % [mm] Koordinaten von A_UVW(u,v,w)
C_UVW = [u_C_UVW;0;0];          % [mm] Koordinaten von A_UVW(u,v,w)

 


Also hat jemand Ahnugn wie ich die Drehwinkel berechnen kann, sodass der Anfangspunkt in (0,0,0) verschoben wird und C auf einer Achse landet? Die restlichen Punkte, könnte ich ja dann mit der berechneten Drehmatrix transformieren.

Danke schonmal!!!

kurve1.fig
 Beschreibung:
Das ist eine Beispielkurve. Brauche das ganze dann für zig Kurven...

Download
 Dateiname:  kurve1.fig
 Dateigröße:  21.63 KB
 Heruntergeladen:  289 mal
S5_Kante1_XYZ2.txt
 Beschreibung:
Beispielkoordinatendatei einer Kurve

Download
 Dateiname:  S5_Kante1_XYZ2.txt
 Dateigröße:  4.7 KB
 Heruntergeladen:  281 mal
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.