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 :

Définir une Classe triangle


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Définir une Classe triangle
    J'ai une classe triangle à faire, mais il me faut des idées sur ce que l'on pet faire sur un triangle et comment on peut le définir.

    - Trois points déja
    - Calcule de la surface
    - surcharge de l'opérateur =

    Mais pour l'opérateur == comment voir si deux triangles st identiques ?
    A ouep info : les points sont définis dans R²

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    J'espère qu'avant tout, tu disposes d'une classe Point.

    Avant de surcharger l'opérateur =, je me serais déjà demandé si c'était nécessaire.
    http://cpp.developpez.com/faq/cpp/?p...GE_affectation
    Il faudra écrire explicitement un opérateur d'affectation dès lors qu'une simple affectation membre à membre des données de votre classe n'est plus suffisante, par exemple si elle gère une ressource (un pointeur brut, une connexion à une base de données, une texture en mémoire vidéo, ...).
    Donc, question à te poser avant tout, comment va-tu stocker tes points ? Agrégation ou composition ? De là, en découlera la surcharge ou non de = (mais pas que ça...)

    Tu peux dire que deux triangles sont identiques quand leurs points sont identiques deux à deux (ça t'oblige à plusieurs tests d'égalité au pire 6)

    Tu pourrais rajouter :
    • translation
    • rotation

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Stockage des points
    Je stocke mes points par composition, j'ai une classe point et vecteur

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Donc, à priori, tu n'utiliseras pas de pointeur pour stocker tes points, donc aucun intérêt de surcharger l'opérateur =. Le compilateur le fera très bien à ta place.

    Très bien la classe vecteur mais c'est pour quoi ? Faire des translations ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Explication
    Je t'explique, j'ai un test samedi, et le prof ns a dit sa tombe sur triangle, vecteur et point sans ns donner de .h donc on doit réfléchir a tt ce qu'on peut faire sur un triangle, un vecteur et sur un point, donc point et ds R².
    Un vecteur lui on peut le transposer, mais aussi le surcharger :
    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
     
    class Vecteur : public CObject {
    DECLARE_SERIAL (Vecteur)
    private :
    	double m_dX;
    	double m_dY;
    public :
    	Vecteur () {}
    	Vecteur (double, double);
    	Vecteur (Point, Point);
    	Vecteur (Vecteur&);
     
    	double ProjX () { return m_dX; }
    	double ProjY () { return m_dY; }
     
    	Vecteur operator = (Vecteur);		// Surcharge des operateurs
    	Vecteur operator + (Vecteur);
    	Vecteur operator +=(Vecteur);
    	Vecteur operator - (Vecteur);
    	Vecteur operator -=(Vecteur);
    	double  operator * (Vecteur);		// Attention : produit scalaire !
    	bool operator == (Vecteur);
    	bool operator != (Vecteur);
    	friend ostream& operator <<(ostream&, Vecteur);
     
    	double Norme ();					// Declaration des services				
    	bool Colineaire(Vecteur);
    	bool DeMemeSens(Vecteur);
    	bool Orthogonal(Vecteur);
    };

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Points : 1 069
    Points
    1 069
    Par défaut
    Ca manque de const et de référence toutes ces déclarations. A moins que vous ne l'ayez pas encore vu...

    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
    32
    33
    34
    35
     
    class Vecteur : public CObject {
      DECLARE_SERIAL (Vecteur)
     
    private :
      double m_dX;
      double m_dY;
     
    public :
     
      Vecteur () : m_dX (0) , m_dY (0) {} // au moins initialiser à 0 ?
      Vecteur (double, double);
      Vecteur (const Point &, const Point &);
      Vecteur (const Vecteur &);
     
      double ProjX () const { return m_dX; }
      double ProjY () const { return m_dY; }
     
      // Vecteur & operator = (const Vecteur &); // Inutile
      Vecteur   operator +  (const Vecteur &) const;
      Vecteur & operator += (const Vecteur &);
      Vecteur   operator -  (const Vecteur &) const;
      Vecteur & operator -= (const Vecteur &);
      double    operator *  (const Vecteur &) const;
      bool      operator == (const Vecteur &) const;
      bool      operator != (const Vecteur &) const;
     
      friend std::ostream & operator << (std::ostream &, const Vecteur &);
     
      double Norme () const;
      bool Colineaire(const Vecteur &) const;
      bool DeMemeSens(const Vecteur &) const;
      bool Orthogonal(const Vecteur &) const;
     
    };

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Je suis toujours gêné par ce genre de question. L'interface d'une classe ne se conçoit pas sans un contexte d'utilisation. En informatique, l'essence précède l'existence. Une classe triangle pour un logiciel de type illustrator ressemblerait peu à un triangle d'un logiciel de géométrie variationelle, et n'aurait rien à voir avec un triangle d'un moteur 3D.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 29
    Points : 13
    Points
    13
    Par défaut Puzzle
    Le but de cela est de faire un puzzle avec une méthode backtracking mais pour cela il faut peut être avoir les outils....

  9. #9
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Il manque (à mon avis) pas mal de fonctions dans ta classe Vecteur, et aussi beaucoup d'inline... :

    Produit-vectoriel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    inline double  operator ^(const Vector& v) const
    { return v.dy * dx - v.dx * dy; }
    Produit par un scalaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    inline Vector& operator*=(double f)
    { dx *= f; dy *= f; return *this; }
    inline Vector operator*(double f) const
    { return Vector(dx * f ,  dy * f); }
    inline Vector& operator/=(double f)
    { dx /= f; dy /= f; return *this; }
    inline Vector operator/(double f) const
    { return Vector(dx / f ,  dy / f); }
    Sur la normalisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    inline double SquaredLength() const
    { return (dx * dx + dy * dy); }
    inline double RecipSquaredLength() const
    { return 1 / SquaredLength(); }
    inline double Length() const
    { return sqrt(SquaredLength()); }
    inline double RecipLength() const
    { return rsqrt(SquaredLength()); } // <= sur certaines machines rsqrt est intrasèque
    inline Vector& Normalize()
    { return operator *= RecipLength(); }
    Accès aux membres:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    inline double DX(void) const
    { return dx; }
    inline double& DX(void)
    { return dx; }
    inline double DY(void) const
    { return dy; }
    inline double& DY(void)
    { return dy; }
    Quand à la construction, le constructeur "par défaut" devrait ne rien faire du tout, pour permettre de tracker (en debug) facilement les Vecteur non initialiser (et les différentier facilement des Vecteurs nulls)

    Et puis pour finir, les tests.... A bien implémenter en utilisant une fonction à précision variable (les tests d'égalité entre deux flottants sont à éviter, y compris avec 0).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    inline IsNull(void) const
    { return IsDoubleNull(dx) && IsDoubleNull(dy); }
    inline operator bool (void) const
    { return !IsNull() }
    inline operator==(const Vector& v) const
    { return IsDoubleNull(v.dx - dx) && IsDoubleNull(v.dy - dy); }
    inline operator!=(const Vector& v) const
    { return !IsDoubleNull(v.dx - dx) || !IsDoubleNull(v.dy - dy); }
    etc...

  10. #10
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline double  operator ^(const Vector& v) const
    Perso je n'utiliserais pas l'opérateur ^ pour ça, mais plutôt une fonction libre. L'opérateur ^ en C++ n'a ni la même signification, ni les mêmes règles de priorité que l'opérateur mathématique de produit vectoriel.
    Sans parler du fait que le produit scalaire (qui va généralement de paire avec) n'a pas son opérateur en C++.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    inline double RecipSquaredLength() const
    { return 1 / SquaredLength(); }
    N'oublie pas de vérifier le cas où le vecteur est nul

  11. #11
    Expert éminent

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Points : 7 618
    Points
    7 618
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Laurent Gomila Voir le message
    N'oublie pas de vérifier le cas où le vecteur est nul
    Bah... ca fera une jolie exception sans rien toucher !

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,
    Citation Envoyé par nicroman Voir le message
    Quand à la construction, le constructeur "par défaut" devrait ne rien faire du tout, pour permettre de tracker (en debug) facilement les Vecteur non initialiser (et les différentier facilement des Vecteurs nulls)
    Toi tu tombes bien, tu vas pouvoir m'expliquer ça un peu plus précisément.
    Il y a cette fonctionnalité dans ogre par exemple et je trouve ça ... bizarre (ou alors je ne l'utilise pas correctement)...
    D'abord je ne compile quasiment jamais en debug, mais bon mettons...
    Ensuite oui ça fait un vecteur initialisé avec n'importe quoi, et donc en quoi ça m'aide ?
    En quoi si je veux un vecteur nul c'est mieux de devoir l'initialiser manuellement avec 0 (ou par une constante) ?
    Je croyais que c'était l'intérêt du constructeur de justement permettre de réaliser une initialisation correcte en toute circonstance ?

    Comment est-on supposé utiliser cette fonctionnalité ?

    MAT.

  13. #13
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Bah... ca fera une jolie exception sans rien toucher !
    Hmm pour moi une division par 0 ne lève pas d'exception, ça donne std::numeric_limits< double >::infinity().

    Tiens sinon que signifie recip dans RecipSquaredLength() ?
    Ca en vraiment un intérêt d'encombrer la classe avec une méthode qui fait juste 1 / résultat d'une autre méthode ?

    MAT.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    Points : 440
    Points
    440
    Par défaut
    Citation Envoyé par nicroman Voir le message
    Il manque (à mon avis) pas mal de fonctions dans ta classe Vecteur, et aussi beaucoup d'inline... .
    Inline , ca ne sert a rien, les compilo actuels savent mieux que nous comment optimiser le code, et le font ou pas independamment du mot cle inline (idem pour register)

Discussions similaires

  1. Définir une classe css dans le code jquery.
    Par piotrr dans le forum jQuery
    Réponses: 9
    Dernier message: 27/07/2009, 12h56
  2. Définir une classe rectangle
    Par rouliane dans le forum C++
    Réponses: 13
    Dernier message: 21/01/2008, 12h14
  3. Réponses: 19
    Dernier message: 14/08/2007, 15h41
  4. Définir une classe dans une autre classe
    Par acieroid dans le forum C++
    Réponses: 7
    Dernier message: 22/05/2006, 00h24
  5. Définir une class comme élement graphique
    Par Janitrix dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 14/11/2005, 23h41

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