// FICHIER : Coordonnee3B.cp // CLASSE : Coordonnee3B // 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: . //#include "Debug.h" # include using namespace std; //introduces namespace std #include #include "Sortie.h" #include "ConstMath.h" #include "MathUtil.h" #include "Coordonnee3.h" #ifndef COORDONNEE3_H_deja_inclus // Constructeur par defaut // il y a initialisation des coordonnées à zéro #ifndef MISE_AU_POINT inline #endif Coordonnee3B::Coordonnee3B () : CoordonneeB(3,coord3) { coord3[0] = 0.;coord3[1] = 0.;coord3[2] = 0.; }; // 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 #ifndef MISE_AU_POINT inline #endif Coordonnee3B::Coordonnee3B (bool ): CoordonneeB(3,coord3) { }; #ifndef MISE_AU_POINT inline #endif Coordonnee3B::Coordonnee3B (double x,double y,double z): CoordonneeB(3,coord3) // Constructeur pour un point a trois dimensions { coord3[0]=x; coord3[1]=y; coord3[2]=z; }; // constructeur fonction d'une adresse memoire ou sont stockee les coordonnees // et d'une dimension ( l'existance de la place mémoire est a la charge // de l'utilisateur. #ifndef MISE_AU_POINT inline #endif Coordonnee3B::Coordonnee3B (double* t): CoordonneeB(3,coord3) { coord3[0]=t[0]; coord3[1]=t[1]; coord3[2]=t[2]; }; // Constructeur de copie #ifndef MISE_AU_POINT inline #endif Coordonnee3B::Coordonnee3B (const Coordonnee3B& c): CoordonneeB(3,coord3) { coord3[0]=c.coord3[0];coord3[1]=c.coord3[1];coord3[2]=c.coord3[2]; }; // Constructeur de copie pour une instance indiférenciée #ifndef MISE_AU_POINT inline #endif Coordonnee3B::Coordonnee3B (const CoordonneeB& c): CoordonneeB(3,coord3) { #ifdef MISE_AU_POINT if (c.Dimension () != 3) { cout << "\nErreur la dimension de c est différente de 3 !! !\n"; cout << "Coordonnee3B::Coordonnee3B (const Coordonnee& c) \n"; Sortie(1); } #endif coord3[0]=c(1);coord3[1]=c(2); coord3[2]=c(3); }; // DESTRUCTEUR : #ifndef MISE_AU_POINT inline #endif Coordonnee3B::~Coordonnee3B () { dim = 0; // pour l'appel de ~Coordonnee() #ifdef MISE_AU_POINT coord=NULL; #endif }; // 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 #ifndef MISE_AU_POINT inline #endif void Coordonnee3B::Libere () { #ifdef MISE_AU_POINT cout << "\nErreur cette fonction n'a pas cours !! !\n"; cout << "Coordonnee3B::Libere () \n"; Sortie(1); #endif }; // Renvoie le nombre de coordonnees #ifndef MISE_AU_POINT inline #endif int Coordonnee3B::Dimension () const { return 3; }; // changement de la dimension // fonction définie dans la classe mère générique mais qui n'a pas de // sens ici #ifndef MISE_AU_POINT inline #endif void Coordonnee3B::Change_dim(int ) { #ifdef MISE_AU_POINT cout << "\nErreur cette fonction n'a pas cours !! !\n"; cout << "Coordonnee3B::Change_dim(int dimen) \n"; Sortie(1); #endif }; // Surcharge de l'operateur = : realise l'affectation entre deux points #ifndef MISE_AU_POINT inline #endif Coordonnee3B& Coordonnee3B::operator= (const Coordonnee3B& c) { coord3[0]=c.coord3[0];coord3[1]=c.coord3[1];coord3[2]=c.coord3[2]; return (*this); }; // Surcharge de l'operateur - : renvoie l'oppose d'un point #ifndef MISE_AU_POINT inline #endif Coordonnee3B Coordonnee3B::operator- () const { return Coordonnee3B(-coord3[0],-coord3[1],-coord3[2]); }; // Surcharge de l'operateur - : realise la soustraction des // coordonnees de deux points #ifndef MISE_AU_POINT inline #endif Coordonnee3B Coordonnee3B::operator- (const Coordonnee3B& c) const { return Coordonnee3B(coord3[0]-c.coord3[0],coord3[1]-c.coord3[1], coord3[2]-c.coord3[2]); }; // Surcharge de l'operateur + : realise l'addition des // coordonnees de deux points #ifndef MISE_AU_POINT inline #endif Coordonnee3B Coordonnee3B::operator+ (const Coordonnee3B& c) const { return Coordonnee3B(coord3[0]+c.coord3[0],coord3[1]+c.coord3[1], coord3[2]+c.coord3[2]); }; // Surcharge de l'operateur += #ifndef MISE_AU_POINT inline #endif void Coordonnee3B::operator+= (const Coordonnee3B& c) { coord3[0]+=c.coord3[0]; coord3[1]+=c.coord3[1]; coord3[2]+=c.coord3[2]; }; // Surcharge de l'operateur -= #ifndef MISE_AU_POINT inline #endif void Coordonnee3B::operator-= (const Coordonnee3B& c) { coord3[0]-=c.coord3[0]; coord3[1]-=c.coord3[1]; coord3[2]-=c.coord3[2]; }; // Surcharge de l'operateur *= #ifndef MISE_AU_POINT inline #endif void Coordonnee3B::operator*= (double val) { coord3[0]*=val;coord3[1]*=val;coord3[2]*=val; }; // Surcharge de l'operateur * : multiplication de coordonnees par un scalaire #ifndef MISE_AU_POINT inline #endif Coordonnee3B Coordonnee3B::operator* (double val) const { return Coordonnee3B(val*coord3[0],val*coord3[1],val*coord3[2]); }; // Surcharge de l'operateur * : produit scalaire entre coordonnees #ifndef MISE_AU_POINT inline #endif double Coordonnee3B::operator* (const Coordonnee3H& c) const { return ( coord3[0] * c.coord3[0] + coord3[1] * c.coord3[1] + coord3[2] * c.coord3[2] ); }; // produit scalaire entre coordonnees covariantes et covariantes #ifndef MISE_AU_POINT inline #endif double Coordonnee3B::ScalBB(const Coordonnee3B& c) const { return ( coord3[0] * c.coord3[0] + coord3[1] * c.coord3[1] + coord3[2] * c.coord3[2] ); }; // Surcharge de l'operateur / : division de coordonnees par un scalaire #ifndef MISE_AU_POINT inline #endif Coordonnee3B Coordonnee3B::operator/ (double val) const { #ifdef MISE_AU_POINT if(Dabs(val) <= ConstMath::trespetit) { cout << "\n erreur, division par zero "; cout << "\nCoordonnee3B::operator/ (double val) " << endl; Sortie (1); } #endif return Coordonnee3B(coord3[0] / val,coord3[1] / val,coord3[2] / val); }; // Surcharge de l'operateur /= : division de coordonnees par un scalaire #ifndef MISE_AU_POINT inline #endif void Coordonnee3B::operator/= (double val) { #ifdef MISE_AU_POINT if(Dabs(val) <= ConstMath::trespetit) { cout << "\n erreur, division par zero "; cout << "\nCoordonnee3B::operator/= (double val) " << endl; Sortie (1); } #endif coord3[0]/=val;coord3[1]/=val;coord3[2]/=val; }; // Surcharge de l'operateur == : test d'egalite // Renvoie 1 si les deux positions sont identiques // Renvoie 0 sinon #ifndef MISE_AU_POINT inline #endif int Coordonnee3B::operator== (const Coordonnee3B& c) const { if ((c.coord3[0]!=coord3[0]) || (c.coord3[1]!=coord3[1]) || (c.coord3[2]!=coord3[2])) return 0; else return 1; }; // mise a zero des coordonnées #ifndef MISE_AU_POINT inline #endif void Coordonnee3B::Zero() { coord3[0] = 0.;coord3[1] = 0.;coord3[2] = 0.; }; // Calcul de la norme euclidienne des composantes du point #ifndef MISE_AU_POINT inline #endif double Coordonnee3B::Norme () const { return sqrt( coord3[0] * coord3[0] + coord3[1] * coord3[1] + coord3[2] * coord3[2] ); }; // norme le vecteur coordonnée #ifndef MISE_AU_POINT inline #endif Coordonnee3B& Coordonnee3B::Normer () { double norme = this->Norme(); #ifdef MISE_AU_POINT if(Dabs(norme) <= ConstMath::trespetit) { cout << "\n erreur, division par zero "; cout << "\nCoordonnee3B::Normer () " << endl; Sortie (1); } #endif *this /= norme; return *this ; }; // somme de tous les composantes #ifndef MISE_AU_POINT inline #endif double Coordonnee3B::Somme() const { return ( coord3[0] + coord3[1] + coord3[2] ); }; // calcul du déterminant de trois vecteurs #ifndef MISE_AU_POINT inline #endif double Coordonnee3B::Determinant3B( const Coordonnee3B & v1, const Coordonnee3B & v2, const Coordonnee3B & v3) { double toto= ( (v1.coord3[1] * v2.coord3[2] - v2.coord3[1] * v1.coord3[2])* v3.coord3[0] +(v2.coord3[0] * v1.coord3[2] - v1.coord3[0] * v2.coord3[2])* v3.coord3[1] +(v1.coord3[0] * v2.coord3[1] - v2.coord3[0] * v1.coord3[1])* v3.coord3[2] ) ; return toto; }; // calcul du produit vectoriel de 2 vecteurs coordonnées #ifndef MISE_AU_POINT inline #endif Coordonnee3H Coordonnee3B::Vectoriel( const Coordonnee3B & v1, const Coordonnee3B & v2) { Coordonnee3H ret((v1.coord3[1] * v2.coord3[2] - v2.coord3[1] * v1.coord3[2]), (v2.coord3[0] * v1.coord3[2] - v1.coord3[0] * v2.coord3[2]), (v1.coord3[0] * v2.coord3[1] - v2.coord3[0] * v1.coord3[1])); return ret; }; /* // Surcharge de l'operateur * : multiplication entre un scalaire et des coordonnees #ifndef MISE_AU_POINT inline #endif Coordonnee3B operator* (double val,const Coordonnee3B& c) { return Coordonnee3B(val*c.coord3[0],val*c.coord3[1],val*c.coord3[2]);}; */ #ifndef MISE_AU_POINT inline #endif // sortie du schemaXML: en fonction de enu void Coordonnee3B::SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) { switch (enu) { case XML_TYPE_GLOBAUX : {sort << "\n " << "\n" << "\n " << "\n coordonnee de dimension 3: elements: " << "\n 3 reels " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n " << "\n"; break; } case XML_IO_POINT_INFO : { break; } case XML_IO_POINT_BI : { break; } case XML_IO_ELEMENT_FINI : { break; } }; }; #endif