Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Débuter
Débuter Forum d'entraide pour débuter en langage de programmation C++. Avant de poster : cours d'initiation au C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 26/02/2013, 15h04   #1
Th0ms0n
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 25
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 : 25
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.
Th0ms0n est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 15h18   #2
dourouc05
Responsable Qt & Web sémantique

 
Avatar de dourouc05
 
Homme Thibaut Cuvelier
Étudiant
Inscription : août 2008
Messages : 18 580
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 : 18 580
Points : 74 126
Points : 74 126
Envoyer un message via MSN à dourouc05 Envoyer un message via Yahoo à dourouc05


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.

Pas de question d'ordre technique par MP !
dourouc05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 15h32   #3
Th0ms0n
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 25
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 : 25
Points : 0
Points : 0
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 :
Th0ms0n est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 15h43   #4
Th0ms0n
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 25
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 : 25
Points : 0
Points : 0
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;
}
Th0ms0n est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 19h50   #5
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 612
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 612
Points : 7 162
Points : 7 162
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
Bonjour,
As-tu bien pensé au cas où A.x = B.x ou A.y = B.y ou A.z = B.z.
(ou inclusif) ?
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 21h36   #6
Th0ms0n
Invité de passage
 
Homme
Étudiant
Inscription : février 2013
Messages : 25
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 : 25
Points : 0
Points : 0
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.
Th0ms0n est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 07h07   #7
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 612
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 612
Points : 7 162
Points : 7 162
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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.
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 15h43.


 
 
 
 
Partenaires

Hébergement Web