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
32
#include "
CAD4FE_EdgeCollapseCriteria.h
"
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
"
38
#include "
ot_algorithme_geometrique.h
"
39
#include "
CAD4FE_Criteria.h
"
40
#include "
CAD4FE_ColorMap.h
"
41
#include "
CAD4FE_VertexCriteria.h
"
42
#include "
CAD4FE_PolyCurve.h
"
43
#include "
CAD4FE_GlobalEdgeCriteria.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;
55
v1 = (
MCVertex
*)
_mcEdge
->
get_cosommet1
()->
get_sommet
();
56
v2 = (
MCVertex
*)
_mcEdge
->
get_cosommet2
()->
get_sommet
();
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
{
70
_deleteVertex
=
_targetVertex
= NULL;
71
printf(
" EdgeCollapseCriteria : vertex %lu is not adjacent to edge %lu !\n"
, __deleteVertex->
get_id
(), __mcEdge->
get_id
());
72
}
73
}
74
75
double
EdgeCollapseCriteria::GetScore
()
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
90
double
EdgeCollapseCriteria::EdgeLength
()
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;
104
_mcaa
->
GetMCBody
()->
Vertex_GetAdjacentEdges
(
_deleteVertex
, 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
home
francois
tmp
lib
CAD4FE
src
CAD4FE_EdgeCollapseCriteria.cpp
Généré le Mercredi 11 Juin 2025 23:00:06 pour MAGiC par
1.8.17