// FICHIER : Coordonnee2.h // CLASSE : Coordonnee2 // This file is part of the Herezh++ application. // // The finite element software Herezh++ is dedicated to the field // of mechanics for large transformations of solid structures. // It is developed by Gérard Rio (APP: IDDN.FR.010.0106078.000.R.P.2006.035.20600) // INSTITUT DE RECHERCHE DUPUY DE LÔME (IRDL) . // // Herezh++ is distributed under GPL 3 license ou ultérieure. // // Copyright (C) 1997-2021 Université Bretagne Sud (France) // AUTHOR : Gérard Rio // E-MAIL : gerardrio56@free.fr // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, // or (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // For more information, please consult: . /************************************************************************ * DATE: 23/01/97 * * $ * * AUTEUR: G RIO * * $ * * PROJET: Herezh++ * * $ * ************************************************************************ * BUT: Les classes Coordonnee2 servent a la localisation dans l'espace * * 2D des objets tels que les noeuds ou les points. Ces classes * * dérivent des Classes génériques Coordonnee. * * $ * * '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' * ************************************************************************/ #ifndef COORDONNEE2_H #define COORDONNEE2_H //#include "Debug.h" #include #include #include #include "Sortie.h" #include "Coordonnee.h" /** @defgroup Les_classes_coordonnee2 * * BUT: Les classes Coordonnee1 servent a la localisation dans l'espace * 2D des objets tels que les noeuds ou les points. Ces classes * dérivent des Classes génériques Coordonnee. * \author Gérard Rio * \version 1.0 * \date 23/01/97 * \brief Définition des classes de type Coordonnee2, en coordonnées sans variance (ex: absolues) * ou en coordonnées locales c'est-à-dire en coordonnées covariantes ou contravariantes. Ces classes sont une spécialisation 2D des classes générales Coordonnee * */ /// @addtogroup Les_classes_coordonnee2 /// @{ /// //============================================================================== //! cas des coordonnées simples sans variance //============================================================================== class Coordonnee2 : public Coordonnee { public : // Surcharge de l'operateur * : multiplication entre un scalaire et des coordonnees inline friend Coordonnee2 operator* (double val,const Coordonnee2& c) { return Coordonnee2(val*c.coord2[0],val*c.coord2[1]);}; // CONSTRUCTEURS : /*! \brief // Constructeur par defaut // il y a initialisation des coordonnées à zéro par défaut */ Coordonnee2 (); /*! \brief // Constructeur suivant un booleen // quelque soit la valeur du booleen il n'y a pas initialisation des coordonnées // ceci pour aller plus vite par rapport au constructeur par défaut */ Coordonnee2 (bool test ); /// Constructeur pour une localisation bidimensionnelle Coordonnee2 (double x,double y); /*! \brief // constructeur fonction d'une adresse memoire ou sont stockee les coordonnees // ( l'existance de la place mémoire est a la charge // de l'utilisateur !!). */ Coordonnee2 (double* t); /// Constructeur fonction d'un vecteur qui doit avoir une 2 Coordonnee2 ( const Vecteur& vec); /// Constructeur de copie Coordonnee2 (const Coordonnee2& c); /// Constructeur de copie pour une instance indiférenciée Coordonnee2 (const Coordonnee& c); /// DESTRUCTEUR : virtual ~Coordonnee2 () ; // METHODES : /// Renvoie le nombre de coordonnees int Dimension () const ; // Desallocation de la place memoire allouee // fonction définie dans la classe mère générique mais qui n'a pas de // sens ici void Libere (); // Renvoie le nombre de coordonnees //int Dimension () const ; /*! \brief // changement de la dimension // fonction définie dans la classe mère générique mais qui n'a pas de // sens ici, affiche un message d'erreur */ void Change_dim(int dim); /// Surcharge de l'operateur = : realise l'affectation entre deux points Coordonnee2& operator= (const Coordonnee2& c); /// Surcharge de l'operateur - : renvoie l'oppose d'un point Coordonnee2 operator- () const ; /*! \brief // Surcharge de l'operateur - : realise la soustraction des // coordonnees de deux points */ Coordonnee2 operator- (const Coordonnee2& c) const ; /*! \brief // Surcharge de l'operateur + : realise l'addition des // coordonnees de deux points */ Coordonnee2 operator+ (const Coordonnee2& c) const ; /// Surcharge de l'operateur += void operator+= (const Coordonnee2& c); /// Surcharge de l'operateur -= void operator-= (const Coordonnee2& c); /// Surcharge de l'operateur *= void operator*= (double val); /// Surcharge de l'operateur * : multiplication de coordonnees par un scalaire Coordonnee2 operator* (double val) const ; /// Surcharge de l'operateur * : produit scalaire entre coordonnees double operator* (const Coordonnee2& c) const ; /// Surcharge de l'operateur / : division de coordonnees par un scalaire Coordonnee2 operator/ (double val) const ; /// Surcharge de l'operateur /= : division de coordonnees par un scalaire void operator/= (double val) ; /*! \brief // Surcharge de l'operateur == : test d'egalite // Renvoie 1 si les deux positions sont identiques // Renvoie 0 sinon */ int operator== (const Coordonnee2& c) const; /// conversion en Vecteur Vecteur Vect() const ; /// mise a zero des coordonnées void Zero() ; /// Calcul de la norme euclidienne des composantes du point double Norme () const ; /// norme le vecteur coordonnée Coordonnee2& Normer (); /// somme de tous les composantes double Somme() const ; /// sortie du schemaXML: en fonction de enu static void SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) ; protected : double coord2[2]; }; /// @} // end of group /// @addtogroup Les_classes_coordonnee2 /// @{ /// class Coordonnee2B; // défini par la suite ( nécessaire pour le produit scalaire) //============================================================================== //! cas des coordonnées contravariantes //============================================================================== class Coordonnee2H : public CoordonneeH { public : friend class Coordonnee2B; // Surcharge de l'operateur * : multiplication entre un scalaire et des coordonnees inline friend Coordonnee2H operator* (double val,const Coordonnee2H& c) { return Coordonnee2H(val*c.coord2[0],val*c.coord2[1]);}; // CONSTRUCTEURS : /*! \brief // Constructeur par defaut // il y a initialisation des coordonnées à zéro par défaut */ Coordonnee2H (); /*! \brief // Constructeur suivant un booleen // quelque soit la valeur du booleen il n'y a pas initialisation des coordonnées // ceci pour aller plus vite par rapport au constructeur par défaut */ Coordonnee2H (bool test ); /// Constructeur pour une localisation bidimensionnelle Coordonnee2H (double x,double y); /*! \brief // constructeur fonction d'une adresse memoire ou sont stockee les coordonnees // ( l'existance de la place mémoire est a la charge // de l'utilisateur !!). */ Coordonnee2H (double* t); /// Constructeur fonction d'un vecteur qui doit avoir une 2 Coordonnee2H ( const Vecteur& vec); /// Constructeur de copie Coordonnee2H (const Coordonnee2H& c); /// Constructeur de copie pour une instance indiférenciée Coordonnee2H (const CoordonneeH& c); /// DESTRUCTEUR : virtual ~Coordonnee2H () ; // METHODES : /// Renvoie le nombre de coordonnees int Dimension () const ; /*! \brief // Desallocation de la place memoire allouee // fonction définie dans la classe mère générique mais qui n'a pas de // sens ici */ void Libere (); // Renvoie le nombre de coordonnees //int Dimension () const ; /*! \brief // changement de la dimension // fonction définie dans la classe mère générique mais qui n'a pas de // sens ici, affiche un message d'erreur */ void Change_dim(int dim); /// Surcharge de l'operateur = : realise l'affectation entre deux points Coordonnee2H& operator= (const Coordonnee2H& c); /// Surcharge de l'operateur - : renvoie l'oppose d'un point Coordonnee2H operator- () const ; /*! \brief // Surcharge de l'operateur - : realise la soustraction des // coordonnees de deux points */ Coordonnee2H operator- (const Coordonnee2H& c) const ; /*! \brief // Surcharge de l'operateur + : realise l'addition des // coordonnees de deux points */ Coordonnee2H operator+ (const Coordonnee2H& c) const ; /// Surcharge de l'operateur += void operator+= (const Coordonnee2H& c); /// Surcharge de l'operateur -= void operator-= (const Coordonnee2H& c); /// Surcharge de l'operateur *= void operator*= (double val); /// Surcharge de l'operateur * : multiplication de coordonnees par un scalaire Coordonnee2H operator* (double val) const ; /// Surcharge de l'operateur * : produit scalaire entre coordonnees double operator* (const Coordonnee2B& c) const ; /// produit scalaire entre coordonnees contravariantes et contravariantes double ScalHH(const Coordonnee2H& c) const ; /// Surcharge de l'operateur / : division de coordonnees par un scalaire Coordonnee2H operator/ (double val) const ; /// Surcharge de l'operateur /= : division de coordonnees par un scalaire void operator/= (double val) ; /*! \brief // Surcharge de l'operateur == : test d'egalite // Renvoie 1 si les deux positions sont identiques // Renvoie 0 sinon */ int operator== (const Coordonnee2H& c) const; /// conversion en Vecteur Vecteur Vect() const ; /// mise a zero des coordonnées void Zero() ; /// Calcul de la norme euclidienne des composantes du point double Norme () const ; /// norme le vecteur coordonnée Coordonnee2H& Normer (); /// somme de tous les composantes double Somme() const ; /// sortie du schemaXML: en fonction de enu static void SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) ; protected : double coord2[2]; }; /// @} // end of group /// @addtogroup Les_classes_coordonnee2 /// @{ /// //============================================================================== //! cas des coordonnées covariantes //============================================================================== class Coordonnee2B : public CoordonneeB { public : friend class Coordonnee2H; /// Surcharge de l'operateur * : multiplication entre un scalaire et des coordonnees inline friend Coordonnee2B operator* (double val,const Coordonnee2B& c) { return Coordonnee2B(val*c.coord2[0],val*c.coord2[1]);}; // CONSTRUCTEURS : /*! \brief // Constructeur par defaut // il y a initialisation des coordonnées à zéro par défaut */ Coordonnee2B (); /*! \brief // Constructeur suivant un booleen // quelque soit la valeur du booleen il n'y a pas initialisation des coordonnées // ceci pour aller plus vite par rapport au constructeur par défaut */ Coordonnee2B (bool test ); /// Constructeur pour une localisation bidimensionnelle Coordonnee2B (double x,double y); /*! \brief // constructeur fonction d'une adresse memoire ou sont stockee les coordonnees // ( l'existance de la place mémoire est a la charge // de l'utilisateur !!). */ Coordonnee2B (double* t); /// Constructeur fonction d'un vecteur qui doit avoir une 2 Coordonnee2B ( const Vecteur& vec); /// Constructeur de copie Coordonnee2B (const Coordonnee2B& c); /// Constructeur de copie pour une instance indiférenciée Coordonnee2B (const CoordonneeB& c); /// DESTRUCTEUR : virtual ~Coordonnee2B () ; // METHODES : /// Renvoie le nombre de coordonnees int Dimension () const ; /*! \brief // Desallocation de la place memoire allouee // fonction définie dans la classe mère générique mais qui n'a pas de // sens ici */ void Libere (); // Renvoie le nombre de coordonnees //int Dimension () const ; /*! \brief // changement de la dimension // fonction définie dans la classe mère générique mais qui n'a pas de // sens ici, affiche un message d'erreur */ void Change_dim(int dim); /// Surcharge de l'operateur = : realise l'affectation entre deux points Coordonnee2B& operator= (const Coordonnee2B& c); /// Surcharge de l'operateur - : renvoie l'oppose d'un point Coordonnee2B operator- () const ; /*! \brief // Surcharge de l'operateur - : realise la soustraction des // coordonnees de deux points */ Coordonnee2B operator- (const Coordonnee2B& c) const ; /*! \brief // Surcharge de l'operateur + : realise l'addition des // coordonnees de deux points */ Coordonnee2B operator+ (const Coordonnee2B& c) const ; /// Surcharge de l'operateur += void operator+= (const Coordonnee2B& c); /// Surcharge de l'operateur -= void operator-= (const Coordonnee2B& c); /// Surcharge de l'operateur *= void operator*= (double val); /// Surcharge de l'operateur * : multiplication de coordonnees par un scalaire Coordonnee2B operator* (double val) const ; /// Surcharge de l'operateur * : produit scalaire entre coordonnees double operator* (const Coordonnee2H& c) const ; /// produit scalaire entre coordonnees covariantes et covariantes double ScalBB(const Coordonnee2B& c) const ; /// Surcharge de l'operateur / : division de coordonnees par un scalaire Coordonnee2B operator/ (double val) const ; /// Surcharge de l'operateur /= : division de coordonnees par un scalaire void operator/= (double val) ; /*! \brief // Surcharge de l'operateur == : test d'egalite // Renvoie 1 si les deux positions sont identiques // Renvoie 0 sinon */ int operator== (const Coordonnee2B& c) const; /// conversion en Vecteur Vecteur Vect() const ; /// mise a zero des coordonnées void Zero() ; /// Calcul de la norme euclidienne des composantes du point double Norme () const ; /// norme le vecteur coordonnée Coordonnee2B& Normer (); /// somme de tous les composantes double Somme() const ; /// sortie du schemaXML: en fonction de enu static void SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) ; /// calcul du déterminant de deux vecteurs coordonnées static double Determinant2B( const Coordonnee2B & v1, const Coordonnee2B & v2); protected : double coord2[2]; }; /// @} // end of group #ifndef MISE_AU_POINT #include "Coordonnee2.cc" #include "Coordonnee2H.cc" #include "Coordonnee2B.cc" #define COORDONNEE2_H_deja_inclus #endif #endif