MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
CAD4FE_EdgeCollapseCriteria.cpp
Aller à la documentation de ce fichier.
1 //####//------------------------------------------------------------
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_EdgeCollapseCriteria.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:56 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 
23 
24 #pragma hdrstop
25 
26 
27 
28 #include "gestionversion.h"
29 #include <vector>
30 using namespace std;
31 
33 #include "CAD4FE_MCBody.h"
34 #include "CAD4FE_MCAA.h"
35 #include "CAD4FE_MCEdge.h"
36 #include "CAD4FE_MCVertex.h"
37 #include "CAD4FE_mg_utils.h"
39 #include "CAD4FE_Criteria.h"
40 #include "CAD4FE_ColorMap.h"
41 #include "CAD4FE_VertexCriteria.h"
42 #include "CAD4FE_PolyCurve.h"
44 #include "CAD4FE_CoVertexCriteria.h"
45 #include "CAD4FE_Geometric_Tools.h"
46 
47 #pragma package(smart_init)
48 
49 using namespace CAD4FE;
50 
51 EdgeCollapseCriteria::EdgeCollapseCriteria(MCEdge * __mcEdge, MCVertex * __deleteVertex, MCAA * __mcaa)
52 : _mcaa(__mcaa), _mcEdge(__mcEdge)
53 {
54  MCVertex *v1, *v2;
57 
58  if (__deleteVertex == v1)
59  {
60  _deleteVertex = v1;
61  _targetVertex = v2;
62  }
63  else if (__deleteVertex == v2)
64  {
65  _deleteVertex = v2;
66  _targetVertex = v1;
67  }
68  else // problem
69  {
71  printf(" EdgeCollapseCriteria : vertex %lu is not adjacent to edge %lu !\n", __deleteVertex->get_id(), __mcEdge->get_id());
72  }
73 }
74 
76 {
77  if (_mcaa->GetMCBody()->G21()->GetArc(_mcEdge->get_id())->Rank() != 2)
78  return 0;
79 
80  if (_deleteVertex == _targetVertex) // the collapse edge is a cycle
81  return 0;
82 
83  // don't use edge collapse when you can use vertex deletion
84  if (_mcaa->GetMCBody()->G10()->GetArc(_deleteVertex->get_id())->Rank() < 3)
85  return 0;
86 
87  return EdgeLength();
88 }
89 
91 {
92  double deleteVertex_xyz[3];
93  double LMin, minEdgeLength;
94  int extendEdgeCount;
95 
96  _deleteVertex->get_point()->evaluer(deleteVertex_xyz);
97  LMin = _mcaa->GetMinSize(deleteVertex_xyz);
98 
99  double collapseEdgeLength = _mcEdge->GetPolyCurve()->get_longueur();
100  if (collapseEdgeLength >= LMin)
101  return 0;
102 
103  std::vector<MCEdge *> adjEdges;
105 
106  // Verify that adjacent edges have the same color as the deleted edge
107  {
108  unsigned char rgba1[4];
109  int is_colored1 = CAD4FE::GeometricTools::MG_TOPO_GetColor(_mcEdge, rgba1);
110  for (std::vector<MCEdge*>::iterator itEdge = adjEdges.begin();
111  itEdge != adjEdges.end(); itEdge++)
112  {
113  MCEdge * edge = *itEdge;
114  unsigned char rgba2[4];
115  int is_colored2 = CAD4FE::GeometricTools::MG_TOPO_GetColor(edge, rgba2);
116 
117  if (is_colored2 != is_colored1)
118  return 0;
119  else if ( rgba1[0] != rgba2[0] || rgba1[1] != rgba2[1] || rgba1[2] != rgba2[2] || rgba1[3] != rgba2[3])
120  return 0;
121  }
122  }
123 
124  minEdgeLength = 1E100;
125  extendEdgeCount = 0;
126  for (std::vector<MCEdge*>::iterator itEdge = adjEdges.begin();
127  itEdge != adjEdges.end(); itEdge++)
128  {
129  MCEdge * edge = *itEdge;
130  if (edge == _mcEdge)
131  continue;
132 
133  double edgeLength = edge->GetPolyCurve()->get_longueur();
134 
135  minEdgeLength = std::min(minEdgeLength,edgeLength);
136  extendEdgeCount++;
137  }
138 
139 
140  if (minEdgeLength < LMin)
141  {
142  return 0;
143  }
144 
145  return 1-collapseEdgeLength/LMin;
146 }
MG_ARETE::get_cosommet2
virtual class MG_COSOMMET * get_cosommet2(void)
Definition: mg_arete.cpp:85
CAD4FE::EdgeCollapseCriteria::_targetVertex
MCVertex * _targetVertex
Definition: CAD4FE_EdgeCollapseCriteria.h:44
CAD4FE::PolyCurve::get_longueur
double get_longueur(double __s_min=-1, double __s_max=-1, double precision=1E-6)
Definition: CAD4FE_PolyCurve.cpp:669
CAD4FE_MCBody.h
gestionversion.h
CAD4FE::EdgeCollapseCriteria::_mcEdge
MCEdge * _mcEdge
Definition: CAD4FE_EdgeCollapseCriteria.h:42
CAD4FE::EdgeCollapseCriteria::EdgeLength
double EdgeLength()
Definition: CAD4FE_EdgeCollapseCriteria.cpp:90
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
CAD4FE::MCAA
Definition: CAD4FE_MCAA.h:73
HypergraphLib::Graph::GetArc
Arc * GetArc(int) const
Definition: hypergraphlib_graph.cpp:188
CAD4FE_Criteria.h
CAD4FE::MCAA::GetMinSize
double GetMinSize(double __xyz[3])
Definition: CAD4FE_MCAA.cpp:933
CAD4FE_EdgeCollapseCriteria.h
CAD4FE::MCBody::G10
Graph::Graph * G10() const
Definition: CAD4FE_MCBody.cpp:292
CAD4FE::MCVertex
Definition: CAD4FE_MCVertex.h:35
CAD4FE_MCVertex.h
CAD4FE::EdgeCollapseCriteria::_deleteVertex
MCVertex * _deleteVertex
Definition: CAD4FE_EdgeCollapseCriteria.h:43
MG_SOMMET::get_point
virtual MG_POINT * get_point(void)
Definition: mg_sommet.cpp:52
CAD4FE_MCAA.h
HypergraphLib::Arc::Rank
int Rank() const
Definition: hypergraphlib_arc.cpp:87
MG_COSOMMET::get_sommet
virtual MG_SOMMET * get_sommet(void)
Definition: mg_cosommet.cpp:83
CAD4FE_MCEdge.h
CAD4FE_ColorMap.h
CAD4FE_VertexCriteria.h
CAD4FE::EdgeCollapseCriteria::_mcaa
MCAA * _mcaa
Definition: CAD4FE_EdgeCollapseCriteria.h:41
CAD4FE::MCAA::GetMCBody
MCBody * GetMCBody() const
Definition: CAD4FE_MCAA.cpp:622
CAD4FE_CoVertexCriteria.h
CAD4FE::MCEdge
Definition: CAD4FE_MCEdge.h:48
CAD4FE_Geometric_Tools.h
CAD4FE::EdgeCollapseCriteria::GetScore
double GetScore()
Definition: CAD4FE_EdgeCollapseCriteria.cpp:75
CAD4FE_PolyCurve.h
ot_algorithme_geometrique.h
CAD4FE::GeometricTools::MG_TOPO_GetColor
static int MG_TOPO_GetColor(MG_ELEMENT_TOPOLOGIQUE *ele, double &)
Definition: CAD4FE_Geometric_Tools.cpp:687
CAD4FE
Definition: CAD4FE_ClosestPoint_Segment_MG_ARETE.h:34
CAD4FE::MCBody::G21
Graph::Graph * G21() const
Definition: CAD4FE_MCBody.cpp:297
CAD4FE::MCEdge::GetPolyCurve
PolyCurve * GetPolyCurve()
Definition: CAD4FE_MCEdge.cpp:98
MG_ARETE::get_cosommet1
virtual class MG_COSOMMET * get_cosommet1(void)
Definition: mg_arete.cpp:81
CAD4FE_GlobalEdgeCriteria.h
CAD4FE::MCBody::Vertex_GetAdjacentEdges
void Vertex_GetAdjacentEdges(MCVertex *__mcVertex, std::vector< MCEdge * > &__list)
Definition: CAD4FE_MCBody.cpp:1393
MG_POINT::evaluer
virtual void evaluer(double *xyz)=0
CAD4FE_mg_utils.h