ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/CAD4FE/src/CAD4FE_EdgeCollapseCriteria.cpp
Revision: 27
Committed: Thu Jul 5 15:26:40 2007 UTC (17 years, 10 months ago) by foucault
Original Path: magic/lib/CAD4FE/CAD4FE/src/CAD4FE_EdgeCollapseCriteria.cpp
File size: 2789 byte(s)
Log Message:

File Contents

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