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

 C++ Discussion :

3D, point entre deux points


Sujet :

C++

  1. #1
    Membre à l'essai
    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 : 11
    Points
    11
    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 & Livres


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

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 585
    Points
    188 585
    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 (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 !

  3. #3
    Membre à l'essai
    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 : 11
    Points
    11
    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
    Membre à l'essai
    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 : 11
    Points
    11
    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
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    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) ?

  6. #6
    Membre à l'essai
    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 : 11
    Points
    11
    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
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    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.

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