1 |
foucault |
27 |
//---------------------------------------------------------------------------
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
#pragma hdrstop
|
5 |
|
|
|
6 |
|
|
#include "gestionversion.h"
|
7 |
|
|
|
8 |
|
|
#include "CAD4FE_FaceBoundaryPoint.h"
|
9 |
|
|
#include "mg_face.h"
|
10 |
|
|
#include <math.h>
|
11 |
|
|
#include "CAD4FE_MCNode.h"
|
12 |
|
|
#include "CAD4FE_geometric_tools.h"
|
13 |
|
|
|
14 |
|
|
//---------------------------------------------------------------------------
|
15 |
|
|
|
16 |
|
|
#pragma package(smart_init)
|
17 |
|
|
|
18 |
|
|
using namespace CAD4FE;
|
19 |
|
|
|
20 |
|
|
FaceBoundaryPoint::FaceBoundaryPoint(MCNode * __n, MG_FACE *__refFace)
|
21 |
|
|
: _face(__refFace), _node(__n)
|
22 |
|
|
{
|
23 |
|
|
if (__n->GetRefEdgeMapping().size() != 0)
|
24 |
|
|
Initialize();
|
25 |
|
|
}
|
26 |
|
|
|
27 |
|
|
FaceBoundaryPoint::FaceBoundaryPoint(MCNode * __n,const FaceBoundaryPoint & __fbp)
|
28 |
|
|
{
|
29 |
|
|
coedge1=__fbp.coedge1;
|
30 |
|
|
coedge1T=__fbp.coedge1T;
|
31 |
|
|
coedge2=__fbp.coedge2;
|
32 |
|
|
vecTpCoedge1Der[0]=__fbp.vecTpCoedge1Der[0];
|
33 |
|
|
vecTpCoedge1Der[1]=__fbp.vecTpCoedge1Der[1];
|
34 |
|
|
coedge2T=__fbp.coedge2T;
|
35 |
|
|
vecTpCoedge2Der[0]=__fbp.vecTpCoedge2Der[0];
|
36 |
|
|
vecTpCoedge2Der[1]=__fbp.vecTpCoedge2Der[1];
|
37 |
|
|
_face=__fbp._face;
|
38 |
|
|
_node=__n;
|
39 |
|
|
_tangentFrame=__fbp._tangentFrame;
|
40 |
|
|
_tangentTransform=__fbp._tangentTransform;
|
41 |
|
|
_mergedVertex=__fbp._mergedVertex;
|
42 |
|
|
}
|
43 |
|
|
|
44 |
|
|
FaceBoundaryPoint::~FaceBoundaryPoint()
|
45 |
|
|
{
|
46 |
|
|
}
|
47 |
|
|
|
48 |
|
|
void FaceBoundaryPoint::Initialize()
|
49 |
|
|
{
|
50 |
|
|
coedge1 = NULL;
|
51 |
|
|
coedge2 = NULL;
|
52 |
|
|
_mergedVertex = NULL;
|
53 |
|
|
|
54 |
|
|
OT_VECTEUR_3D faceNormal;
|
55 |
|
|
_face->calcul_normale_unitaire(_node->UV(_face), faceNormal);
|
56 |
|
|
_tangentFrame = GeometricTools::GetPlaneFrame(faceNormal);
|
57 |
|
|
_tangentFrame.transpose(_tangentTransform);
|
58 |
|
|
|
59 |
|
|
int dimension = _node->get_lien_topologie_reference()->get_dimension();
|
60 |
|
|
for (MCNode::EMapIterator itEdge = _node->GetRefEdgeMapping().begin();
|
61 |
|
|
itEdge != _node->GetRefEdgeMapping().end();
|
62 |
|
|
itEdge++)
|
63 |
|
|
{
|
64 |
|
|
MG_ARETE * edge = itEdge->first;
|
65 |
|
|
unsigned nb_adjacent_face = edge->get_nb_mg_coarete();
|
66 |
|
|
for (unsigned i=0; i<nb_adjacent_face; i++)
|
67 |
|
|
{
|
68 |
|
|
MG_COARETE *coedge = edge->get_mg_coarete(i);
|
69 |
|
|
MG_FACE * adjacent_face = coedge->get_boucle()->get_mg_face();
|
70 |
|
|
|
71 |
|
|
if (adjacent_face == _face)
|
72 |
|
|
{
|
73 |
|
|
if (dimension == 0)
|
74 |
|
|
{
|
75 |
|
|
MG_SOMMET *v1 = edge->get_cosommet1()->get_sommet();
|
76 |
|
|
MG_SOMMET *v2 = edge->get_cosommet2()->get_sommet();
|
77 |
|
|
if (coedge->get_orientation() == -1 ) std::swap(v1,v2);
|
78 |
|
|
MG_SOMMET *v=(MG_SOMMET*)_node->get_lien_topologie_reference();
|
79 |
|
|
if (!GeometricTools::MG_FACE_Contains_MG_SOMMET(_face, v))
|
80 |
|
|
{
|
81 |
|
|
if (_node->IsInVertex(v1))
|
82 |
|
|
{
|
83 |
|
|
coedge2 = coedge;
|
84 |
|
|
coedge2T = itEdge->second;
|
85 |
|
|
if (_node->GetRefVertexMapping().size()>1)
|
86 |
|
|
{
|
87 |
|
|
_mergedVertex = v1;
|
88 |
|
|
}
|
89 |
|
|
}
|
90 |
|
|
if (_node->IsInVertex(v2))
|
91 |
|
|
{coedge1 = coedge; coedge1T = itEdge->second; }
|
92 |
|
|
}
|
93 |
|
|
else
|
94 |
|
|
{
|
95 |
|
|
if (v==v1) {coedge2 = coedge; coedge2T = itEdge->second; }
|
96 |
|
|
if (v==v2) {coedge1 = coedge; coedge1T = itEdge->second; }
|
97 |
|
|
}
|
98 |
|
|
}
|
99 |
|
|
else
|
100 |
|
|
{
|
101 |
|
|
coedge1 = coedge; coedge1T = itEdge->second;
|
102 |
|
|
break;
|
103 |
|
|
}
|
104 |
|
|
}
|
105 |
|
|
}
|
106 |
|
|
}
|
107 |
|
|
|
108 |
|
|
OT_VECTEUR_3D vecCoedge1Der, vecTpCoedge1DerTemp;
|
109 |
|
|
coedge1->get_arete()->deriver(coedge1T, vecCoedge1Der);
|
110 |
|
|
vecCoedge1Der *= coedge1->get_orientation();
|
111 |
|
|
vecTpCoedge1DerTemp = _tangentTransform*vecCoedge1Der;
|
112 |
|
|
vecTpCoedge1Der[0]=vecTpCoedge1DerTemp[0];
|
113 |
|
|
vecTpCoedge1Der[1]=vecTpCoedge1DerTemp[1];
|
114 |
|
|
|
115 |
|
|
if (dimension == 0)
|
116 |
|
|
{
|
117 |
|
|
OT_VECTEUR_3D vecCoedge2Der, vecTpCoedge2DerTemp;
|
118 |
|
|
coedge2->get_arete()->deriver(coedge2T, vecCoedge2Der);
|
119 |
|
|
vecCoedge2Der *= coedge2->get_orientation();
|
120 |
|
|
vecTpCoedge2DerTemp = _tangentTransform*vecCoedge2Der;
|
121 |
|
|
vecTpCoedge2Der[0]=vecTpCoedge2DerTemp[0];
|
122 |
|
|
vecTpCoedge2Der[1]=vecTpCoedge2DerTemp[1];
|
123 |
|
|
}
|
124 |
|
|
}
|
125 |
|
|
|
126 |
|
|
int FaceBoundaryPoint::TestInteriorDirection(double __direction[3])
|
127 |
|
|
{
|
128 |
|
|
if (_node->GetRefEdgeMapping().size() == 0)
|
129 |
|
|
return 1;
|
130 |
|
|
|
131 |
|
|
OT_VECTEUR_3D vecDir(__direction), vecTpDir;
|
132 |
|
|
vecTpDir = _tangentTransform*vecDir;
|
133 |
|
|
double angleMin, angleMax, angle;
|
134 |
|
|
|
135 |
|
|
if (coedge2) // the point is on a vertex
|
136 |
|
|
angleMin = GeometricTools::AngleInPlane(vecTpCoedge1Der, vecTpCoedge2Der);
|
137 |
|
|
else
|
138 |
|
|
angleMin = 0;
|
139 |
|
|
|
140 |
|
|
angleMax = M_PI;
|
141 |
|
|
|
142 |
|
|
angle = GeometricTools::AngleInPlane( vecTpCoedge1Der, vecTpDir );
|
143 |
|
|
|
144 |
|
|
double angularTol = 1E-2;
|
145 |
|
|
if ( fabs(angle-angleMax) <= angularTol || fabs(angle-angleMin) <= angularTol )
|
146 |
|
|
return 0;
|
147 |
|
|
else if ( ( angle > angleMax) || (angle < angleMin) )
|
148 |
|
|
return -1;
|
149 |
|
|
|
150 |
|
|
return +1;
|
151 |
|
|
}
|
152 |
|
|
|
153 |
|
|
double FaceBoundaryPoint::GetInteriorDirectionAngle(double __direction[3])
|
154 |
|
|
{
|
155 |
|
|
if (_node->GetRefEdgeMapping().size() == 0)
|
156 |
|
|
return 1;
|
157 |
|
|
|
158 |
|
|
OT_VECTEUR_3D vecDir(__direction), vecTpDir;
|
159 |
|
|
vecTpDir = _tangentTransform*vecDir;
|
160 |
|
|
double angleMin, angleMax, angle;
|
161 |
|
|
|
162 |
|
|
if (coedge2) // the point is on a vertex
|
163 |
|
|
angleMin = GeometricTools::AngleInPlane(vecTpCoedge1Der, vecTpCoedge2Der);
|
164 |
|
|
else
|
165 |
|
|
angleMin = 0;
|
166 |
|
|
|
167 |
|
|
angleMax = M_PI;
|
168 |
|
|
|
169 |
|
|
angle = GeometricTools::AngleInPlane( vecTpCoedge1Der, vecTpDir );
|
170 |
|
|
if (angle < 0 && fabs(angle+M_PI) < 1E-6*M_PI)
|
171 |
|
|
angle += 2*M_PI;
|
172 |
|
|
|
173 |
|
|
if ( (angle == angleMax) || (angle == angleMin) )
|
174 |
|
|
return 0;
|
175 |
|
|
else if ( angle > angleMax)
|
176 |
|
|
return (angleMax-angle);
|
177 |
|
|
else if (angle < angleMin)
|
178 |
|
|
return (angle-angleMin);
|
179 |
|
|
|
180 |
|
|
return angleMax - angle;
|
181 |
|
|
}
|
182 |
|
|
|
183 |
|
|
MG_SOMMET * FaceBoundaryPoint::GetMergedVertex()
|
184 |
|
|
{
|
185 |
|
|
return _mergedVertex;
|
186 |
|
|
}
|
187 |
|
|
|
188 |
|
|
|
189 |
|
|
MCNode * FaceBoundaryPoint::GetNode()
|
190 |
|
|
{
|
191 |
|
|
return _node;
|
192 |
|
|
}
|