1. #1
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2013
    Messages : 29
    Points : 0
    Points
    0

    Par défaut 3D, point entre deux points

    Bonjour,

    je cherche à écrire une fonction qui prend en paramètre 3 points et qui renvoie true si le premier point est positionné entre les 2 autres. De la forme :
    bool isBetween(Point A, Point B, Point C);
    Sachant que Point est une Classe avec 3 attributs "double" : x, y et z.
    Et que les points peuvent êtres positionnés n'import où (C n'a pas forcement les x,y,z plus grands que B).

    Comment faire ? SVP.

  2. #2
    Responsable Qt


    Avatar de dourouc05
    Homme Profil pro
    Étudiant
    Inscrit en
    août 2008
    Messages
    20 191
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 20 191
    Points : 85 859
    Points
    85 859

    Par défaut



    Une première méthode serait d'établir les équations de la droite en 3D définie par deux points et voir si le troisième passe bien par elle (vérifier s'il est bien solution des deux équations). Maintenant, ce n'est pas forcément le plus facile à faire, ce n'est d'ailleurs pas facilement généralisable à plusieurs dimensions.

    Il pourrait être mieux de calculer le vecteur directeur de la droite formée par deux points (soit faire A - B) et de vérifier qu'il est bien colinéaire avec le vecteur directeur de la droite formée par deux points (A et C ou B et C, à nouveau calculer la différence de leurs coordonnées). En cas de colinéarité (le premier vecteur est proportionnel au second), les trois points seront alignés.
    (C'est équivalent à vérifier que les trois points ne forment pas un plan, au niveau des calculs par rapport à leur équivalent à la main naïf.)

    Le code s'en déduit assez aisément (si tu travailles avec des références, donc sans gestion explicite de pointeurs, ça peut se faire en une instruction, trois lignes en aérant), avec une complexité temporelle constante (donc optimale).
    Vous souhaitez participer aux rubriques Qt ou PyQt (tutoriels, FAQ, traductions, sources) ? Contactez-moi par MP.

    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2013
    Messages : 29
    Points : 0
    Points
    0

    Par défaut

    En faite je me suis mal expliqué.
    Car je veux, en réalité, savoir si le point appartient au pavé, dont les arrêtes sont parallèles aux axes de l'origine, formé des 2 autres points (l'un à l'opposé de l'autre).

    Mais c'est pas plus claire là...

    En gros, dans mon programme, je fait un pavé de sélection et je doit vérifier si le point appartient à ce pavé. Ce pavé est définit par seulement 2 points car les arrêtes sont parallèles aux axes de l'origine.
    Comme ca :

  4. #4
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2013
    Messages : 29
    Points : 0
    Points
    0

    Par défaut

    J'ai fait cette fonction dans la classe Point, qu'en pensez-vous ?
    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
    bool Point::isBetween(Point A, Point B)
    {
        if (A.getX() < B.getX())
        {
            if (this->getX() < A.getX() || this->getX() > B.getX()) return false;
        }
        else if (A.getX() > B.getX())
        {
            if (this->getX() > A.getX() || this->getX() < B.getX()) return false;
        }
     
        if (A.getY() < B.getY())
        {
            if (this->getY() < A.getY() || this->getY() > B.getY()) return false;
        }
        else if (A.getY() > B.getY())
        {
            if (this->getY() > A.getY() || this->getY() < B.getY()) return false;
        }
     
        if (A.getZ() < B.getZ())
        {
            if (this->getZ() < A.getZ() || this->getZ() > B.getZ()) return false;
        }
        else if (A.getZ() > B.getZ())
        {
            if (this->getZ() > A.getZ() || this->getZ() < B.getZ()) return false;
        }
     
        return true;
    }

  5. #5
    Expert Confirmé Sénior

    Avatar de Neckara
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    5 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 5 466
    Points : 16 208
    Points
    16 208

    Par défaut

    Bonjour,
    As-tu bien pensé au cas où A.x = B.x ou A.y = B.y ou A.z = B.z.
    (ou inclusif) ?
    On dit "chiffrer" pas "crypter" !

    On dit "bibliothèque" pas "librairie" !

    Ma page DVP : http://neckara.developpez.com/

  6. #6
    Invité de passage
    Homme Profil pro
    Étudiant
    Inscrit en
    février 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2013
    Messages : 29
    Points : 0
    Points
    0

    Par défaut

    Oui c'est fait exprès : dans le cas où un (ou plusieurs) plan du pavé a une épaisseur nul je veux que la fonction agisse comme si il avait une épaisseur infinie.

  7. #7
    Expert Confirmé Sénior

    Avatar de Neckara
    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    5 466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 5 466
    Points : 16 208
    Points
    16 208

    Par défaut

    Citation Envoyé par Th0ms0n Voir le message
    Oui c'est fait exprès : dans le cas où un (ou plusieurs) plan du pavé a une épaisseur nul je veux que la fonction agisse comme si il avait une épaisseur infinie.
    Il faut le préciser en commentaire car ce n'est pas vraiment intuitif.
    On dit "chiffrer" pas "crypter" !

    On dit "bibliothèque" pas "librairie" !

    Ma page DVP : http://neckara.developpez.com/

Discussions similaires

  1. ensemble de points entre deux points connus
    Par Minouchka dans le forum Traitement d'images
    Réponses: 4
    Dernier message: 20/03/2010, 15h57
  2. Réponses: 1
    Dernier message: 12/05/2007, 15h29
  3. Réponses: 6
    Dernier message: 27/04/2007, 22h50
  4. [Base de données Spatial] Distance entre deux points
    Par Pumpkins dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/11/2006, 12h18
  5. Calcul de distance entre deux points en WGS84
    Par marieR dans le forum Langage
    Réponses: 5
    Dernier message: 03/08/2006, 17h07

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