ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/CAD4FE/src/CAD4FE_EdgeCollapseCriteria.cpp
Revision: 176
Committed: Tue May 19 20:56:11 2009 UTC (15 years, 11 months ago) by foucault
Original Path: magic/lib/CAD4FE/CAD4FE/src/CAD4FE_EdgeCollapseCriteria.cpp
File size: 2828 byte(s)
Log Message:
Mise à jour :
* CAD4FE
* outil : HypergraphLib qui est maintenant compilable sous Linux (essais mois aout 2008)
* outil : ot_mathematique.cpp suppression d'une méthode de classe inutile nécessaire pour compiler avec CodeGear Builder 2006 OT_VECTEUR_3D::OT_VECTEUR_3D(OT_VECTEUR_3D& mdd)

File Contents

# User Rev Content
1 foucault 27 //---------------------------------------------------------------------------
2    
3    
4     #pragma hdrstop
5    
6    
7     //---------------------------------------------------------------------------
8 foucault 176
9     #include "gestionversion.h"
10     #include <vector>
11     using namespace std;
12 foucault 27
13 foucault 176 #include "CAD4FE_EdgeCollapseCriteria.h"
14 foucault 27 #include "CAD4FE_MCBody.h"
15     #include "CAD4FE_MCAA.h"
16     #include "CAD4FE_MCEdge.h"
17     #include "CAD4FE_MCVertex.h"
18     #include "CAD4FE_mg_utils.h"
19     #include "ot_algorithme_geometrique.h"
20     #include "CAD4FE_Criteria.h"
21     #include "CAD4FE_ColorMap.h"
22     #include "CAD4FE_VertexCriteria.h"
23     #include "CAD4FE_PolyCurve.h"
24     #include "CAD4FE_GlobalEdgeCriteria.h"
25     #include "CAD4FE_CoVertexCriteria.h"
26    
27     #pragma package(smart_init)
28    
29     using namespace CAD4FE;
30    
31     EdgeCollapseCriteria::EdgeCollapseCriteria(MCEdge * __mcEdge, MCVertex * __deleteVertex, MCAA * __mcaa)
32     : _mcaa(__mcaa), _mcEdge(__mcEdge)
33     {
34     MCVertex *v1, *v2;
35     v1 = (MCVertex*) _mcEdge->get_cosommet1()->get_sommet();
36     v2 = (MCVertex*) _mcEdge->get_cosommet2()->get_sommet();
37    
38     if (__deleteVertex == v1)
39     {
40     _deleteVertex = v1;
41     _targetVertex = v2;
42     }
43     else if (__deleteVertex == v2)
44     {
45     _deleteVertex = v2;
46     _targetVertex = v1;
47     }
48     else // problem
49     {
50     _deleteVertex = _targetVertex = NULL;
51     printf(" EdgeCollapseCriteria : vertex %d is not adjacent to edge %d !\n", __deleteVertex->get_id(), __mcEdge->get_id());
52     }
53     }
54    
55     double EdgeCollapseCriteria::GetScore()
56     {
57     if (_deleteVertex == _targetVertex) // the collapse edge is a cycle
58     return 0;
59    
60     // don't use edge collapse when you can use vertex deletion
61     if (_mcaa->GetMCBody()->G10()->GetArc(_deleteVertex->get_id())->Rank() < 3)
62     return 0;
63    
64     return EdgeLength();
65     }
66    
67     double EdgeCollapseCriteria::EdgeLength()
68     {
69     double deleteVertex_xyz[3];
70     double LMin, minEdgeLength;
71     int extendEdgeCount;
72    
73     _deleteVertex->get_point()->evaluer(deleteVertex_xyz);
74     LMin = _mcaa->GetMinSize(deleteVertex_xyz);
75    
76     double collapseEdgeLength = _mcEdge->GetPolyCurve()->get_longueur();
77     if (collapseEdgeLength >= LMin)
78     return 0;
79    
80     std::vector<MCEdge *> adjEdges;
81     _mcaa->GetMCBody()->Vertex_GetAdjacentEdges(_deleteVertex, adjEdges);
82    
83     minEdgeLength = 1E100;
84     extendEdgeCount = 0;
85     for (std::vector<MCEdge*>::iterator itEdge = adjEdges.begin();
86     itEdge != adjEdges.end(); itEdge++)
87     {
88     MCEdge * edge = *itEdge;
89     if (edge == _mcEdge)
90     continue;
91    
92     double edgeLength = edge->GetPolyCurve()->get_longueur();
93    
94     minEdgeLength = std::min(minEdgeLength,edgeLength);
95     extendEdgeCount++;
96     }
97    
98    
99     if (minEdgeLength < LMin)
100     {
101     return 0;
102     }
103    
104     return 1-collapseEdgeLength/LMin;
105     }