Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 7 sur 7
  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
    Expert Confirmé Sénior

    Avatar de dourouc05
    Homme Profil pro Thibaut Cuvelier
    Étudiant
    Inscrit en
    août 2008
    Messages
    19 295
    Détails du profil
    Informations personnelles :
    Nom : Homme Thibaut Cuvelier
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : août 2008
    Messages : 19 295
    Points : 69 548
    Points
    69 548

    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/PySide (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 :
    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
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 681
    Points : 13 640
    Points
    13 640

    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
    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
    Responsable Sécurité

    Avatar de Neckara
    Homme Profil pro Denis
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    4 681
    Détails du profil
    Informations personnelles :
    Nom : Homme Denis
    Âge : 21
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2011
    Messages : 4 681
    Points : 13 640
    Points
    13 640

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •