IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mathématiques Discussion :

D'une normale à un gradient


Sujet :

Mathématiques

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut D'une normale à un gradient
    Bonjour,

    Je cherche une solution ou une approximation numérique.

    Disons que j'observe une région de taille dx par dy (je connais dx et dy) (taille de la région projetée sur le plan xy) et que je connais la normale [nx,ny,nz] de cette région.

    Comment puis-je faire une déduction logique des gradients en x et en y de cette région ?

    Il me semble que j'essaie par trigonométrie toute simple, mais les résultats ne sont pas satisfaisants.

    Par exemple : gx = 1/sin(atan2(nz,nx))*-sign(nx) me semble tendre vers la solution pour de grandes variations, mais pas pour de petites variations. Et je ne sais même pas pourquoi je n'ai pas eu à utiliser dx et je suis certain que c'est ce qu'il me manque à quelque part.

    Merci de m'éclaircir,

    Éric

    EDIT : Je viens de déduire tout simplement [-nx/nz,-ny/nz] qui semble être la réponse ?

    EDIT : Il me manquerait seulement le "scaling" je crois pour correspondre à dx et dy... Ou non, ça me semble magique et je ne comprends pas pourquoi.

  2. #2
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    Bonjour,

    Je déterre cette discussion avec une nouvelle problématique.

    La normale [nx,ny,nz] à un point sur une surface définit par le fait même le plan tangent nx*x + ny*y + nz*z = 0 soit z = f(x,y) = -nx/nz*x + -ny/nz*y et donc le gradient [df/dx,df/dy] est donné par [-nx/nz,-ny/nz].

    Cependant, en analyse numérique, la fonction gradient de MatLab va retourner une valeur dépendante de l'espacement entre les points, contrairement à cette définition ([-nx/nz,-ny/nz]) du gradient qui utilise des données normalisées. Aussi, cette définition ([-nx/nz,-ny/nz]) n'est pas valide à nz=0, alors que ça ne pose pas de problème à la fonction gradient de MatLab.

    Est-ce possible avec les données x,y,nx,ny,nz d'obtenir les mêmes gradients que la fonction gradient avec les données z ?

    Merci,

    Éric

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur en analyse décisionnelle
    Inscrit en
    Juin 2013
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur en analyse décisionnelle

    Informations forums :
    Inscription : Juin 2013
    Messages : 113
    Points : 133
    Points
    133
    Par défaut
    En fait, la fonction gradient de MatLab me perturbe un peu puisqu'elle ne peut pas s'adapter aux données de surface 3D.

    Voyez comment pour des cas simples, le résultat des gradients de MatLab (en rouge) n'est pas perpendiculaire aux courbes de niveau, contrairement à l'astuce (en bleu) par les normales à l'aide de ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    close all;
    clear all;
    clc;
     
    rx = @(degrees) [1,0,0;0,cosd(degrees),-sind(degrees);0,sind(degrees),cosd(degrees)];
    ry = @(degrees) [cosd(degrees),0,sind(degrees);0,1,0;-sind(degrees),0,cosd(degrees)];
    rz = @(degrees) [cosd(degrees),-sind(degrees),0;sind(degrees),cosd(degrees),0;0,0,1];
     
    [x,y] = meshgrid(linspace(-10,10,50));
     
    xyz = ry(45)*rx(45)*[x(:)';y(:)';x(:)'*0];
    x = reshape(xyz(1,:),size(x));
    y = reshape(xyz(2,:),size(x));
    z = reshape(xyz(3,:),size(x));
     
    [nx,ny,nz] = surfnorm(x,y,z);
    gx = -nx./nz;
    gy = -ny./nz;
     
    [gx2,gy2] = gradient(z);
     
    figure;
    contour(x,y,z,50);
    hold all;
    quiver(x,y,gx./sqrt(gx.^2+gy.^2)*0.2,gy./sqrt(gx.^2+gy.^2)*0.2,0,'b');
    quiver(x,y,gx2./sqrt(gx2.^2+gy2.^2)*0.2,gy2./sqrt(gx2.^2+gy2.^2)*0.2,0,'r');
    axis equal;
    hold off;
     
    [x,y,z] = sphere(50);
     
    [nx,ny,nz] = surfnorm(x,y,z);
    gx = -nx./nz;
    gy = -ny./nz;
     
    [gx2,gy2] = gradient(z);
     
    figure;
    contour(x,y,z,10);
    hold all;
    quiver(x,y,gx./sqrt(gx.^2+gy.^2)*0.05,gy./sqrt(gx.^2+gy.^2)*0.05,0,'b');
    quiver(x,y,gx2./sqrt(gx2.^2+gy2.^2)*0.05,gy2./sqrt(gx2.^2+gy2.^2)*0.05,0,'r');
    axis equal;
    hold off;
    Voyez même en pièce jointe, comment on ne peut pas utiliser le gradient fournit appliqué aux données en z obtenues par la fonction [x,y,z] = sphere(50) tout simplement à cause du "mapping" qui n'est pas une grille régulière.

    Le problème est que j'ai téléchargé une fonction du File Exchange qui utilise la fonction gradient et je voulais la modifier un peu en lui fournissant ma version du gradient, mais je suis limité par mes problématiques de division par zéro et par le fait que je dois tout de même parfois fournir les valeurs de la fonction gradient qui sont alors incompatibles avec les miennes.

    Mon bon but principal est d'obtenir le même résultat que gradient(z) à l'aide des données x,y et normales.

    Merci,

    Éric
    Images attachées Images attachées  

Discussions similaires

  1. Tirage dans une normale centrée réduite.
    Par Sinclair dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 20/07/2010, 10h27
  2. Création d'une "Normal map"
    Par Jérôme.O[76] dans le forum PureBasic
    Réponses: 0
    Dernier message: 23/12/2008, 00h02
  3. Calculer les 3 rotations grace a une normale.
    Par parp1 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 16/04/2007, 12h13
  4. Inclinaison par rapport à une normale
    Par adrien357 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 17/06/2006, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo