Version: 8.3.0
Main Page
Related Pages
Packages
Data Structures
Files
File List
Globals
SALOME Mesh Module Developer
Use the SpherePadder SMESH Plugin
Todo List
Packages
Data Structures
Files
File List
idl
src
Controls
Driver
DriverCGNS
DriverDAT
DriverGMF
DriverMED
DriverSTL
DriverUNV
MEDWrapper
MEFISTO2
aptrte.cxx
aptrte.h
Rn.h
OBJECT
PluginUtils
SMDS
SMESH
SMESH_I
SMESH_SWIG_WITHIHM
SMESHClient
SMESHDS
SMESHFiltersSelection
SMESHGUI
SMESHUtils
StdMeshers
StdMeshers_I
StdMeshersGUI
Tools
Globals
Rn.h
Go to the documentation of this file.
1
// MEFISTO : library to compute 2D triangulation from segmented boundaries
2
//
3
// Copyright (C) 2006-2016 CEA/DEN, EDF R&D, OPEN CASCADE
4
//
5
// This library is free software; you can redistribute it and/or
6
// modify it under the terms of the GNU Lesser General Public
7
// License as published by the Free Software Foundation; either
8
// version 2.1 of the License, or (at your option) any later version.
9
//
10
// This library is distributed in the hope that it will be useful,
11
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
// Lesser General Public License for more details.
14
//
15
// You should have received a copy of the GNU Lesser General Public
16
// License along with this library; if not, write to the Free Software
17
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18
//
19
// See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
20
//
21
// File : Rn.h
22
// Module : SMESH
23
// Authors: Frederic HECHT & Alain PERRONNET
24
// Date : 13 novembre 2006
25
26
#ifndef Rn__h
27
#define Rn__h
28
29
#include <gp_Pnt.hxx>
//Dans OpenCascade
30
#include <gp_Vec.hxx>
//Dans OpenCascade
31
#include <gp_Dir.hxx>
//Dans OpenCascade
32
33
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
34
// BUT: Definir les espaces affines R R2 R3 R4 soit Rn pour n=1,2,3,4
35
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
36
// AUTEUR : Frederic HECHT ANALYSE NUMERIQUE UPMC PARIS OCTOBRE 2000
37
// MODIFS : Alain PERRONNET ANALYSE NUMERIQUE UPMC PARIS NOVEMBRE 2000
38
//...............................................................................
39
#include <iostream>
40
#include <cmath>
41
42
43
template
<
class
T>
inline
T
Abs
(
const
T &a){
return
a <0 ? -a : a;}
44
template
<
class
T>
inline
void
Echange
(T& a,T& b) {T c=a;a=b;b=c;}
45
46
template
<
class
T>
inline
T
Min
(
const
T &a,
const
T &b) {
return
a < b ? a : b;}
47
template
<
class
T>
inline
T
Max
(
const
T &a,
const
T & b) {
return
a > b ? a : b;}
48
49
template
<
class
T>
inline
T
Max
(
const
T &a,
const
T & b,
const
T & c){
return
Max
(
Max
(a,b),c);}
50
template
<
class
T>
inline
T
Min
(
const
T &a,
const
T & b,
const
T & c){
return
Min
(
Min
(a,b),c);}
51
52
template
<
class
T>
inline
T
Max
(
const
T &a,
const
T & b,
const
T & c,
const
T &
d
)
53
{
return
Max
(
Max
(a,b),
Max
(c,d));}
54
template
<
class
T>
inline
T
Min
(
const
T &a,
const
T & b,
const
T & c,
const
T &
d
)
55
{
return
Min
(
Min
(a,b),
Min
(c,d));}
56
57
//le type Nom des entites geometriques P L S V O
58
//===========
59
typedef
char
Nom
[1+24];
60
61
//le type N des nombres entiers positifs
62
//=========
63
#ifndef PCLINUX64
64
typedef
unsigned
long
int
N
;
65
#else
66
typedef
unsigned
int
N
;
67
#endif
68
69
//le type Z des nombres entiers relatifs
70
//=========
71
#ifndef PCLINUX64
72
typedef
long
int
Z
;
73
#else
74
typedef
int
Z
;
75
#endif
76
77
//le type R des nombres "reels"
78
//=========
79
typedef
double
R
;
80
81
//le type XPoint des coordonnees d'un pixel dans une fenetre
82
//==============
83
//typedef struct { short int x,y } XPoint; //en fait ce type est defini dans X11-Window
84
// #include <X11/Xlib.h>
85
//la classe R2
86
//============
87
class
R2
88
{
89
friend
std::ostream&
operator <<
(std::ostream& f,
const
R2
& P)
90
{ f << P.
x
<<
' '
<< P.
y
;
return
f; }
91
friend
std::istream&
operator >>
(std::istream& f,
R2
& P)
92
{ f >> P.
x
>> P.
y
;
return
f; }
93
94
friend
std::ostream&
operator <<
(std::ostream& f,
const
R2
* P)
95
{ f << P->
x
<<
' '
<< P->
y
;
return
f; }
96
friend
std::istream&
operator >>
(std::istream& f,
R2
* P)
97
{ f >> P->
x
>> P->
y
;
return
f; }
98
99
public
:
100
R
x
,
y
;
//les donnees
101
102
R2
() :
x
(0),
y
(0) {}
//les constructeurs
103
R2
(
R
a,
R
b) :
x
(a),
y
(b) {}
104
R2
(
R2
A,
R2
B) :
x
(B.
x
-A.
x
),
y
(B.
y
-A.
y
) {}
//vecteur defini par 2 points
105
106
R2
operator+
(
R2
P)
const
{
return
R2
(
x
+P.
x
,
y
+P.
y
);}
// Q+P possible
107
R2
operator+=
(
R2
P) {
x
+= P.
x
;
y
+= P.
y
;
return
*
this
;}
// Q+=P;
108
R2
operator-
(
R2
P)
const
{
return
R2
(
x
-P.
x
,
y
-P.
y
);}
// Q-P
109
R2
operator-=
(
R2
P) {
x
-= P.
x
;
y
-= P.
y
;
return
*
this
;}
// Q-=P;
110
R2
operator-
()
const
{
return
R2
(-
x
,-
y
);}
// -Q
111
R2
operator+
()
const
{
return
*
this
;}
// +Q
112
R
operator,
(
R2
P)
const
{
return
x
*P.
x
+
y
*P.
y
;}
// produit scalaire (Q,P)
113
R
operator^
(
R2
P)
const
{
return
x
*P.
y
-
y
*P.
x
;}
// produit vectoriel Q^P
114
R2
operator*
(
R
c)
const
{
return
R2
(
x
*c,
y
*c);}
// produit a droite P*c
115
R2
operator*=
(
R
c) {
x
*= c;
y
*= c;
return
*
this
;}
116
R2
operator/
(
R
c)
const
{
return
R2
(
x
/c,
y
/c);}
// division par un reel
117
R2
operator/=
(
R
c) {
x
/= c;
y
/= c;
return
*
this
;}
118
R
&
operator[]
(
int
i) {
return
(&
x
)[i];}
// la coordonnee i
119
R2
orthogonal
() {
return
R2
(-
y
,
x
);}
//le vecteur orthogonal dans R2
120
friend
R2
operator*
(
R
c,
R2
P) {
return
P*c;}
// produit a gauche c*P
121
};
122
123
124
//la classe R3
125
//============
126
class
R3
127
{
128
friend
std::ostream&
operator <<
(std::ostream& f,
const
R3
& P)
129
{ f << P.
x
<<
' '
<< P.
y
<<
' '
<< P.
z
;
return
f; }
130
friend
std::istream&
operator >>
(std::istream& f,
R3
& P)
131
{ f >> P.
x
>> P.
y
>> P.
z
;
return
f; }
132
133
friend
std::ostream&
operator <<
(std::ostream& f,
const
R3
* P)
134
{ f << P->
x
<<
' '
<< P->
y
<<
' '
<< P->
z
;
return
f; }
135
friend
std::istream&
operator >>
(std::istream& f,
R3
* P)
136
{ f >> P->
x
>> P->
y
>> P->
z
;
return
f; }
137
138
public
:
139
R
x
,
y
,
z
;
//les 3 coordonnees
140
141
R3
() :
x
(0),
y
(0),
z
(0) {}
//les constructeurs
142
R3
(
R
a,
R
b,
R
c):
x
(a),
y
(b),
z
(c) {}
//Point ou Vecteur (a,b,c)
143
R3
(
R3
A,
R3
B):
x
(B.
x
-A.
x
),
y
(B.
y
-A.
y
),
z
(B.
z
-A.
z
) {}
//Vecteur AB
144
145
R3
(gp_Pnt P) :
x
(P.X()),
y
(P.Y()),
z
(P.
Z
()) {}
//Point d'OpenCascade
146
R3
(gp_Vec V) :
x
(V.X()),
y
(V.Y()),
z
(V.
Z
()) {}
//Vecteur d'OpenCascade
147
R3
(gp_Dir P) :
x
(P.X()),
y
(P.Y()),
z
(P.
Z
()) {}
//Direction d'OpenCascade
148
149
R3
operator+
(
R3
P)
const
{
return
R3
(
x
+P.
x
,
y
+P.
y
,
z
+P.
z
);}
150
R3
operator+=
(
R3
P) {
x
+= P.
x
;
y
+= P.
y
;
z
+= P.
z
;
return
*
this
;}
151
R3
operator-
(
R3
P)
const
{
return
R3
(
x
-P.
x
,
y
-P.
y
,
z
-P.
z
);}
152
R3
operator-=
(
R3
P) {
x
-= P.
x
;
y
-= P.
y
;
z
-= P.
z
;
return
*
this
;}
153
R3
operator-
()
const
{
return
R3
(-
x
,-
y
,-
z
);}
154
R3
operator+
()
const
{
return
*
this
;}
155
R
operator,
(
R3
P)
const
{
return
x
*P.
x
+
y
*P.
y
+
z
*P.
z
;}
// produit scalaire
156
R3
operator^
(
R3
P)
const
{
return
R3
(
y
*P.
z
-
z
*P.
y
,P.
x
*
z
-
x
*P.
z
,
x
*P.
y
-
y
*P.
x
);}
// produit vectoriel
157
R3
operator*
(
R
c)
const
{
return
R3
(
x
*c,
y
*c,
z
*c);}
158
R3
operator*=
(
R
c) {
x
*= c;
y
*= c;
z
*= c;
return
*
this
;}
159
R3
operator/
(
R
c)
const
{
return
R3
(
x
/c,
y
/c,
z
/c);}
160
R3
operator/=
(
R
c) {
x
/= c;
y
/= c;
z
/= c;
return
*
this
;}
161
R
&
operator[]
(
int
i) {
return
(&
x
)[i];}
162
friend
R3
operator*
(
R
c,
R3
P) {
return
P*c;}
163
164
R3
operator=
(gp_Pnt P) {
return
R3
(P.X(),P.Y(),P.Z());}
165
R3
operator=
(gp_Dir P) {
return
R3
(P.X(),P.Y(),P.Z());}
166
167
friend
gp_Pnt
gp_pnt
(
R3
xyz) {
return
gp_Pnt(xyz.
x
,xyz.
y
,xyz.
z
); }
168
//friend gp_Pnt operator=() { return gp_Pnt(x,y,z); }
169
friend
gp_Dir
gp_dir
(
R3
xyz) {
return
gp_Dir(xyz.
x
,xyz.
y
,xyz.
z
); }
170
171
bool
DansPave
(
R3
& xyzMin,
R3
& xyzMax )
172
{
return
xyzMin.
x
<=
x
&&
x
<=xyzMax.
x
&&
173
xyzMin.
y
<=
y
&&
y
<=xyzMax.
y
&&
174
xyzMin.
z
<=
z
&&
z
<=xyzMax.
z
; }
175
};
176
177
//la classe R4
178
//============
179
class
R4
:
public
R3
180
{
181
friend
std::ostream&
operator <<
(std::ostream& f,
const
R4
& P )
182
{ f << P.
x
<<
' '
<< P.
y
<<
' '
<< P.
z
<<
' '
<< P.
omega
;
return
f; }
183
friend
istream&
operator >>
(istream& f,
R4
& P)
184
{ f >> P.
x
>> P.
y
>> P.
z
>> P.
omega
;
return
f; }
185
186
friend
std::ostream&
operator <<
(std::ostream& f,
const
R4
* P )
187
{ f << P->
x
<<
' '
<< P->
y
<<
' '
<< P->
z
<<
' '
<< P->
omega
;
return
f; }
188
friend
istream&
operator >>
(istream& f,
R4
* P)
189
{ f >> P->
x
>> P->
y
>> P->
z
>> P->
omega
;
return
f; }
190
191
public
:
192
R
omega
;
//la donnee du poids supplementaire
193
194
R4
() :
omega
(1.0) {}
//les constructeurs
195
R4
(
R
a,
R
b,
R
c,
R
d
):
R3
(a,b,c),
omega
(d) {}
196
R4
(
R4
A,
R4
B) :
R3
(B.
x
-A.
x
,B.
y
-A.
y
,B.
z
-A.
z
),
omega
(B.
omega
-A.
omega
) {}
197
198
R4
operator+
(
R4
P)
const
{
return
R4
(
x
+P.
x
,
y
+P.
y
,
z
+P.
z
,
omega
+P.
omega
);}
199
R4
operator+=
(
R4
P) {
x
+= P.
x
;
y
+= P.
y
;
z
+= P.
z
;
omega
+= P.
omega
;
return
*
this
;}
200
R4
operator-
(
R4
P)
const
{
return
R4
(
x
-P.
x
,
y
-P.
y
,
z
-P.
z
,
omega
-P.
omega
);}
201
R4
operator-=
(
R4
P) {
x
-= P.
x
;
y
-= P.
y
;
z
-= P.
z
;
omega
-= P.
omega
;
return
*
this
;}
202
R4
operator-
()
const
{
return
R4
(-
x
,-
y
,-
z
,-
omega
);}
203
R4
operator+
()
const
{
return
*
this
;}
204
R
operator,
(
R4
P)
const
{
return
x
*P.
x
+
y
*P.
y
+
z
*P.
z
+
omega
*P.
omega
;}
// produit scalaire
205
R4
operator*
(
R
c)
const
{
return
R4
(
x
*c,
y
*c,
z
*c,
omega
*c);}
206
R4
operator*=
(
R
c) {
x
*= c;
y
*= c;
z
*= c;
omega
*= c;
return
*
this
;}
207
R4
operator/
(
R
c)
const
{
return
R4
(
x
/c,
y
/c,
z
/c,
omega
/c);}
208
R4
operator/=
(
R
c) {
x
/= c;
y
/= c;
z
/= c;
omega
/= c;
return
*
this
;}
209
R
&
operator[]
(
int
i) {
return
(&
x
)[i];}
210
friend
R4
operator*
(
R
c,
R4
P) {
return
P*c;}
211
};
212
213
//quelques fonctions supplementaires sur ces classes
214
//==================================================
215
inline
R
Aire2d
(
const
R2
A,
const
R2
B,
const
R2
C){
return
(B-A)^(C-A);}
216
inline
R
Angle2d
(
R2
P){
return
atan2(P.
y
,P.
x
);}
217
218
inline
R
Norme2_2
(
const
R2
& A){
return
(A,A);}
219
inline
R
Norme2
(
const
R2
& A){
return
sqrt((A,A));}
220
inline
R
NormeInfinie
(
const
R2
& A){
return
Max
(
Abs
(A.
x
),
Abs
(A.
y
));}
221
222
inline
R
Norme2_2
(
const
R3
& A){
return
(A,A);}
223
inline
R
Norme2
(
const
R3
& A){
return
sqrt((A,A));}
224
inline
R
NormeInfinie
(
const
R3
& A){
return
Max
(
Abs
(A.
x
),
Abs
(A.
y
),
Abs
(A.
z
));}
225
226
inline
R
Norme2_2
(
const
R4
& A){
return
(A,A);}
227
inline
R
Norme2
(
const
R4
& A){
return
sqrt((A,A));}
228
inline
R
NormeInfinie
(
const
R4
& A){
return
Max
(
Abs
(A.
x
),
Abs
(A.
y
),
Abs
(A.
z
),
Abs
(A.
omega
));}
229
230
inline
R2
XY
(
R3
P) {
return
R2
(P.
x
, P.
y
);}
//restriction a R2 d'un R3 par perte de z
231
inline
R3
Min
(
R3
P,
R3
Q)
232
{
return
R3
(P.
x
<Q.
x
? P.
x
: Q.
x
, P.
y
<Q.
y
? P.
y
: Q.
y
, P.
z
<Q.
z
? P.
z
: Q.
z
);}
//Pt de xyz Min
233
inline
R3
Max
(
R3
P,
R3
Q)
234
{
return
R3
(P.
x
>Q.
x
? P.
x
: Q.
x
, P.
y
>Q.
y
? P.
y
: Q.
y
, P.
z
>Q.
z
? P.
z
: Q.
z
);}
//Pt de xyz Max
235
236
#endif
src
MEFISTO2
Rn.h
Copyright © 2007-2017 CEA/DEN, EDF R&D, OPEN CASCADE
Copyright © 2003-2007 OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN, CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS