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 :

Mise à jour table polyligne frontière


Sujet :

MATLAB

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 62
    Points
    62
    Par défaut Mise à jour table polyligne frontière
    Bonjour,

    Durant le mois de mars, j’ai implémenté (grâce à votre aide ) l’algorithme suivant qui permet de mettre à jour une table qui symbolise un polyligne frontière d’un ensemble de triangles.

    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
     
     
    % valeurs de SF et de TabDel pour lesquelles ça fonctionne
    %SF = [ 2 3 ; 3 4 ; 4 5 ; 5 6 ; 6 7 ; 7 2]
    %NB : lorsqu'on exécute , on obtient bien  D = [9 ; 0 ; 10 ; 11 ; 12 ; 8 ]
    %TabDel = [ 7 8 2 ; 2 9 3 ; 4 10 5 ; 5 11 6 ; 6 12 7 ] 
     
    % valeurs de SF et de TabDel pour lesquelles ça ne fonctionne pas
    SF = [ 2 9 ; 9 3 ; 3 4 ; 4 10 ; 10 5 ; 5 11 ; 11 6 ; 6 12 ; 12 7 ; 7 8 ; 8 2 ]
    TabDel = [ 7 13 8 ; 9 14 3 ; 4 15 10 ; 10 5 16 ; 5 16 11 ; 11 17 6 ; 6 17 12 ; 12 18 7]
     
    % NB : TabDel correspond aux triangles à l'extérieur du polyligne frontière
     
    [mm nn]=size(TabDel);
    [pp qq]=size(SF);
    % On cherche les pairs exactes de couple de colonnes de TabDel et de SF (lignes triées par ordre croissant)
    D = []; % D correspondra au final aux points frontieres à integrer dans la table SF (il ne s'agit pas de tout les points du Segment !)
    sTabDel=sort([TabDel(:,[1 2]);TabDel(:,[1 3]);TabDel(:,[2 3])],2);
    for i=1:pp,
    idx=ismember(sTabDel,sort(SF(i,:),2),'rows'); % on decompose TabDel de deux éléments en deux éléments (par ordre croissant) et on le compare avec SF classé par ordre croissant de lignes
    idx=find(idx); % idx est compris entre 1 et 3*size(A,1), idx correspond maintenant aux nums de lignes qui présentent la valeur 1 ci-dessus (donc TabDel et SF correspondent)
     
    % On transforme idx pour retrouver les indices entre 1 et size(TabDel,1)
    rr=idx-mm*floor(idx/mm);
    rr=rr+mm*(rr==0); % là où r est égal à 0 on remplace par le nombre de lignes de TabDel
     
    % On détermine à quelle colonne appartenait la troisième valeur (pas dans B)
    % On utilise le rangement [TabDel(:,[1 2]);TabDel(:,[1 3]);TabDel(:,[2 3])]
    cc=(idx<=mm)+(idx<=2*mm)+(idx<=3*mm);
     
    % On transforme r et c en indices linéraires
    idx=sub2ind([mm nn],rr,cc);
     
    % On sépare les valeurs qui ne doivent pas être dans Segment et on conserve
    % toutes les valeurs des itérations !
     
    tempD = setdiff(TabDel(idx),Segment(:,1));
     
        % NB : si pas d'élément intégré par ligne de B, on met comme code 0 pour
        % pouvoir spécifier après qu'on ne doit pas prendre en compte cet élément
     
       if isempty(tempD),
            D = [D; 0];                   
       end
       D = [D; tempD]
     
       % PROB : je devrai trouver normalement comme vecteur D = [ 8 ; 14 ; 0 ; 15 ; 16 ; 16 ; 17 ; 17 ; 18 ; 13 ; 9 ]
    end
     
    PFAIntegrer = D; 
     
    % Je réactualise maintenant ma table SF
     
    SF=reshape([SF(:,1) PFAIntegrer PFAIntegrer SF(:,2)].',2,[]).';
    SF=[SF(SF(:,1)~=0,1) SF(SF(:,2)~=0,2)]
    Cependant en prenant en compte d’autres données, je me suis rendu compte que cet algorithme ne prenait pas tous les cas en compte.

    4 cas de figure posent problème :

    - la table B créée n’est pas celle attendue !
    - prob lorsque la table B présente 2 valeurs semblables
    - prob lorsque la table SF et la table B présentent des valeurs semblables
    - prob lorsque la table SF commence par un élément qui ne figure plus dans le polyligne frontière mis à jour

    J’ai explicité le problème sous forme d’un exemple avec dessin en annexe. Ce serait vraiment très sympathique si vous saviez m’aider à nouveau parce que je suis bloqué et je ne vois vraiment pas ce qu’il faut faire.

    Je vous remercie d’avance beaucoup pour le temps que vous me consacrez ! Ca m'aide vraiment beaucoup !
    Bon w-e !

    Bernard
    Images attachées Images attachées  

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Si tu cherches l'enveloppe externe d'un maillage, il suffit de chercher les arêtes qui n'apparaissent qu'une seul fois dans la table de connectivité :
    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
    x=rand(25,1);
    y=rand(25,1);
    ct = delaunay(x,y);
     
    trimesh(ct,x,y,'color','b');
     
    % Mise en liste de toues les arêtes de tous les éléments
    ctt=sort([ct(:,[1 2]) ; ct(:,[2 3]) ; ct(:,[1 3])],2);
     
    % Récupération des indices de toutes les aretes 
    [cttt,u,v]=unique(ctt,'rows');
     
    % Histogramme du nombre de fois où chaque arete apparait dans Ctt
    nv=histc(v,[1:max(v)]);
     
    idx=find(nv==1);
     
    if ~isempty(idx)
     
        % Récupération des indices des arêtes uniques
     
        l=line(x(cttt(idx,:)).',y(cttt(idx,:)).','color','r','linewidth',5);
     
    end

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 62
    Points
    62
    Par défaut
    Bonsoir,

    Tout d'abord merci pour votre réponse. C'est clair qu'il est beaucoup plus facile de reprendre les arêtes qui n'apparaissent qu'une seule fois. Je me complique la vie avec ce que j'avais entrepris...

    A cette fin, j'ai rajouté la ligne (juste après que idx ait été défini) afin d'avoir une liste des segments frontières

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    listeSF = cttt([idx],:)
    J'ai cependant encore deux questions :

    - lorsque j'affiche ma liste de segments frontieres, je n'arrive pas à les reclasser pour qu'ils apparaissent l'un à la suite de l'autre (dans un sens de parcours) du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [4 2; 2 7 ; 7 6; 6 4]
    et pas par ordre aléatoire ( et ligne par ordre croissant) du type (comme le programme le fait) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [2 4; 6 7; 2 7; 4 6 ]

    - j'ai réalisé une triangulation de Delaunay en 3D pour afficher la surface brute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    G = delaunay(X,Y)
    % trisurf(G,X,Y,Z)
    et j'essaie d'adapter votre code pour visualiser le polyligne frontiere en 3D mais je n' arrive pas Cela est-il possible ?


    Merci bcp pour votre aide ! Bonne fin de soirée

  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 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Voici une solution pour la première question (c'est un brouillon à optimiser) :
    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
    X = [2 4; 6 7; 1 2; 7 3; 3 1; 4 6 ]
     
    startX = X(1,1);
    sortedX = X(1,2);
    V = X(1,2);
    X(any(X==X(1),2),:) = [];
    X = X-V;
     
    idx = any(~X,2);
    temp = X(idx,:);
    sortedX = [sortedX temp(temp~=0)+V];
    X(idx,:) = [];
    X = X+V;
     
    while size(X,1)>1
        V = sortedX(end);
        X = X-V;
        idx = any(~X,2);
        temp = X(idx,:);
        sortedX = [sortedX temp(temp~=0)+V];
        X(idx,:) = [];
        X = X+V;    
    end
     
    sortedX = [sortedX X(X~=sortedX(end))];
     
    sortedX = [startX kron(sortedX,[1 1]) startX];
    sortedX = reshape(sortedX,2,[]).'
    La seconde question n'est pas très claire

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 62
    Points
    62
    Par défaut
    Bonjour ! Tout d'abord merci pour votre première solution

    Le deuxième problème c'est que j'aimerai bien visualiser le polyligne frontiere sur un graphique XYZ.

    Pour visualiser la triangulation j'ai donc dû utiliser la fonction trisurf au lieu de trimesh.

    Mais pour la visualisation du polyligne frontière, je ne comprends pas bien vos dernieres lignes de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if ~isempty(idx)
     
        % Récupération des indices des arêtes uniques
     
        l=line(x(cttt(idx,:)).',y(cttt(idx,:)).','color','r','linewidth',5);
     
    end
    Je me doute bien que c'est pour visualiser la polyligne frontière mais je n'arrive pas à réaliser cela pour une visualisation en 3D... De plus pourquoi mettre un if ? Quand j'exécute le code, j'obtiens un vecteur colonne de valeurs réelles pour l , à quoi cela correspond-il ?


    Je sais pas si vous y voyez plus clair mais d'ores et déjà merci pour votre aide précieuse.

  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 318
    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 318
    Points : 52 958
    Points
    52 958
    Par défaut
    Citation Envoyé par bernard6
    je n'arrive pas à réaliser cela pour une visualisation en 3D...
    Avec les indices de sortedX, cela ne devrait pas être trop difficile. Il suffit de chercher dans la documentation de LINE.
    Citation Envoyé par bernard6
    De plus pourquoi mettre un if ?
    Si on exécute le code sur un polyèdre fermé... il n'y a pas d'arête libre donc pas de polygone frontière.
    Citation Envoyé par bernard6
    Quand j'exécute le code, j'obtiens un vecteur colonne de valeurs réelles pour l , à quoi cela correspond-il ?
    Ces valeurs sont les identifiants de objets graphiques de type Line crées par la fonction LINE.
    Lire à ce sujet : Présentation des objets graphiques

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 86
    Points : 62
    Points
    62
    Par défaut
    Ok ! Je vais voir ça ! Merci

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

Discussions similaires

  1. Mise a jour Tables via Formulaire
    Par farma dans le forum Modélisation
    Réponses: 4
    Dernier message: 24/07/2007, 18h49
  2. mise a jour table oracle
    Par admcent dans le forum Oracle
    Réponses: 9
    Dernier message: 14/03/2007, 15h32
  3. VBA pour Acces Mise a jour table
    Par Pingouin22 dans le forum Access
    Réponses: 2
    Dernier message: 15/12/2006, 00h20
  4. Mise à jour table
    Par liza06_1 dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/04/2006, 20h20
  5. pbm de mise a jour table
    Par khier dans le forum Bases de données
    Réponses: 2
    Dernier message: 20/09/2005, 01h08

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