2021-09-07 09:39:21 +02:00
|
|
|
// FICHIER : Coordonnee2H.cp
|
|
|
|
// CLASSE : Coordonnee2H
|
|
|
|
|
|
|
|
// 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.
|
|
|
|
//
|
2023-05-03 17:23:49 +02:00
|
|
|
// Copyright (C) 1997-2022 Université Bretagne Sud (France)
|
2021-09-07 09:39:21 +02:00
|
|
|
// 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/>.
|
|
|
|
|
|
|
|
//#include "Debug.h"
|
|
|
|
|
|
|
|
# include <iostream>
|
|
|
|
using namespace std; //introduces namespace std
|
|
|
|
#include <stdlib.h>
|
|
|
|
#include "Sortie.h"
|
|
|
|
#include "ConstMath.h"
|
|
|
|
#include "MathUtil.h"
|
|
|
|
|
|
|
|
#include "Coordonnee2.h"
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef COORDONNEE2_H_deja_inclus
|
|
|
|
|
|
|
|
|
|
|
|
// Constructeur par defaut
|
|
|
|
// il y a initialisation des coordonnées à zéro
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H::Coordonnee2H () :
|
|
|
|
CoordonneeH(2,coord2)
|
|
|
|
{ coord2[0] = 0.;coord2[1] = 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
|
|
|
|
Coordonnee2H::Coordonnee2H (bool ):
|
|
|
|
CoordonneeH(2,coord2)
|
|
|
|
{ };
|
|
|
|
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H::Coordonnee2H (double x,double y):
|
|
|
|
CoordonneeH(2,coord2)
|
|
|
|
// Constructeur pour un point a deux dimensions
|
|
|
|
{ coord2[0]=x;
|
|
|
|
coord2[1]=y;
|
|
|
|
};
|
|
|
|
|
|
|
|
// 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
|
|
|
|
Coordonnee2H::Coordonnee2H (double* t):
|
|
|
|
CoordonneeH(2,coord2)
|
|
|
|
{ coord2[0]=t[0];
|
|
|
|
coord2[1]=t[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
// Constructeur de copie
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H::Coordonnee2H (const Coordonnee2H& c):
|
|
|
|
CoordonneeH(2,coord2)
|
|
|
|
{ coord2[0]=c.coord2[0];coord2[1]=c.coord2[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
// Constructeur de copie pour une instance indiférenciée
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H::Coordonnee2H (const CoordonneeH& c):
|
|
|
|
CoordonneeH(2,coord2)
|
|
|
|
{
|
|
|
|
#ifdef MISE_AU_POINT
|
|
|
|
if (c.Dimension () != 2)
|
|
|
|
{ cout << "\nErreur la dimension de c est différente de 2 !! !\n";
|
|
|
|
cout << "Coordonnee2H::Coordonnee2H (const Coordonnee& c) \n";
|
|
|
|
Sortie(1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
coord2[0]=c(1);coord2[1]=c(2);
|
|
|
|
};
|
|
|
|
|
|
|
|
// DESTRUCTEUR :
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H::~Coordonnee2H ()
|
|
|
|
{ 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 Coordonnee2H::Libere ()
|
|
|
|
{
|
|
|
|
#ifdef MISE_AU_POINT
|
|
|
|
cout << "\nErreur cette fonction n'a pas cours !! !\n";
|
|
|
|
cout << "Coordonnee2H::Libere () \n";
|
|
|
|
Sortie(1);
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Renvoie le nombre de coordonnees
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
int Coordonnee2H::Dimension () const
|
|
|
|
{ return 2; };
|
|
|
|
|
|
|
|
// 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 Coordonnee2H::Change_dim(int )
|
|
|
|
{
|
|
|
|
#ifdef MISE_AU_POINT
|
|
|
|
cout << "\nErreur cette fonction n'a pas cours !! !\n";
|
|
|
|
cout << "Coordonnee2H::Change_dim(int dimen) \n";
|
|
|
|
Sortie(1);
|
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur = : realise l'affectation entre deux points
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H& Coordonnee2H::operator= (const Coordonnee2H& c)
|
|
|
|
{ coord2[0]=c.coord2[0];coord2[1]=c.coord2[1];
|
|
|
|
return (*this);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// Surcharge de l'operateur - : renvoie l'oppose d'un point
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H Coordonnee2H::operator- () const
|
|
|
|
{ return Coordonnee2H(-coord2[0],-coord2[1]);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur - : realise la soustraction des
|
|
|
|
// coordonnees de deux points
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H Coordonnee2H::operator- (const Coordonnee2H& c) const
|
|
|
|
{ return Coordonnee2H(coord2[0]-c.coord2[0],coord2[1]-c.coord2[1]);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur + : realise l'addition des
|
|
|
|
// coordonnees de deux points
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H Coordonnee2H::operator+ (const Coordonnee2H& c) const
|
|
|
|
{ return Coordonnee2H(coord2[0]+c.coord2[0],coord2[1]+c.coord2[1]);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur +=
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
void Coordonnee2H::operator+= (const Coordonnee2H& c)
|
|
|
|
{ coord2[0]+=c.coord2[0];
|
|
|
|
coord2[1]+=c.coord2[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur -=
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
void Coordonnee2H::operator-= (const Coordonnee2H& c)
|
|
|
|
{ coord2[0]-=c.coord2[0];
|
|
|
|
coord2[1]-=c.coord2[1];
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur *=
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
void Coordonnee2H::operator*= (double val)
|
|
|
|
{ coord2[0]*=val;coord2[1]*=val;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur * : multiplication de coordonnees par un scalaire
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H Coordonnee2H::operator* (double val) const
|
|
|
|
{
|
|
|
|
return Coordonnee2H(val*coord2[0],val*coord2[1]);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur * : produit scalaire entre coordonnees
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
double Coordonnee2H::operator* (const Coordonnee2B& c) const
|
|
|
|
{ return ( coord2[0] * c.coord2[0] + coord2[1] * c.coord2[1] );
|
|
|
|
};
|
|
|
|
|
|
|
|
// produit scalaire entre coordonnees contravariantes et contravariantes
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
double Coordonnee2H::ScalHH(const Coordonnee2H& c) const
|
|
|
|
{ return ( coord2[0] * c.coord2[0] + coord2[1] * c.coord2[1] );
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur / : division de coordonnees par un scalaire
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H Coordonnee2H::operator/ (double val) const
|
|
|
|
{
|
|
|
|
#ifdef MISE_AU_POINT
|
|
|
|
if(Dabs(val) <= ConstMath::trespetit)
|
|
|
|
{ cout << "\n erreur, division par zero ";
|
|
|
|
cout << "\nCoordonnee2H::operator/ (double val) " << endl;
|
|
|
|
Sortie (1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return Coordonnee2H(coord2[0] / val,coord2[1] / val);
|
|
|
|
};
|
|
|
|
|
|
|
|
// Surcharge de l'operateur /= : division de coordonnees par un scalaire
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
void Coordonnee2H::operator/= (double val)
|
|
|
|
{
|
|
|
|
#ifdef MISE_AU_POINT
|
|
|
|
if(Dabs(val) <= ConstMath::trespetit)
|
|
|
|
{ cout << "\n erreur, division par zero ";
|
|
|
|
cout << "\nCoordonnee2H::operator/= (double val) " << endl;
|
|
|
|
Sortie (1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
coord2[0]/=val;coord2[1]/=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 Coordonnee2H::operator== (const Coordonnee2H& c) const
|
|
|
|
{ if ((c.coord2[0]!=coord2[0]) || (c.coord2[1]!=coord2[1]))
|
|
|
|
return 0;
|
|
|
|
else
|
|
|
|
return 1;
|
|
|
|
};
|
|
|
|
|
|
|
|
// mise a zero des coordonnées
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
void Coordonnee2H::Zero()
|
|
|
|
{ coord2[0] = 0.;coord2[1] = 0.;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Calcul de la norme euclidienne des composantes du point
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
double Coordonnee2H::Norme () const
|
|
|
|
{ return sqrt( coord2[0] * coord2[0] + coord2[1] * coord2[1] );
|
|
|
|
};
|
|
|
|
// norme le vecteur coordonnée
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H& Coordonnee2H::Normer ()
|
|
|
|
{ double norme = this->Norme();
|
|
|
|
#ifdef MISE_AU_POINT
|
|
|
|
if(Dabs(norme) <= ConstMath::trespetit)
|
|
|
|
{ cout << "\n erreur, division par zero ";
|
|
|
|
cout << "\nCoordonnee2H::Normer () " << endl;
|
|
|
|
Sortie (1);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
*this /= norme;
|
|
|
|
return *this ;
|
|
|
|
};
|
|
|
|
|
|
|
|
// somme de tous les composantes
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
double Coordonnee2H::Somme() const
|
|
|
|
{ return ( coord2[0] + coord2[1] );
|
|
|
|
};
|
|
|
|
|
|
|
|
/* // Surcharge de l'operateur * : multiplication entre un scalaire et des coordonnees
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
Coordonnee2H operator* (double val,const Coordonnee2H& c)
|
|
|
|
{ return Coordonnee2H(val*c.coord2[0],val*c.coord2[1]);}; */
|
|
|
|
#ifndef MISE_AU_POINT
|
|
|
|
inline
|
|
|
|
#endif
|
|
|
|
// sortie du schemaXML: en fonction de enu
|
|
|
|
void Coordonnee2H::SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu)
|
|
|
|
{
|
|
|
|
switch (enu)
|
|
|
|
{ case XML_TYPE_GLOBAUX :
|
|
|
|
{sort << "\n <!-- *************************** CoordonneeH dim 2 *************************** -->"
|
|
|
|
<< "\n<xs:complexType name=\"COORDONNEE_2H\" >"
|
|
|
|
<< "\n <xs:annotation>"
|
|
|
|
<< "\n <xs:documentation> coordonnee de dimension 2: elements: "
|
|
|
|
<< "\n 2 reels "
|
|
|
|
<< "\n </xs:documentation>"
|
|
|
|
<< "\n </xs:annotation>"
|
|
|
|
<< "\n <xs:sequence>"
|
|
|
|
<< "\n <xs:element name=\"coordonnees\" >"
|
|
|
|
<< "\n <xs:simpleType>"
|
|
|
|
<< "\n <xs:restriction base=\"liste_de_reels\">"
|
|
|
|
<< "\n <xs:minLength value=\"2\" />"
|
|
|
|
<< "\n <xs:maxLength value=\"2\" />"
|
|
|
|
<< "\n </xs:restriction>"
|
|
|
|
<< "\n </xs:simpleType>"
|
|
|
|
<< "\n </xs:element>"
|
|
|
|
<< "\n </xs:sequence>"
|
|
|
|
<< "\n</xs:complexType>";
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case XML_IO_POINT_INFO :
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case XML_IO_POINT_BI :
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
case XML_IO_ELEMENT_FINI :
|
|
|
|
{
|
|
|
|
break;
|
|
|
|
}
|
2023-05-03 17:23:49 +02:00
|
|
|
default: cout << "\n *** attention cas non pris en compte pour le moment "
|
|
|
|
<< " XML_TYPE_GLOBAUX= "<<XML_TYPE_GLOBAUX
|
|
|
|
<< " Coordonnee2H::SchemaXML_Coordonnee(ofstream& sort,const Enum_IO_XML enu) "
|
|
|
|
<< endl;
|
2021-09-07 09:39:21 +02:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|