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

MATLAB Discussion :

[surf] surface entre ces 2 nuages de points


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut [surf] surface entre ces 2 nuages de points
    Bonjour,

    J'ai un petit soucis, j'ai 2 nuages de point représenté sur un graphique. J'aimerai créer une surface entre ces 2 nuages de point avec la fonction surf mais quand j'applique cela me donne une forme erronée.

    Pouvez vous me venir en aide please ? lol

    Voici l'algorithme:
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    % ----------------------Position lidar à 0°--------------------------------
    R=0.089;
    Beta= 0; % angle inclinaison en degrés 
     
            Xpos=0; % Position du lidar sur x
            Ypos=-R*sind(Beta); % Position du lidar sur Y 
            Zpos=R*cosd(Beta);  % Position du lidar sur Z
     
     
    %---Matrice Transport B1 -> B0 ----------------------------
     
    Mat1=[1 0 0 Xpos;0 cosd(Beta) sind(Beta) Ypos;0 sind(Beta) cosd(Beta) Zpos];
     
    %--- Distance et angle Lidar ------------------------------
     
            d=bureau0(:,2); % toute les distances de BDD incliné
            d=d/1000; % distance en Metre
     
                    angFi= -bureau0(:,1); % Tous les angles du lidar
     
    %---------------Vecteur lidar------------------
     
                xlidar=d.*cosd(angFi);
                ylidar=d.*sind(angFi);
     
    VecLid=[xlidar';ylidar'; zeros(1,length(bureau0)); ones(1,length(bureau0))];
     
    %---- Boucle For---------
     
    for i = 1:length(bureau0) % calculer les coordonnées absolues pour chaque point
        coord0(:,i) = Mat1 * VecLid(:,i);
    end
     
            x0 = coord0(1,:); % l'ensemble des abscisses absolues
            y0 = coord0(2,:); % l'ensemble des ordonnées absolues
            z0 = coord0(3,:); % l'ensemble des hauteurs absolues
     
     
        plot3(x0,y0,z0,'r.')  % nuage de point en rouge à 0° 
     
        title('représentation bureau de 0° à 30°') 
        xlabel('axe x');
        ylabel('axe y');
        zlabel('axe z');
     
    hold on
    % ----------------------Position lidar à 45°--------------------------------
     
    Beta=54.45; % angle inclinaison en degrés en considérent l'erreur (45°)
                Xpos=0;            % Position du lidar sur x
                Ypos=R*sind(Beta); % Position du lidar sur Y 
                Zpos=R*cosd(Beta); % Position du lidar sur Z
     
    %---Matrice Transport B1 -> B0 ----------------------------
     
    Mat1=[1 0 0 Xpos;0 cosd(Beta) sind(Beta) Ypos;0 sind(Beta) cosd(Beta) Zpos];
     
    %--- Distance et angle Lidar ------------------------------
     
        d=bureau45(:,2); % toute les distances de BDD incliner
        d=d/1000; %distance en Metre
     
            angFi= -bureau45(:,1); % Tous les angles du lidar
     
    %---------------Vecteur lidar------------------
     
        xlidar=d.*cosd(angFi);
        ylidar=d.*sind(angFi);
     
                VecLid=[xlidar';ylidar'; zeros(1,length(bureau45)); ones(1,length(bureau45))];
     
    %---- Boucle For---------
     
    for i = 1:length(bureau45) % calculer les coordonnées absolues pour chaque point
        coord45(:,i) = Mat1 * VecLid(:,i);
    end
     
            x45 = coord45(1,:); % l'ensemble des abscisses absolues
            y45 = coord45(2,:); % l'ensemble des ordonnées absolues
            z45 = coord45(3,:); % l'ensemble des hauteurs absolues
     
    %-----------------graphique 3D -----------------------------
    plot3(x45,y45,z45,'g.') % nuage de point en vert à 45° valeur corrigée (30°)
    X=[x0;x45];
    Y=[y0;y45];
    Z=[z0;z45];
     
     
     
     
    surface(X,Y,Z)          % Création de surface 
     
    shading interp;         % interpolation entre le nuage de point à 0° et à 45°
    Nom : nuage de point variation hauteur.JPG
