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 :

Segment sur l'enveloppe convexe


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut Segment sur l'enveloppe convexe
    Bonjour,
    J'ai fait un programme pour savoir si un segment appartient à l'enveloppe convexe mais celui ci ne fonctionne pas et je n'arrive pas a voir ce qui ne va pas.
    Merci d'avance pour votre aide
    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
     
    function t=TestSegConv(x,y)
     
    ok=0;i=1;
    while(ok==0 && i<numel(convhull(x,y))
    if(convhull(i)==x)
            if(convhull(i+1)==y)
                ok=1;
            else
                ok=0;
            end;
        else
            if (convhull(i)==y)
                if(convhull(i+1)=x)
                    ok=1;
                else
                    ok=0;
                end;
            end;
        end;
    end;
    i=i+1;

  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 317
    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 317
    Par défaut
    Qu'est-ce qui ne marche pas ?
    Le code tourne-t-il ? Y-a-t-il des messages d'erreurs ?

    Que représentent x et y ?

    Est-ce que convhull est une variable ou bien la fonction CONVHULL ?
    Si c'est une variable, il faudrait la nommer différemment.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Desolé de ne pas avoir été assez clair. Je vais essayer d'expliquer au maximum.
    Alors voila, j'ai deja crée un programme qui permet sur un nuage de point de faire la triangulation de delaunay, puis l'enveloppe convexe, puis d'appliquer le graphe de gabriel à tous cotés des triangles de Delaunay, alors voila ce programme :
    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
     
    function enveloppeconvexe
     
    clc;
    a=0;b=10;c=0;d=10;
    clf;
    axis([a b c d])
    hold on
    grid
    [xn,yn,but]=ginput(1);
    x=[xn];y=[yn];plot(xn,yn,'.r');
    n=1;k=n;Go=1;
    ListPt2=[k];
    while Go==1;
         [xn,yn,but]=ginput(1);
         if but<3   x=[x xn]; y=[y yn];plot(xn,yn,'.r');n=n+1;
                    plot([x(n-1) x(n)],[y(n-1) y(n)],'-g');
         end;
         if but>1  ;plot([x(n) x(1)],[y(n) y(1)],'-g'); Go=0; end; 
    end;
    ListPt2=[[1:n] 1];
    triplot(delaunay(x,y),x,y)
     
    pause;
     
    plot(x,y,'.k');
    hold on; 
    ListPt = convhull(x,y);
    n=size(ListPt,2);
    for i=1:n 
        j=ListPt(i);
    end; 
    plot(x(ListPt),y(ListPt),'green',x,y,'.r');hold on;
     
    pause;
     
    plot(x(ListPt2),y(ListPt2),'-rs','LineWidth',2,...
                    'MarkerEdgeColor','black',...
                    'MarkerFaceColor','black',...
                    'MarkerSize',10)
     
    pause;
    clc;
     
    NbTr=size(delaunay(x,y),1);
    MC=[];
    Triang=delaunay(x,y);
    for l=1:NbTr
        Tr=Triang(l,:);
        i=Tr(1,1);j=Tr(1,2);k=Tr(1,3);
        MC=[MC;[i,j];[j,k];[k,i] ];   
    end;
    SML=sort(MC,2);
    SML=sortrows(SML);
    N=MC(1,:);
    n=size(MC,1);
    for i=2:n 
        if MC(i-1,:)==MC(i,:) ;else N=[N;MC(i,:)]; end;
    end;    
     
    GGT=[];
    n=size(MC,1);
    for k=1:n
        Cote=MC(k,:);i=Cote(1);j=Cote(2);
        n=numel(x);
        A=[x(i) y(i)]; B=[x(j) y(j)];
        M=1/2*(A+B);R=(1/2)*norm(B-A);
        Go=1;k=0;Bool=0;
        while Go
             k=k+1;
             if ismember(k,[i j]); 
             else
                C=[x(k) y(k)];d=norm(C-M);Bool=d<R; 
             end;    
                Go=not(Bool) & (k<n);
        end;   
        BSG=not(Bool);
        if BSG GGT=[GGT;Cote];
        end;
    end;    
    clf;
    axis([a b c d]);
    GGT
    plot(x,y,'.r');
     
    n=size(GGT,1);
    for k=1:n
        i=GGT(k,1);j=GGT(k,2);
        plot([x(i) x(j)],[y(i) y(j)],'-b');hold on;
    end;
    Et en fait j'ai crée une nouvelle fonction qui permet de savoir si un segment est sur l'enveloppe convexe, pour pouvoir le mettre dans la fonction precedente et appliquer le graphe de gabriel juste aux segments de l'enveloppe convexe, alors voici cette fonction :
    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
    function t=TestSegConv(x,y)
     
    ok=0;i=1;
    while(ok==0 && i<numel(convhull(x,y))
        if(convhull(i)==x)
            if(convhull(i+1)==y)
                ok=1;
            else
                ok=0;
            end;
        else
            if (convhull(i)==y)
                if(convhull(i+1)=x)
                    ok=1;
                else
                    ok=0;
                end;
            end;
        end;
    end;
    i=i+1;
    avec convhull la fonction préprogrammée de matlab.
    J'espere que j'ai été assez clair.
    N'hesitez pas s'il y a encore des questions.
    Merci par avance pour votre aide

  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 317
    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 317
    Par défaut
    Citation Envoyé par clara1815 Voir le message
    avec convhull la fonction préprogrammée de matlab.
    Dans ce cas que représente convhull(i) ?

  5. #5
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    oui vous avez raison convhull depend de 2 variables. En fait en prenant i et i+1, je voulais prendre 2 points qui se suivent, parce que 1 point peu appartenir a l'enveloppe, un autre à l'enveloppe alors que le segment est à l'interieur, il me faut donc des points consecutifs, et je suis bien d'accord ca ne va pas

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 15
    Par défaut
    Du coup je ne sais pas comment faire? Est-ce que vous pourriez m'aider?
    Merci d'avance

Discussions similaires

  1. segmentation et enveloppes convexes avec matlab7
    Par hanou88 dans le forum Traitement d'images
    Réponses: 10
    Dernier message: 17/04/2009, 20h18
  2. Enveloppe Convexe 3D
    Par ToTo13 dans le forum 3D
    Réponses: 3
    Dernier message: 02/05/2007, 16h19
  3. enveloppe convexe
    Par hamdouch dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 15/04/2006, 17h37
  4. Erreur de segmentation sur une chaine en récursif...
    Par laurent_ifips dans le forum C
    Réponses: 12
    Dernier message: 13/12/2005, 16h04
  5. Calcul d'enveloppe convexe + triangulation
    Par Celelibi dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 24/11/2005, 18h02

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