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

Algorithmes et structures de données Discussion :

Vérifier l'appartenance d'un point à un triangle


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2011
    Messages : 13
    Par défaut Vérifier l'appartenance d'un point à un triangle
    Bonjour,
    Merci de bien vouloir m'aider à résoudre le problème suivant,
    Comment je peux déterminer si un point est à l'intérieur d'un triangle sachant que les trois points du triangle sont connus (x,y,z) et aussi les coordonnées du point.
    je travaille en 3D.
    Merci d'avance.

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Déjà, il doit être dans le plan des trois points. Donc après avoir défini le vecteur normal par un produit vectoriel, l'équation du plan tombe tout cuit.

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Ensuite, pour l'appartenance au triangle lui-même, le point doit être une combinaison convexe des trois points du triangle, c'est-à-dire qu'il peut s'écrire sous la forme
    Formule mathématique
    Par exemple, regarde les coordonnées barycentriques.

    Rien en dehors de la portée d'une recherche Google pas trop évoluée.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Déjà, il doit être dans le plan des trois points. Donc après avoir défini le vecteur normal par un produit vectoriel, l'équation du plan tombe tout cuit.
    Malheureusement le calcul de la normale pose des problèmes de stabilité numérique.

    Dans mes souvenirs il vaut vérifier que (A, M) sont du même côté par rapport (BC), que (B, M) sont du même côté par rapport (AC), etc.

    J'ai un bout de code qui traîne qui fait ça :

    Code c# : 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
        public static bool IsInTriangle(this Vector3 v, Vector3 A, Vector3 B, Vector3 C)
        {
            return
                ArePQOnSameSideInRespectToAB(v, A, B, C) &&
                ArePQOnSameSideInRespectToAB(v, B, A, C) &&
                ArePQOnSameSideInRespectToAB(v, C, A, B);
        }
     
        static bool ArePQOnSameSideInRespectToAB(Vector3 P, Vector3 Q, Vector3 A, Vector3 B)
        {
            var AB = B - A;
            var AP = P - A;
            var AQ = Q - A;
     
            AB.Normalize();
            AP.Normalize();
            AQ.Normalize();
     
            var cross1 = Vector3.Cross(AB, AP);
            if (cross1.IsEpsilon()) return false; // Si P est placé sur AB, on considère que les deux points ne sont pas du même côté
     
            var cross2 = Vector3.Cross(AB, AQ);
            if (cross2.IsEpsilon()) return false; // Si Q est placé sur AB, on considère que les deux points ne sont pas du même côté
     
            return Vector3.Dot(cross1, cross2) > 0;
        }

  5. #5
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Malheureusement le calcul de la normale pose des problèmes de stabilité numérique.
    Je ne comprends pas. Est-ce que tu veux dire que la précision des facteurs obtenus ne sera pas assez grande ?

  6. #6
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Je ne comprends pas. Est-ce que tu veux dire que la précision des facteurs obtenus ne sera pas assez grande ?
    Oui. Dans le cas d'un triangle très allongé.

    Cela dit à la relecture j'ai des doutes. Le IsEpsilon sent la mauvaise pratique, et les deux tests associés sont probablement nécessaires mais j'ai un doute. Ça marchait pour le domaine considéré mais bon...

  7. #7
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par DonQuiche Voir le message
    Le IsEpsilon sent la mauvaise pratique
    Au contraire....

    Les opérations numériques sur des flottants et les comparaisons qui en découlent ne sont pas exactes dans la mesure où (à part le remplissage systématique par des 0 quand on passe un calcul, ce qui n'est pas fait par défaut) dire "a = b" en flottant n'a pas vraiment de sens...

    Il faut prendre en compte la précision des données, et non pas celle des calculs..

    Donc il est au contraire de bonne pratique d'utiliser des choses comme "isepsilon"



    PS : et c'est une erreur commune de jeune de penser qu'on peut programmer "if ( a == b )" avec des réels... Je l'ai encore vu il y a peu dans un code que j'avais écris et qu'un jeune stagiaire a révisé... Evidemment le code ne faisait plus ce qu'il devait faire...

Discussions similaires

  1. Vérifier l'appartenance d'un site pour une personne
    Par beninsky dans le forum Langage
    Réponses: 2
    Dernier message: 08/02/2010, 17h09
  2. Calculer Point Hauteur triangle
    Par freerider74 dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/04/2009, 09h19
  3. Réponses: 2
    Dernier message: 28/05/2008, 09h59
  4. Appartenance d'un point à une droite
    Par x0rster dans le forum C
    Réponses: 3
    Dernier message: 31/03/2007, 23h33
  5. Interpolation "linéaire" sur un point dans triangle (3D)
    Par Vol dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 09/07/2006, 22h34

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