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

Normalenvektor einer Fläche (surface bzw. mesh) berechnen

 

seasidetobi
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 19.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.03.2009, 22:41     Titel: Normalenvektor einer Fläche (surface bzw. mesh) berechnen
  Antworten mit Zitat      
Ich habe folgendes Problem:

Ich habe Daten einer gekrümmten Fläche im Raum die sich mit

Code:


darstellen lässt. Nun möchte ich zu jedem Koordinatenpunkt den Normalenvektor berechnen. Der Befehl

Code:


von Matlab führt zum flaschen Ergebnis, wie man an der Graphik sieht, wenn man genau hinschaut. Der Grund hierfür ist wahrscheinlich der Algorithmus, denn in der Funktion surfnorm wird die Fläche bikubisch angenähert, was natürlich bei einer 'komplizierteren' Fläche nicht funkioniert.
Ich bin also auf der Suche nach einem brauchbaren Algorithmus, der die Normalenvektoren irgendwie durch Berücksichtigung der Abstände und Lagen der Nachbarpunkte berechnet. Vielleicht kann mir hier jemand weiterhelfen.
Einzige Idee, die mir gerade durch den Kopf gegangen ist, wäre, dass man sich einen Punkt mit vier Nachbarpunkten heraussucht und über diese und die Funktion surfnorm den Normalenvektor berechnet. Das könnte man für alle Punkte wiederholen aber vielleicht kennt jemand eine einfachere Lösung.
Danke

untitled.jpg
 Beschreibung:
Normalenvektoren mit surfnorm

Download
 Dateiname:  untitled.jpg
 Dateigröße:  37.04 KB
 Heruntergeladen:  1950 mal

_________________

TB
Private Nachricht senden Benutzer-Profile anzeigen


seasidetobi
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 19.06.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.03.2009, 03:02     Titel: Algorithmus für Berechnung von Normalenvektoren
  Antworten mit Zitat      
Lösung gefunden:
Folgendes Paper beschreibt recht verständlich einen Algorithmus für die Berechnung von Normalenvektoren jeglicher Oberflächen:

Gradient Estimation from Irregularly Spaced Data Sets
Thomas H. Mezer, Marian Erikkson, Robert C. Maggio
Mathematical Geologz, Vol. 33, No. 6

Es handelt sich dabei natürlich nur um eine Annäherung (Finite-Difference), dafür ist diese sehr gut und die Berechnung ist schnell.
In Matlab sieht das dann so aus:

Datei: SurfaceNormals.m:

Code:

function [Nx Ny Nz] = SurfaceNormals(X, Y, Z, fig, scale)

% Computation of normal vectors of a surface which is defined by:
% X(i,j), Y(i,j), Z(i,j)
% fig: if you want to plot in a certain figure, specify fig = gca.
% If you don't want to plot, set it to 0.
% use scale to scale the normal vectors in the plot, if you don't want to
% scale them, set scale simply to 1.
%
% Output are matrices of the components of the normal vector
% Nx(i,j), Ny(i,j), Nz(ji,j)
%
% example:
%
% clear;
% close all;
% clc;
%
% [X,Y] = meshgrid(-2:.2:2, -2:.2:2);                                
% Z = X .* exp(-X.^2 - Y.^2) .* 3;                                        
% surf(X,Y,Z)
% fig = gca;
% axis equal
%
% [Nx Ny Nz] = SurfaceNormals(X, Y, Z, fig, 0.3);
%
% ref:
% Gradient Estimation from Irregularlz Spaced Data Sets
% Thomas H. Mezer, Marian Erikkson, Robert C. Maggio
% Mathematical Geologz, Vol. 33, No. 6

I = size(X,1);
J = size(X,2);

