Herezh_dev/tenseurs_mai99/Coordonnees/Coordonnee2.h
2023-05-03 17:23:49 +02:00

491 lines
16 KiB
C++

// 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) <https://www.irdl.fr/>.
//
// Herezh++ is distributed under GPL 3 license ou ultérieure.
//
// Copyright (C) 1997-2022 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 <https://www.gnu.org/licenses/>.
//
// For more information, please consult: <https://herezh.irdl.fr/>.
/************************************************************************
* 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 <iostream>
#include <fstream>
#include <stdlib.h>
#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