ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/CAD4FE/src/CAD4FE_FaceBoundaryPoint.cpp
Revision: 1158
Committed: Thu Jun 13 22:18:49 2024 UTC (11 months ago) by francois
File size: 7171 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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