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

Anwendung von surfnorm, Normalenvektor v. gefitteter Fläche

 

lumpenseppal
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 23.09.11
Wohnort: ---
Version: 2010a
     Beitrag Verfasst am: 05.10.2011, 14:34     Titel: Anwendung von surfnorm, Normalenvektor v. gefitteter Fläche
  Antworten mit Zitat      
Hallo zusammen,

ich versuche erst einmal mein Problem kurz zu beschreiben, der vollständige Code ist mittlerweile ziemlich lang und unübersichtlich geworden.

Ich habe 2 Datensätze - Istmess und Sollmessdaten - einer Zahnradflanke, die jeweils die Messpunkte (X,Y,Z) enthalten. Der Istmesssatz enzhält zusätzlich zu jedem Messpunkt den normierten Normalenvektor (xn,yn,zn) mit Länge Fn, die sich aus dem Abstand zu den Sollmessdaten ergibt. Anhand des Normalenvektors ist also die Veränderung der Flanke sichtbar.

Geometrisch bedingt ist der Istmesssatz kleiner als der Sollmesssatz, deswegen möchte ich die fehlenden Punkte erzeugen und generell das Netz etwas verfeinern.

Dazu lege ich mit sfit eine Fläche durch alle Sollmessdaten, eine zweite durch die Istmessdaten und nur die Randwerte der Sollmessdaten.

Durch Funktionen entlang von x und y erzeuge ich mir die noch zu berechnenden Punktpaare und lasse sie über feval berechnen, soweit so gut.


Ich schaffe es allerdings nicht, den surfnorm Befehl zur Berechnung der noch fehlenden Normalenvektoren anzuwenden, was vermutlich an den falschen Dimensionen liegt.

Zitat:

[Nx,Ny,Nz] = surfnorm(X,Y,Z)

surfnorm(Z) and surfnorm(X,Y,Z) plot a surface and its surface normals. Z is a matrix that defines the z component of the surface. X and Y are vectors or matrices that define the x and y components of the surface. Reverse the direction of the normals by calling surfnorm with transposed arguments:


Code:

[Ergebnis(i,6), Ergebnis(i,7), Ergebnis(i,8)] = surfnorm(Ergebnis(i,3), Ergebnis(i,4), Ergebnis(i,5));


ist mein Ansatz, dabei soll in Spalte 6 bis 8 die jeweilige Richtung abgelegt werden, in Spalte 3 bis 5 ist je Zeile ein Wertepaar (X,Y,Z) hinterlegt.
Dies liefert allerdings den Fehler:
Zitat:

??? Error using ==> surfnorm at 55
Z must be at least 3-by-3.



Muss also Z in einer andern Form vorliegen? Bei Google ist das Thema leider auch nicht sehr verbreitet.

Gleichzeitig hab ich mir noch eine zweite Herangehensweise überlegt, die aber auch noch nicht zielführend ist.

Laut Wikipedia (http://de.wikipedia.org/wiki/Normalenvektor#Fl.C3.A4chen_im_dreidimensionalen_Raum) könnte man ja auch den Gradienten benutzen, wenn ein G(x,y,z) = 0 vorliegt.

Durch sfit erhalte ich ein z = F(x,y), könnte also sagen
G(x,y,z) = F(x,y) -z
damit grad G = dF(x,y)/dx, dF(x,y)/dy, -1 und dann diesen normieren?

Code:

[tmp.normale(:,6) tmp.normale(:,7)] = differentiate(flaeche.fitresult, [ tmp.normale(:,3) , tmp.normale(:,4) ]);    %df/dx, df/dy = diff (fit., xp, yp)

for k=1:length(tmp.normale(:,1));
  tmp.normale(k,8) = -1;  %zn=-1
   
    tmp.abs = ( tmp.normale(k,6)^2+tmp.normale(k,7)^2+tmp.normale(k,8)^2  )^0.5 ;   %betrag xn,yn,zn
    tmp.normale(k,6) = (tmp.normale(k,6)*(-1) / tmp.abs);    %normieren
    tmp.normale(k,7) = (tmp.normale(k,7)*(-1) / tmp.abs);
    tmp.normale(k,8) = (tmp.normale(k,8) / tmp.abs);
    k = k+1;
   
end
 


So erhalte ich aber ein seltsam Aussehendes Vektorfeld in dem alle Vektoren parallel zu laufen scheinen, oder täuscht das nur?.Den entstehenden Plot hänge ich einmal an.


Ich hoffe das war nicht allzu unklar, sonst gehe ich auf einzelne Punkte gerne noch genauer ein!
Wie immer für jede Hilfe dankbar!

Testnormvek.fig
 Beschreibung:

Download
 Dateiname:  Testnormvek.fig
 Dateigröße:  176.33 KB
 Heruntergeladen:  446 mal
Private Nachricht senden Benutzer-Profile anzeigen


lumpenseppal
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 23.09.11
Wohnort: ---
Version: 2010a
     Beitrag Verfasst am: 07.10.2011, 13:29     Titel:
  Antworten mit Zitat      
Mittlerweile konnte ich das Problem lösen.
Die von mir angesprochene zweite Methode sollte man vergessen, wenn ich da so drüber nachdenke war das glaub ich mathematischer Blödsinn.

Zu surfnorm:
Meine Daten x,y,z lagen je als Vektor vor, jede Zeile mit 2 Laufindizes (j,i)versehen die die Gitterposition darstellen.

Diese Werte neu in einer Matrix abgespeichert, mit Zeile 1 = j1 und allen zugehörigen i's als Spalte usw. funktioniert und lässt mich über surfnorm die Normalenvektoren berechnen.
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 - 2025 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.