Affichages : 153
Taille : 33,6 KoNom : 3D variation de hauteur.JPG
Affichages : 154
Taille : 44,8 Ko

    Merci à tous pour votre aide futur, à très bientôt j'éspère !!

  2. #2
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 265
    Points : 352
    Points
    352
    Par défaut
    peut-tu verifier ton premier et ton dernier point dans tes 2 scan de lidar?
    la surface est fermé c'est probablement que le premier et le dernier points sont les mêmes

    ps : surf(X,Y,Z) devrai fonctionner ici

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Slt, Merci pour ton aide tout d'abord,

    Le 1er et le dernier point de mes 2 scans ne sont pas identique. Normalement ma forme 3D ne devrait pas étre fermé mais je ne comprend pas pourquoi elle est fermé.

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Pourrais-tu nous fournir des données (x0, y0, z0, x45, y45 et z45) dans forme d'un fichier mat mis dans une archive zip ou rar ?
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    slt Jerome, je viens de m'appercevoir que l'algo que je vous ai envoyé n'est pas le bon ! les données ne sont pas les mêmes.
    sorry!!
    voici le 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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    clc
    %--------------------- Lidar à 0°-----------------------------------------
    Xpos=0.45;
    Ypos=0.405;
    Zpos=0;
    beta=0; % orientation du lidar 
     
    %Matrice de changement de repere
    matp1 = [ cosd(beta) -sind(beta) Xpos ; sind(beta) cosd(beta)  Ypos ; 0 0 Zpos ];
     
    d1=bureau0(:,2); %d1= toute les distances 
    d1=d1/1000; % distance converti en mètre 
     
    ang1 = - bureau0(:,1); % ang1 est l'ensemble des angles du lidar
     
    xlidar = d1.*cosd(ang1); % les abscisses relatives
    ylidar = d1.*sind(ang1); % les ordonnées relatives
     
    matr1 = [xlidar' ; ylidar'; ones(1,length(bureau0))]; % Matrice contenant les coordonnées relatives
     
    % Boucle for 
    for i = 1:length(bureau0) % calculer les coordonnées absolues pour chaque point
        coor0(:,i) = matp1 * matr1(:,i);
    end
     
    x0 = coor0(1,:); % l'ensemble des abscisses absolues
    y0 = coor0(2,:); % l'ensemble des ordonnées absolues
    z0 = coor0(3,:);
     
    plot3(x0,y0,z0,'r.') % afficher le nuage des points
    hold on 
     
     
    %axis([0 10 0 10 0 10]) % définir les longueurs des axes
    %hold on
     
    %-----------------------------lidar à 45°----------------------------
    Xpos=0.45;
    Ypos=0.405;
    Zpos=0.5;
    beta=0; % orientation du lidar 
     
    %Matrice de changement de repere
    matp2 = [ cosd(beta) -sind(beta) Xpos ; sind(beta) cosd(beta)  Ypos ; 0 0 Zpos ];
     
    d2=hbureau0(:,2); %d1= toute les distances 
    d2=d2/1000; % distance converti en mètre 
     
    ang1 = - hbureau0(:,1); % ang1 est l'ensemble des angles du lidar
     
    xlidar = d2.*cosd(ang1); % les abscisses relatives
    ylidar = d2.*sind(ang1); % les ordonnées relatives
     
    matr1 = [xlidar' ; ylidar'; ones(1,length(hbureau0))]; % Matrice contenant les coordonnées relatives
     
    % Boucle for 
    for i = 1:length(hbureau0) % calculer les coordonnées absolues pour chaque point
        coor45(:,i) = matp2 * matr1(:,i);
    end
     
    x45 = coor45(1,:); % l'ensemble des abscisses absolues
    y45 = coor45(2,:); % l'ensemble des ordonnées absolues
    z45 = coor45(3,:);
     
    plot3(x45,y45,z45,'g.') % afficher le nuage des points
     
    X=[x0;x45];
    Y=[y0;y45];
    Z=[z0;z45];
     
    surf(X,Y,Z)
    shading interp
    Et les données qui vont avec en fichier zip . Les données sont identiques car j'ai fait varier que la hauteur.
    Les seuls point qui ne sont pas identiques, c'est le 1er et le dernier point car je pensais que c'étais la cause de l'erreur.

    Merci pour ton aide, j'aimerai vraiment savoir et comprendre pourquoi j'ai des surface en trop lol!
    Fichiers attachés Fichiers attachés

  6. #6
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 165
    Points
    53 165
    Par défaut
    Il faut trier les points le long de chaque nuage avant d'utiliser surf :

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    % Trier les points à 0°
    x0s = zeros(size(x0));
    y0s = zeros(size(y0));
    z0s = zeros(size(z0));
     
    [~, idx] = min(y0);
     
    ns = 1;
    x0s(ns) = x0(idx);
    y0s(ns) = y0(idx);
    z0s(ns) = z0(idx);
     
    x0(idx) = [];
    y0(idx) = [];
    z0(idx) = [];
     
    while numel(x0)>0
     
        d = (x0s(ns)-x0).^2+(y0s(ns)-y0).^2+(z0s(ns)-z0).^2;
     
        [~, idx] = min(d);
     
        ns = ns + 1;
        x0s(ns) = x0(idx);
        y0s(ns) = y0(idx);
        z0s(ns) = z0(idx);
     
        x0(idx) = [];
        y0(idx) = [];
        z0(idx) = [];
     
    end
     
    % Trier les points à 45°
    x45s = zeros(size(x45));
    y45s = zeros(size(y45));
    z45s = zeros(size(z45));
     
    [~, idx] = min(y45);
     
    ns = 1;
    x45s(ns) = x45(idx);
    y45s(ns) = y45(idx);
    z45s(ns) = z45(idx);
     
    x45(idx) = [];
    y45(idx) = [];
    z45(idx) = [];
     
    while numel(x45)>0
     
        d = (x45s(ns)-x45).^2+(y45s(ns)-y45).^2+(z45s(ns)-z45).^2;
     
        [~, idx] = min(d);
     
        ns = ns + 1;
        x45s(ns) = x45(idx);
        y45s(ns) = y45(idx);
        z45s(ns) = z45(idx);
     
        x45(idx) = [];
        y45(idx) = [];
        z45(idx) = [];
     
    end
     
    X = [x0s ; x45s];
    Y = [y0s ; y45s];
    Z = [z0s ; z45s];
     
    surf(X, Y, Z)
    shading interp
    Images attachées Images attachées  
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  7. #7
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci Jérôme pour ta réponse ! Pourrais tu m'expliquer ton algorithme, comment tu as trié les données car je connais pas lesi foncier que ta utilisé !
    En tous cas merci

  8. #8
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Dsl pour les faute de frappe, je la refais lol:

    je ne connais pas les fonctions que tu as utilisé pourrais-tu m'expliquer ton algo afin que je comprenne pour pouvoir réutiliser cette méthode ?

    Merci à bientôt

  9. #9
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 53 165
    Points
    53 165
    Par défaut
    L'algorithme :
    1. sélectionner une extrémité (valeur minimale de y) et en faire le point de départ
    2. calculer la distance entre ce 1er point et tous les autres points du nuage
    3. le point le plus proche devient le 2eme point du contour
    4. calculer la distance entre ce 2eme point et tous les autres points du nuage (à l’exception du 1er)
    5. le point le plus proche devient le 3eme point du contour
    6. calculer la distance entre ce 3eme point et tous les autres points du nuage (à l’exception du 1er et du 2eme)
    7. le point le plus proche devient le 4eme point du contour
    8. ...
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  10. #10
    Candidat au Club
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2015
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Merci jerome pour tes explications,

    A bientôt !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Surface entre deux nuages de points
    Par jerrrrrrr dans le forum MATLAB
    Réponses: 5
    Dernier message: 22/12/2014, 10h38
  2. Réponses: 4
    Dernier message: 10/12/2011, 19h48
  3. Equation de surface à partir d'un nuage de points
    Par lybhur dans le forum MATLAB
    Réponses: 10
    Dernier message: 24/09/2009, 10h01
  4. [Débutant] Calculer la surface occupée par un nuage de point
    Par PaM... dans le forum MATLAB
    Réponses: 9
    Dernier message: 26/01/2009, 16h56
  5. Surface générée par un nuage de points
    Par pizzsto dans le forum MATLAB
    Réponses: 7
    Dernier message: 29/01/2008, 11h51

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