for i = 1:I
   
    for j = 1:J
        Xm = X(i,j);
        Ym = Y(i,j);
        Zm = Z(i,j);
       
        if j == 1;
            Xrel = X(i,2);
            Yrel = Y(i,2);
            Zrel = Z(i,2);
        elseif j == J;
            Xrel = X(i,j-1);
            Yrel = Y(i,j-1);
            Zrel = Z(i,j-1);
        else
            Xrel = [X(i,j-1) X(i,j+1)];
            Yrel = [Y(i,j-1) Y(i,j+1)];
            Zrel = [Z(i,j-1) Z(i,j+1)];
        end
       
        if i == 1
            Xrel(end+1) = X(2,j);
            Yrel(end+1) = Y(2,j);
            Zrel(end+1) = Z(2,j);
        elseif i == I
            Xrel(end+1) = X(i-1,j);
            Yrel(end+1) = Y(i-1,j);
            Zrel(end+1) = Z(i-1,j);
        else
            Xrel(end+1:end+2) = [X(i-1,j) X(i+1,j)];
            Yrel(end+1:end+2) = [Y(i-1,j) Y(i+1,j)];
            Zrel(end+1:end+2) = [Z(i-1,j) Z(i+1,j)];
        end

   
        % following procedures are taken from reference:
       
        % compute sigma and Matrix V (eq. 15)
        for k = 1:length(Zrel)
            Ds = Zrel(k)-Zm;
            v = [Xrel(k)-Xm; Yrel(k)-Ym];
            v_dist = sqrt(dot(v,v));
            v_hat = v./v_dist;
            sigma(k,1) = Ds/v_dist;
            V(k,1:2) = [v_hat(1) v_hat(2)];
        end

        % solve for t
        t = inv(V'*V)*V'*sigma;
   
        % tangent vectors:
        tanX{i,j} = [ 1 ; 0 ; t(1) ];
        tanY{i,j} = [ 0 ; 1 ; t(2) ];
       
        % normal vector
        n = cross(tanX{i,j},tanY{i,j});
       
        n_dist = sqrt(dot(n,n));
       
        n_norm = n./n_dist;
               
        Nx(i,j) = n_norm(1);
        Ny(i,j) = n_norm(2);
        Nz(i,j) = n_norm(3);
    end
end

%% plot

if fig ~= 0
    for i = 1:I
        for j = 1:J
            Xdraw = [X(i,j) X(i,j)+Nx(i,j).*scale];
            Ydraw = [Y(i,j) Y(i,j)+Ny(i,j).*scale];
            Zdraw = [Z(i,j) Z(i,j)+Nz(i,j).*scale];
    %         Xdraw = [X(i,j) X(i,j)+tanX{i,j}(1).*scale];
    %         Ydraw = [Y(i,j) Y(i,j)+tanX{i,j}(2).*scale];
    %         Zdraw = [Z(i,j) Z(i,j)+tanX{i,j}(3).*scale];

            line(Xdraw,Ydraw,Zdraw,'Parent',fig)
        end
    end
end

 


Ein Beispiel zur Anwendung:

Code:

clear;
close all;
clc;

[X,Y] = meshgrid(-2:.2:2, -2:.2:2);                                
Z = X .* exp(-X.^2 - Y.^2) .* 3;                                        
surf(X,Y,Z)
fig = gca;
axis equal

[Nx Ny Nz] = SurfaceNormals(X, Y, Z, fig, 0.3);
 


Viel Spaß damit. Ich bin sicher nicht der einzige, der soetwas benötigt.
_________________

TB
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2019, 08:58     Titel:
  Antworten mit Zitat      
Halli hallo,
ich klinke mich hier mal ein, obwohl der Beitrag schon älter ist.
Ich nutze auch diesen Code zum Berechnen meiner Normalenvektoren. Mich würde nun interessieren wie genau das Ergebnis der Normalenvektoren ist. Kann mir da jemand helfen? Aus dem Artikel werde ich leider nicht so schlau. Möchte gern eine Fehlerbetrachtung machen.

Liebe Grüße
Chaos391
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: 11.07.2019, 12:34     Titel:
  Antworten mit Zitat      
Hallo Chaos391,

In den genannten Paper ist de Truncation Error für den ein- und zwei-seitigen Differenzen-Quotionen eindeutig angegeben. Aus welchem Detail wirst du dabei nicht schlau? Es ist effizienter, wenn du präzise Fragen stellst, anstatt das ganze Paper im Detail zu erklären.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2019, 13:17     Titel:
  Antworten mit Zitat      
Hallo Jan,
vielen Dank für Deine Antwort. Ich bin nicht so sehr der Mathematik Freak. Vielleicht habe ich deshalb so meine Probleme. Wenn ich es richtig verstehe ist der Abbruch Fehler, von welchem Du spricht, der Fehler für Delta S/v. Ich benötige ja aber den Fehler vom Normalenvektor t in Formel 14.

Wenn ich zurück an meinem Mathematik Vorlesung denke könnte man natürlich die Formel 14 umstellen nach t und dann ne Fehlerfortpflanzung aus sigma und V berechnen. Den Fehler von sigma würde ja dann deinem truncation error entsprechen. Aber was is der Fehler von V? Fehler eines Vektors? Mhm ich bin etwas überfordert Rolling Eyes

LG
Chaos391
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.07.2019, 08:16     Titel:
  Antworten mit Zitat      
Hat niemand noch einen Tipp für mich? Sad
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: 16.07.2019, 12:30     Titel:
  Antworten mit Zitat      
Hallo Chaos391,

Ich habe noch nicht verstanden, nach welchem Fehler du suchst. Wenn du eine Fläche aus Punkten zusammen setzt, gibt es mehrere Fehlerquellen:
1. Die Positionen der Punkte sind nur mit einer bestimmten Genauigkeit bekannt.
2. Man kann die Fläche dann aus Dreiecken zwischen diesen Punkten zusammensetzen, aber dies ist nicht eindeutig. Je nach Aufteilung bekommt man dann andere Normalen-Vektoren heraus, wenn man einfach die Kreuz-Produkte der Kanten nimmt.
3. Man kann eine Fläche mit bestimmbarer Glattheit durch die Punkte legen, z.B. Splines, B-Splines, oder eine gefittete algebraische Fläche. Je nach Algorithmus bekommt man auch unterschiedliche Normalenvektoren.
4. Man kann nicht unendlich viele Normalenvektoren angeben. Wenn man sie nun in einem bestimmten Abstand bestimmt, können die tatsächlichen Normalen zwischen den gewählten von ihnen abweichen.

Das lässt sich alles schon leicht an 3 Punkten in 2D zeigen. Man kann sie durch 2 Geraden verbinden und dann z.B. am Mittelpunkt den Normalen-Vektor bestimmen, oder an den Mittelpunkten der 2 Geraden. Man könnte auch eine Parabel durch die Punkte legen, einen Kreis oder eine Sinuskurve. Dann bekommt man jeweils unterschiedliche Normalen-Vektoren.

Was willst Du also genau tun?

"Berechnung von Normalenvektoren jeglicher Oberflächen" ist wohl etwas hochgegriffen.

"in der Funktion surfnorm wird die Fläche bikubisch angenähert, was natürlich bei einer 'komplizierteren' Fläche nicht funkioniert" - Es "funktioniert" schon, aber halt mit bestimmten Einschränkungen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 16.07.2019, 13:53     Titel:
  Antworten mit Zitat      
Oh, wow Jan danke für Deine Ausführung. Aber ich glaube wir reden im Moment etwas aneinander vorbei Confused

Ich bestimmt mithilfe des SurfaceNormals Programm die Komponenten Nx,Ny und Nz um sie im in einem Raytracing weiterzuverwenden. Für alle anderen Größen konnte ich über einen Gauß-Fehler den Fehler der jweiligen Größe bestimmen. Zum Beispiel für die optische Weglänge usw. Ich hätte nun gern etwas ähnliches für die Normalenvektoren. So dass ich über die Fehler der Größen x,y und z den Fehler der Komponenten Nx,Ny und Nz berechnen kann. Ich habe keine Ahnung ob das überhaupt möglich ist. Kann man die Fehler vllt ansonsten irgendwie abschätzen? So wie man das bei keine Ahnung Strommessung oder sowas macht?

Ich hoffe man versteht, was ich meine Sad
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: 19.07.2019, 09:44     Titel:
  Antworten mit Zitat      
Hallo Chaos391,

Ich denke, ich habe schon verstanden, was du meinst. Du hast Punkte gegeben und berechnest daraus eine Fläche. Zu dieser Fläche berechnest du die Normalen und suchst dazu eine Fehlerabschätzung.
Wie schon erwähnt, ist die Frage noch nicht eindeutig. Denn man bekommt hier verschiedene Fehlerquellen: Die Fehler der Koordinaten der Punkte, die Fehler bei der Methode aus den Punkten eine Fläche zu berechnen, die Fehler durch die Diskretisierung, da man die Normalen nur in einem bestimmten Raster an gibt.

Eine vergleichbare Frage wäre, welche Fehler bei der Messung der Wegstrecke einer Autofahrt auftreten. Das kommt darauf an, wie man "Wegstrecke" definiert: Die Strecke des Schwerpunkts oder der Rollweg einer der Räder? Der Weg projiziert auf den Boden, oder ist eine Vibration des Autos in the Vertikalen auch bereits eine Bewegung?

Du suchst nach einer einfachen Gleichung, aber du hast noch nicht geklärt, was diese Gleichung genau beschreiben soll.
Wenn du definierst, dass mit "Normale" die Mittelsenkrechte der Verbindung zwischen zwei Punkten gemeint ist, kannst du deren Fehler leicht durch die Fehler der Position der Eckpunkte ausdrücken. Das lässt aber vollkommen unberücksichtigt, dass die Mittelsenkrechten nicht zwangsläufig gut Schätzungen für die Normalen der Fläche sind, z.B. falls die Messwerte verrauscht sind.

Das Problem, dass du lösen möchtest, ist ausgesprochen nicht-trivial. Wenn du eine starke Vereinfachung wählst, lässt es sich lösen, aber ein Matlab Forum ist nicht der geeignete Ort um heraus zu finden, welche Vereinfachung für die physikalische Fragestellung am besten geeignet ist.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Chaos391
Forum-Anfänger

Forum-Anfänger


Beiträge: 29
Anmeldedatum: 24.02.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.07.2019, 08:51     Titel:
  Antworten mit Zitat      
Guten Morgen,
vielen Dank für Deine ausführliche Erklärung, Jan. Ich nutze für die Charakterisierung der Fläche eine selbstgeschriebene Funktion. Deshalb möchte ich diesen Teil erstmal außer Acht lassen. Ich gehe also davon aus, dass die Fläche, an der ich die Normalen berechne, nahezu perfekt ist. Ich habe mir auf dieser Fläche ein äquidistantes Raster erzeugt. Es gibt also keine verrauschten Messwerte. Die Normalen werden direkt an diesen Rasterpunkten bestimmt. Also keine Mittelsenkrechte sondern direkt am Punkt. Ist das sinnvoll? Kann ich dann auch über diese Punkte den "Fehler" der Normalen über eine einfach Gleichung errechnen?
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: 25.07.2019, 11:16     Titel:
  Antworten mit Zitat      
Hallo Chaos391,

Zitat:
Die Normalen werden direkt an diesen Rasterpunkten bestimmt. Also keine Mittelsenkrechte sondern direkt am Punkt. Ist das sinnvoll?

Ja, das ist sinnvoll. Du hast dann in jedem Punkt eine Verbindung zu 3 oder mehr Nachbarpunkten, oder? Ein equidistantes Gitter ist wohl nur in einer Ebene equidistant. Damit liegen die Punkte im Raum unterschiedlich weit auseinander. Das kann man in der Berechnung der Normalen berücksichtigen, oder ignorieren. Zudem kann man neben den nächsten Nachbarn auch die übernächsten mit einbeziehen.

Zitat:
Kann ich dann auch über diese Punkte den "Fehler" der Normalen über eine einfach Gleichung errechnen?

Theoretisch sollte das einfach sein: Einfach die Gleichung. mit der du die Normalen bestimmst, nach ihren Inputs ableiten. Das kann man analytisch machen, oder einfach die Inputs variieren und die Auswirkung auf die Normalen berechnen (also eine Art numerischer Differenzierung).

Es scheint hier eher ein mathematisches Problem zu sein, als ein Matlab-Problem, oder?

Gruß, Jan
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.