MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
hypergraphlib_filaments.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 //####// hypergraphlib_filaments.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:54:00 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include <stdlib.h>
23 #include "hypergraphlib_platform.h"
24 
25 #include "hypergraphlib_graph.h"
26 #include "hypergraphlib_node.h"
27 #include "hypergraphlib_arc.h"
28 
29 #include <set>
30 #include <vector>
31 #include <map>
32 
33 
38 namespace HypergraphLib {
39 
41 Filaments ( Graph * G, std::vector < std::vector < int > > & __filaments )
42 {
43  std::set <int> visited;
44  std::set <int> next;
45  std::vector <int> filament;
46  std::set <int> unvisited;
47  std::set <int> adjacentNodes;
48 
49  // Initialize the set of unvisited nodes
50  for (Graph::MapNodesById::const_iterator itNodes = G->GetNodes().begin();
51  itNodes != G->GetNodes().end();
52  itNodes++ )
53  {
54  unvisited.insert (itNodes->first);
55  }
56 
57  while (unvisited.size() > 0)
58  {
59  Node * N = G->GetNode(*(unvisited.begin()));
60  for (std::set<int>::const_iterator itAN = unvisited.begin();
61  itAN != unvisited.end();
62  itAN++ )
63  {
64  Node * N2 = G->GetNode(*itAN);
65  if (N2->IncidentArcs().size() == 1)
66  {
67  N = N2;
68  break;
69  }
70  }
71 
72  visited.insert(N->Id());
73  unvisited.erase(unvisited.find(N->Id()));
74  next.clear();
75  adjacentNodes.clear();
76  N->AdjacentNodes(adjacentNodes);
77  for (std::set<int>::const_iterator itAN = adjacentNodes.begin();
78  itAN != adjacentNodes.end();
79  itAN++ )
80  {
81  if ( visited.find (*itAN) == visited.end() )
82  {
83  next.insert (*itAN);
84  break;
85  }
86  }
87  filament.clear();
88  filament.push_back (N->Id());
89 
90  while (next.size() > 0)
91  {
92  N = G->GetNode(*(next.begin()));
93  visited.insert(N->Id());
94  unvisited.erase(unvisited.find(N->Id()));
95  adjacentNodes.clear();
96  next.clear();
97  filament.push_back (N->Id());
98 
99  N->AdjacentNodes(adjacentNodes);
100  for (std::set<int>::const_iterator itAN = adjacentNodes.begin();
101  itAN != adjacentNodes.end();
102  itAN++ )
103  {
104  if ( visited.find (*itAN) == visited.end() )
105  {
106  int count_filament_adjacency = 0;
107  std::vector<int>::const_iterator it_fil = filament.begin();
108  bool is_adjacent_to_start=false;
109  bool is_adjacent_to_end=false;
110  Node * fN=NULL;
111 
112  it_fil = filament.begin();
113  fN = G->GetNode (*it_fil);
114  is_adjacent_to_start = fN->IsAdjacentToNode(*itAN);
115 
116 
117  it_fil = filament.end();
118  it_fil--;
119  fN = G->GetNode (*it_fil);
120  is_adjacent_to_end = fN->IsAdjacentToNode(*itAN);
121 
122  for ( it_fil = filament.begin();
123  it_fil != filament.end(); it_fil++)
124  {
125  fN = G->GetNode (*it_fil);
126  if (fN->IsAdjacentToNode(*itAN))
127  count_filament_adjacency++;
128  }
129  it_fil = filament.end();
130  it_fil--;
131  it_fil = filament.begin();
132 
133  bool is_not_T = true;
134  if ( is_adjacent_to_end && is_adjacent_to_start)
135  {
136 
137  for ( it_fil = filament.begin();
138  it_fil != filament.end(); it_fil++)
139  {
140  fN = G->GetNode (*it_fil);
141  for ( Node::MultimapArcsById::const_iterator itArcs = fN->IncidentArcs().begin();
142  itArcs != fN->IncidentArcs().end();
143  itArcs++ )
144  {
145  Arc * arc = itArcs->second;
146 
147  if ( arc->Nodes().find(*itAN) != arc->Nodes().end()
148  && arc->Nodes().find(filament[0]) != arc->Nodes().end()
149  && arc->Nodes().find(filament[filament.size()-1]) != arc->Nodes().end() )
150  {
151  is_not_T = false;
152  }
153  }
154  }
155 
156  }
157 
158  if (count_filament_adjacency == 1 || ( is_adjacent_to_end && is_adjacent_to_start && is_not_T) )
159  {
160  next.insert (*itAN);
161  break;
162  }
163  }
164  }
165  }
166  __filaments.push_back(filament);
167  }
168 
169 }
170 }
171 
hypergraphlib_arc.h
HypergraphLib::Graph::GetNodes
const MapNodesById & GetNodes() const
Definition: hypergraphlib_graph.h:178
HypergraphLib::Node::IsAdjacentToNode
Arc * IsAdjacentToNode(int __nodeId)
Definition: hypergraphlib_node.cpp:119
HypergraphLib::Arc
Definition: hypergraphlib_arc.h:37
HypergraphLib
Definition: hypergraphlib_arc.cpp:32
hypergraphlib_graph.h
HYPERGRAPHLIB_ITEM
#define HYPERGRAPHLIB_ITEM
Definition: hypergraphlib_platform.h:36
HypergraphLib::GraphObject::Id
int Id() const
Definition: hypergraphlib_graphobject.cpp:47
HypergraphLib::Node::IncidentArcs
MultimapArcsById & IncidentArcs()
Definition: hypergraphlib_node.h:53
hypergraphlib_platform.h
HypergraphLib::Node::AdjacentNodes
void AdjacentNodes(std::set< int > &__adjacentNodes)
Definition: hypergraphlib_node.cpp:73
HypergraphLib::Node
Definition: hypergraphlib_node.h:35
HypergraphLib::Graph::GetNode
Node * GetNode(int) const
Definition: hypergraphlib_graph.cpp:175
HypergraphLib::Filaments
HYPERGRAPHLIB_ITEM void Filaments(Graph *G, std::vector< std::vector< int > > &__filaments)
Definition: hypergraphlib_filaments.cpp:41
hypergraphlib_node.h
HypergraphLib::Arc::Nodes
MultimapNodesById & Nodes()
Definition: hypergraphlib_arc.cpp:97