Verfasst am: 03.08.2010, 16:07
Titel: Fläche in 3D-Plot "entschärfen"
Hallo Leute!
Hab heute nochmal eine Frage:
Und zwar hab ich meine Fläche in einem 3D-Plot und möchte diese gerne "entschärfen".Sprich ich möchte verhindern, dass die Fläche scharfe Kanten darstellt, da diese physikalisch nicht möglich sind....Zum Verständnis: die Fläche stellt einen Druckverlauf über eine definierte Fläche dar. Der DRuck kann ja nicht so sprunghaft abfallen. Deshalb würd ich gerne die scharfen Kanten wegmachen.
Zum besseren Verständnis habe ich zwei Dateien angehängt.
Am Radius 1 und 4 ist die scharfe Kante sehr gut zu erkennen.
Meine Messdaten bestehen aus 6 Messreihen(6Radien) mit jeweils ca.50 Punkten.
Also kurz gesagt: Ich will, dass die Fläche etwas homogener verläuft,aber dennoch nah an den wahren Werten bleibt und das Ergebnis nicht zu stark verfälscht wird.
Ich hoffe meine Fragestellung war halbwegs verständlich
Das ist der Aussschnitt des Codes, der die angefügte graphik darstellt.
der gesamte code ist noch länger, aber denn häng i hier nicht an, weils nicht nötig ist.
Code:
%xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
load Luftspalt1bis4.txt %ladet die Textfile ins Matlab
A=Luftspalt1bis4; %definiert die Textfile als Matrix A
%
%___________________________________________________________________________
%___________________________________________________________________________
%Eingaben:
%
n=1024; %Anzahl der Abtastungen pro Umdrehung
alpha=18; %Eingabe des Winkels der Darstellung der Messwerte in °
Sz=51; %Zeile der Messwerte von der gestartet werden soll
r1=0.39; %Eingabe der Sensor-Radien in Meter
r2=0.448;
r3=0.506;
r4=0.564;
ri=0.36; %Eingabe des Innen- und Aussenradius des Segments in Meter
ra=0.585;
%___________________________________________________________________________
%___________________________________________________________________________
Endzeile=alpha/360*n; %Errechnet die notwendige Zeilenanzahl von den Messwerten
%um den gewünschten Darstellungswinkel zu erreichen.
E=ceil(Endzeile); %Zeilenzahl aufgerundet
pinn=linspace(0,0,E); %Druck am Innenradius ist gleich 0, ergibt einen Verktor
pinn=pinn'; %mit "E"-mal Nullen.
p1=A([Sz:E+Sz-1],3); %definiert die Werte in der 3. Spalte von der Startzeile
p2=A([Sz:E+Sz-1],6); %bis zur Endzeile als einen Vektor p1...4; abhängig davon,
p3=A([Sz:E+Sz-1],9); %in welcher zeile die relevanten Daten anfangen
p4=A([Sz:E+Sz-1],12);
pa=linspace(0,0,E); %Druck am Aussenradius ist gleich 0
pa=pa';
z=[pinn p1 p2 p3 p4 pa]; %fügt die vier Vektoren wieder als Matrix z zusammen
%
%
%
%________________________Erstes Fenster_______________________________________
%
%
%
r_p=[ri r1 r2 r3 r4 ra]; %formt aus den vier Sensor-Radien einen Vektor
R_p = repmat(r_p,E,1); %vervielfacht die Radien "E" mal. "E" Werte ergeben
%den Winkel des Segments.
phi_p=(A([1:E],2))*360*pi/180; %definiert den Winkel aus der entsprechenden
%Zeile des Messwerts umgerechnet auf Rad
Phi_p = repmat(phi_p,1,6); %vervielfacht Phi 4mal (4 Sensor-Radien) [x y] = pol2cart(Phi_p, R_p); %Umrechnung von Polarkoordinaten auf karthesische
surf(x,y,z); %erzeugt die Graphik mit den entsprechenden x,y,z-Werten
title('Druckverlauf');xlabel('Radius in Meter');zlabel('Druck in bar');
hold on %Graphiken bleiben bestehen
contour(x,y,z); %erzeugt einen Konturplot(Höhenprofil) shading interp %"glättet" die Kanten
colorbar EastOutside %erzeugt einen Messbalken
lighting phong %stellt die Farben des Graphen entsprechend dem Messbalken ein
axis equal %zeigt alle Achsen im gleichen Massstab
Generell kann man nicht die Grafik verändern, sondern müsste über die Daten gehen.
Befehle in Richtung Glätten: convn, filter, conv2, filter2
Achtung: es wird die gesamte Matrix geglättet.
Vielleicht besser: über logische Indizierung die Spitzen identifizieren und dann die Datenwerte durch Interpolation ersetzen (interp1, interp2, etc.)
Was dich zu stören scheint, sind aber anscheinend die Ränder der Oberfläche. Wie stellst du dir das denn vor? Irgendwo hören die Daten nunmal auf, und damit auch die Oberfläche...
Wenn man das Bild Segment.jpg anschaut hab ich die Radien eingezeichnet. Auf diesen Radien sind meine Messwerte. Die sollen wenn möglich erhalten bleiben. Die Flächen zwischen den Radien sind von Matlab erzeugt worden, und die sollen schöner verlaufen und nicht so scharfe Kanten enthalten. Die Außenkontur passt so wie sie ist.
Ich häng nochmal ein bild(Test2.png) an um zu veranschaulichen wie meine messdaten verteilt sind. Jeder Schnittpunkt von zwei schwarzen Linien ist ein Messwert. ursprünglich bekomme ich sie in polarkoordinaten.
Kann ich meine die Linien, die vom Innenradius zum Außenradius verlaufen, mit einem spline oder sowas ähnliches verändern? Die punkte sollen wenn möglich gleich bleiben.
Als Beispiel hab ich die 52.Zeile meiner Z-Matrix genommen. Die zeile hat 6 Werte und ich möchte jeweils einen wert dazwischen interpolieren, also insgesamt 5 interpolierte werte. hierzu habe ich zwischen meine bestehnden radien r_p immer einen Radius dazwischen (r_pn) definiert und dann die neue 52. Zeile (zn52) mit interp1 rechnen lassen. nur leider fehlt mir der letzte wert. was hab ich falsch gemacht? die neuen werte sehen mit linearer interpolation nicht schlecht aus(außer, dass der letzte fehlt)
generell gefällt mir der verlauf mit 'cubic'(rot) besser, aber dieser verlauf hat auf der rechten seite wieder so eine scharfe kante drin.
und bei'spline'(blau) werden die spitzen und täler eher höher bzw. tiefer als vorher. kann man bei 'spline' angeben, dass die kurve flacher verlaufen soll?
hmm ich frag mich grad, ob es sinn macht meine matrix zeilenweise mit interp1 zu interpolieren.
Weil meine matrix hat 1024 zeilen und kann fallweise auch noch länger werden.kann ich irgendwie die interpolation automatisieren? einzeln für alle zeilen die interpolation durchzuführen wäre eher nicht praktisch.
hab meine Datenmatrix zeilenweise mit einer Schleife interpoliert und das ergebnis schaut dann so aus. gefällt mir ganz gut. mal schaun obs meinem chef auch gefällt
Vielen dank für die Hilfe(hab mir schon sehr viel info aus dem forum geholt. großes lob an alle)
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.