ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/CAD4FE/src/CAD4FE_FaceBoundaryPoint.cpp
Revision: 253
Committed: Tue Jul 13 19:40:46 2010 UTC (14 years, 10 months ago) by francois
File size: 6229 byte(s)
Log Message:
changement de hiearchie et utilisation de ccmake + mise a jour

File Contents

# User Rev Content
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     }