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

Surface Normals bestimmen

 

gui_einsteiger
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 08.03.12
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 18.09.2013, 09:28     Titel: Surface Normals bestimmen
  Antworten mit Zitat      
Hallo,

ich habe momentan folgende Aufgabe: ich möchte zu verschiedenen Oberflächen die Surface Normals bestimmen. Hierzu gibt es in Matlab eine Funktion surfnorm (http://www.mathworks.de/de/help/matlab/ref/surfnorm.html).

Als zweite Variante nutze ich einen in diesem Forum vorgestellten Algorithmus (http://www.gomatlab.de/normalenvektor-einer-flaeche-surface-bzw-mesh-berechnen-t5554.html).

Jetzt liefern mir jedoch beide Varianten bei unterschiedlichen Flächen unterschiedliche Ergbebnisse. Im Anhang befindet sich eine Darstellung von 2 unterschiedlichen Flächen mit den jeweiligen Ergebnissen.

Die erste Fläche ist eine schiefe Ebene mit einer Steigung von 45°, bei der zweiten Fläche besteht die Grundform aus dem positiven Anteil einer sinus-Funktion. Links ist jeweils das Ergebnis des Algorithmus, rechts das der Matlab-Funktion dargestellt.

Kann mir hier jemand helfen, warum ich auf so unterschiedliche, und zumindest für die schiefe Ebene in beiden Fälllen falsche Lösung komme?

Ich habe vor in Zukunft mit Freiformflächen zu arbeiten und benötige hierfür einen sicheren Algorithmus.

Schon mal vielen Dank
gui_einsteiger

SurfaceNormals.jpg
 Beschreibung:

Download
 Dateiname:  SurfaceNormals.jpg
 Dateigröße:  122.58 KB
 Heruntergeladen:  447 mal
Private Nachricht senden Benutzer-Profile anzeigen


Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 18.09.2013, 10:24     Titel:
  Antworten mit Zitat      
es währe viel einfacher wenn du ein minimalbeispiel posten würdest das den fehler reproduziert.
_________________

richtig Fragen
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: 18.09.2013, 10:52     Titel: Re: Surface Normals bestimmen
  Antworten mit Zitat      
Hallo gui_einsteiger,

Ohne den Code zu sehen, können wir nicht die Ursache von Problemen erraten.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 08.03.12
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 18.09.2013, 14:06     Titel:
  Antworten mit Zitat      
Hallo,

hier nun der dementsprechende Auszug aus meinem Quellcode (angepasst an das beiligende Datenfile), die Funktion SurfaceNormals kann aus dem Link meines ersten Posts übernommen werden.

Code:
% Datei einlesen
[filename,pathname]=uigetfile()
file=[pathname,filename];
newData=importdata(file);

x=newData(:,1);
y=newData(:,2);
z=newData(:,3);

for m=1:1:32
for n=1:1:10
XI(m,n)=x(n+32*(m-1),1);
YI(m,n)=y(n+32*(m-1),1);
ZI(m,n)=z(n+32*(m-1),1);
end;
end;

figure(1)
meshc(XI,YI,ZI);

% SurfaceNormals berechnen Variante 1
figure(2)
meshc(XI,YI,ZI);
hold on
[Nx,Ny,Nz]=SurfaceNormals(XI,YI,ZI,'gca',-1);
hold off

% SurfaceNormals berechnen Variante 2
figure(3)
surfnorm(XI,YI,ZI);


Bogen.txt
 Beschreibung:

Download
 Dateiname:  Bogen.txt
 Dateigröße:  4.71 KB
 Heruntergeladen:  298 mal
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: 18.09.2013, 15:20     Titel:
  Antworten mit Zitat      
Hallo gui_einsteiger,

Ich habe keine Ahnung, ob dies Dein Problem betrifft und ich habe gerade keinen Zugriff auf Matlab, aber ich hatte mal Probleme mit falschen Normalen in der Darstellung. Dies konnte behoben werden mit: http://www.mathworks.com/matlabcentral/fileexchange/23882-surfo.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 08.03.12
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 18.09.2013, 15:57     Titel:
  Antworten mit Zitat      
Danke für den Tip, leider verstehe ich noch nicht so ganz was die beiden Funktionen machen.

facenorm gibt mir eine 3D-Matrix zurück. Enthält diese die x/y/z-Komponenten der einzelnen Flächennormalen?

verwende ich surfo, so bekomme ich die identische Ausgabe wie mit meshc.
Private Nachricht senden Benutzer-Profile anzeigen
 
gui_einsteiger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 08.03.12
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 20.09.2013, 13:59     Titel:
  Antworten mit Zitat      
so, hab jetzt noch mal ein bisschen mit meinem Quellcode herumgebastelt. Berechne ich mir für die schiefe Ebene aus beiden Dateien über

Code:
winkel=acos(z/sqrt(z*z+x*x+y*y))*180/pi();


aus den Werten des Normalenvektors den Winkel in Grad, so erhalte ich je nach Methode 45 bzw. 135 Grad, sodass hier nur die Darstellung leich falsch ist, die Berechnung jedoch stimm.

Versuche ich das ganze für den Bogen, so bekomme ich immer noch falsche Werte.
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: 21.09.2013, 22:36     Titel:
  Antworten mit Zitat      
Hallo gui_einsteiger,

Zitat:
Versuche ich das ganze für den Bogen, so bekomme ich immer noch falsche Werte.

Das ist zu allgemein formuliert. Kannst Du den Code posten? Falls dieser einen Bug enthält, kann man ihn nicht finden, solange man nur die Beschreibung als Text sieht.

Was sind eigentlich genau die Normalen eines Surface-Objektes? Jede Teilfläche besteht ja aus Dreiecken. Die Normalen sind dann die Kreuz-Produkte von jeweils zwei Seiten. Wenn man das Surface-Objekt aus Vierecken aufbaut, wäre das Kreuzprodukt der beiden Diagonalen sinnvoll, obwohl dies im Allgemeinen nicht mit den Normalen der Unterdreiecke übereinstimmen wird. Die Normalen in den Eckpunkten sind auch nicht eindeutig definiert.
Dies kann aber nicht zu so krassen Fehlern führen wie in deinem geposteten Bild, bei dem die Normalen der Parabel alle genau in Z-Richtung zu wiesen scheinen. Das ist wohl ein Bug.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 08.03.12
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 23.09.2013, 13:40     Titel:
  Antworten mit Zitat      
Hallo,

zu deinen Frage Jan:

ich benutze immer noch den selben Code wie oben gepostet, habe ihn lediglich um eine Formel erweitert:

Code:
winkel=acos(Nz/sqrt(Nz*Nz+Nx*Nx+Ny*Ny))*180/pi();

um mir aus den Normalenvektoren den Winkel zwischen x- und z-Achse zu berechnen.

mache ich dies für meine schiefe Ebene, so erhalte ich bei beiden Arten der SurfaceNormals berechnung richtige Werte (45 und 135°, was je nach Definition des Winkels beides richtig ist).

Versuche ich das ganze bei dem Bogen (txt-file hängt an anderem Beitrag an), so bekomme ich Winkel zwischen -5 und 5° (für beide Berechnungsarten), obwohl diese Graphisch etwas anderes ausgeben und ich größere Winkel erwarte (in x-z Richtung).

Was ich benötige sind die Normalenvektoren meiner einzelnen Punkte, um mir hieraus die Winkelverschiebungen gegenüber der einzelnen Achsen zu berechnen. Das ich hierbei aufgrund der Rechenvorschriften die Randpunkte verliere, ist momentan eher Nebensache.
Private Nachricht senden Benutzer-Profile anzeigen
 
frankw
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2013, 15:25     Titel:
  Antworten mit Zitat      
Hi,

ich glaube du hast ein Skalierungsproblem. Wenn du dir mal deine Kurve in allen Achsen mit dem gleichen Maßstab anschaust siehst du, dass der Winkel auch nur max. 5 Grad betragen kann.

Gruß Frank
Private Nachricht senden Benutzer-Profile anzeigen
 
gui_einsteiger
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 80
Anmeldedatum: 08.03.12
Wohnort: ---
Version: R2013b
     Beitrag Verfasst am: 24.09.2013, 07:59     Titel:
  Antworten mit Zitat      
frankw, welche Kurve meinst du?

Betrachtet man für beide Berechnungsvarianten die Ausgabe, so sieht man bei den blauen Normalenvektoren, dass die +/- 5° um die Z-Achse jeweils stimmen könnten, betrachte ich jedoch die roten Normalenvektoren, so handelt es sich zumindest in der graphischen Ausgabe nie um +/- 5° sondern eher um +/- 80°, (also der Bereich des Winkels zwischen Z-Achse und Vektor)

wo soll es sich hier um ein Skalierungsproblem handeln?
Private Nachricht senden Benutzer-Profile anzeigen
 
frankw
Forum-Anfänger

Forum-Anfänger


Beiträge: 23
Anmeldedatum: 22.09.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2013, 10:01     Titel:
  Antworten mit Zitat      
...bei den roten könntest du recht haben! Aber auch hier würde ich mich nicht auf die graphische Darstellung verlassen. Schau dir die Normalenvektoren numerisch an, ob die passen oder auch nicht.
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.