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 averti
    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
    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 �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    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 averti
    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
    Par d�faut Stockage des points
    Je stocke mes points par composition, j'ai une classe point et vecteur

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    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 averti
    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
    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 �m�rite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    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 : 51
    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
    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.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  8. #8
    Membre averti
    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
    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 confirm�

    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 confirm�

    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
    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 Expert

    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
    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 Expert

    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
    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 chevronn�
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    366
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 366
    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, 11h56
  2. D�finir une classe rectangle
    Par rouliane dans le forum C++
    R�ponses: 13
    Dernier message: 21/01/2008, 11h14
  3. R�ponses: 19
    Dernier message: 14/08/2007, 14h41
  4. D�finir une classe dans une autre classe
    Par acieroid dans le forum C++
    R�ponses: 7
    Dernier message: 21/05/2006, 23h24
  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, 22h41

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