Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
CGoGN
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Hurstel
CGoGN
Commits
23f8022e
Commit
23f8022e
authored
Dec 09, 2011
by
untereiner
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
begin edgeCanCollapse + collapseDegeneretedVolumes + edgeCollapse
parent
156f13bd
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
118 additions
and
39 deletions
+118
-39
include/Topology/map/embeddedMap3.h
include/Topology/map/embeddedMap3.h
+5
-0
include/Topology/map/map3.h
include/Topology/map/map3.h
+8
-0
src/Topology/map/embeddedMap3.cpp
src/Topology/map/embeddedMap3.cpp
+11
-0
src/Topology/map/map3.cpp
src/Topology/map/map3.cpp
+94
-39
No files found.
include/Topology/map/embeddedMap3.h
View file @
23f8022e
...
...
@@ -58,6 +58,11 @@ public:
*/
virtual
Dart
deleteEdge
(
Dart
d
);
/*!
*
*/
bool
edgeCanCollapse
(
Dart
d
);
/*!
*
*/
...
...
include/Topology/map/map3.h
View file @
23f8022e
...
...
@@ -163,6 +163,14 @@ public:
*/
virtual
void
splitFace
(
Dart
d
,
Dart
e
);
//! Delete a volume if and only if it has a face with degree < 3 or only 3 vertices
/*! If the volume is sewed to two distinct adjacent volumes and if the face degree
* of the two adjacent volumes is equal then those two volumes are sewed
* @param d a dart of the face
* @return true if the collapse has been executed, false otherwise
*/
virtual
bool
collapseDegeneretedVolume
(
Dart
d
);
//! Sew two oriented volumes along their faces.
/*! The oriented faces should not be phi3-linked and have the same degree
* @param d a dart of the first volume
...
...
src/Topology/map/embeddedMap3.cpp
View file @
23f8022e
...
...
@@ -120,6 +120,17 @@ Dart EmbeddedMap3::deleteEdge(Dart d)
return
v
;
}
bool
EmbeddedMap3
::
edgeCanCollapse
(
Dart
d
)
{
//Criteres sur le bord
if
(
isBoundaryEdge
(
d
))
{
//fusion de deux bord
//deconnection du bord
}
}
Dart
EmbeddedMap3
::
collapseEdge
(
Dart
d
,
bool
delDegenerateVolumes
)
{
unsigned
int
vEmb
=
getEmbedding
(
VERTEX
,
d
)
;
...
...
src/Topology/map/map3.cpp
View file @
23f8022e
...
...
@@ -223,55 +223,86 @@ Dart Map3::collapseEdge(Dart d, bool delDegenerateVolumes)
{
Dart
resV
=
NIL
;
Dart
e
=
d
;
Dart
dit
=
d
;
//stocke un brin par volume autour de l'arete
std
::
vector
<
Dart
>
tmp
;
tmp
.
reserve
(
32
);
do
{
tmp
.
push_back
(
e
);
e
=
alpha2
(
e
);
}
while
(
e
!=
d
);
Dart
e
=
dit
;
dit
=
alpha2
(
dit
);
//contraction de la 2 carte de chaque 2-arete
for
(
std
::
vector
<
Dart
>::
iterator
it
=
tmp
.
begin
();
it
!=
tmp
.
end
();
++
it
)
{
//un brin d'une face adjacente a l'arrete contracte
Dart
d
=
phi2
(
phi_1
(
*
it
));
Map2
::
collapseEdge
(
*
it
,
false
);
//test si un seul polyedre autour de l'arete
if
(
e
==
dit
)
resV
==
phi3
(
phi2
(
phi1
(
e
)));
//test de la degeneresence
//impossible d'avoir un volume de moins de 4 faces sans avoir de phi2 en points fixe donc on les vire
if
(
delDegenerateVolumes
&&
Map2
::
volumeDegree
(
d
)
<
4
)
if
(
delDegenerateVolumes
)
{
Dart
e
=
d
;
//pour tous les brins de la face adjacente
do
{
Dart
ee
=
phi3
(
e
);
Dart
ff
=
phi3
(
phi2
(
e
));
//si les brins ont un voisin par phi3
if
(
ee
!=
e
)
phi3unsew
(
ee
);
Map2
::
collapseEdge
(
e
,
true
);
//collapseDegeneretedVolume(e);
}
else
Map2
::
collapseEdge
(
e
,
false
);
if
(
ff
!=
phi2
(
e
)
)
phi3unsew
(
ff
);
if
(
resV
==
NIL
)
{
//si les deux en ont un, il faut les coudres ensemble
if
(
ee
!=
e
&&
ff
!=
phi2
(
e
))
phi3sew
(
ee
,
ff
);
}
//on peut supprimer les brins de cette arete
deleteDart
(
e
);
deleteDart
(
phi2
(
e
));
e
=
phi1
(
e
);
}
while
(
e
!=
d
);
}
}
}
while
(
d
!=
dit
);
// Dart e = d;
//
// // stocke un brin par volume autour de l'arete
// std::vector<Dart> tmp;
// tmp.reserve(32);
// do
// {
// tmp.push_back(e);
// e = alpha2(e);
// } while (e != d);
//
// // contraction de la 2 carte de chaque 2-arete
// for (std::vector<Dart>::iterator it = tmp.begin(); it != tmp.end(); ++it)
// {
// // un brin d'une face adjacente a l'arrete contracte
// Dart d = phi2(phi_1(*it));
// Map2::collapseEdge(*it, true);
//
// // test de la degeneresence
// // impossible d'avoir un volume de moins de 4 faces sans avoir de phi2 en points fixe donc on les vire
// if(delDegenerateVolumes && Map2::volumeDegree(d) < 4)
// {
// Dart e = d;
// // pour tous les brins de la face adjacente
//
// do
// {
// Dart ee = phi3(e);
// Dart ff = phi3(phi2(e));
//
// // si les brins ont un voisin par phi3
// if(ee != e)
//
// phi3unsew(ee);
// if(ff != phi2(e))
// phi3unsew(ff);
//
// // si les deux en ont un, il faut les coudres ensemble
// if(ee != e && ff != phi2(e))
// phi3sew(ee, ff);
//
// // on peut supprimer les brins de cette arete
// deleteDart(e);
// deleteDart(phi2(e));
// e = phi1(e);
//
// } while (e != d);
// }
// }
return
resV
;
}
...
...
@@ -290,6 +321,30 @@ void Map3::splitFace(Dart d, Dart e)
phi3sew
(
phi_1
(
e
),
phi_1
(
dd
));
}
bool
Map3
::
collapseDegeneretedVolume
(
Dart
d
)
{
Dart
e1
=
phi2
(
d
);
Dart
e2
=
phi2
(
phi1
(
d
));
//Si l'une des faces est du bord
if
(
isBoundaryFace
(
e1
)
||
isBoundaryFace
(
e2
))
{
//alors simple suppression du volume degenere
}
else
{
Dart
e13
=
e1
;
Dart
e23
=
e2
;
if
(
!
isBoundaryFace
(
e1
))
e13
=
phi3
(
e1
);
if
(
!
isBoundaryFace
(
e2
))
e23
=
phi3
(
e2
);
//if(faceDegree(e1) < faceDegree)
}
}
void
Map3
::
sewVolumes
(
Dart
d
,
Dart
e
,
bool
withBoundary
)
{
assert
(
faceDegree
(
d
)
==
faceDegree
(
e
));
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment