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
41a22040
Commit
41a22040
authored
Oct 31, 2011
by
Sylvain Thery
Committed by
Pierre Kraemer
Nov 04, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
la suite
parent
46763c7f
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
170 additions
and
44 deletions
+170
-44
include/Topology/map/map1.hpp
include/Topology/map/map1.hpp
+3
-0
include/Topology/map/map2.h
include/Topology/map/map2.h
+3
-3
src/Topology/map/map2.cpp
src/Topology/map/map2.cpp
+164
-41
No files found.
include/Topology/map/map1.hpp
View file @
41a22040
...
@@ -153,6 +153,9 @@ inline void Map1::cutEdge(Dart d)
...
@@ -153,6 +153,9 @@ inline void Map1::cutEdge(Dart d)
{
{
Dart
e
=
newDart
()
;
// Create a new dart
Dart
e
=
newDart
()
;
// Create a new dart
phi1sew
(
d
,
e
)
;
// Insert dart e between d and phi1(d)
phi1sew
(
d
,
e
)
;
// Insert dart e between d and phi1(d)
if
(
isBoundaryMarked
(
d
))
boundaryMark
(
e
);
}
}
inline
void
Map1
::
collapseEdge
(
Dart
d
)
inline
void
Map1
::
collapseEdge
(
Dart
d
)
...
...
include/Topology/map/map2.h
View file @
41a22040
...
@@ -112,7 +112,7 @@ protected:
...
@@ -112,7 +112,7 @@ protected:
/*! The phi2-links around the face are removed
/*! The phi2-links around the face are removed
* @param d a dart of the face
* @param d a dart of the face
*/
*/
void
deleteOrientedFace
(
Dart
d
)
;
void
deleteOrientedFace
(
Dart
d
)
;
// OK boundary
public:
public:
virtual
void
deleteFace
(
Dart
d
)
;
virtual
void
deleteFace
(
Dart
d
)
;
...
@@ -164,7 +164,7 @@ public:
...
@@ -164,7 +164,7 @@ public:
* @param delDegenerateFaces a boolean (default to true)
* @param delDegenerateFaces a boolean (default to true)
* @return a dart of the resulting vertex
* @return a dart of the resulting vertex
*/
*/
virtual
Dart
collapseEdge
(
Dart
d
,
bool
delDegenerateFaces
=
true
);
virtual
Dart
collapseEdge
(
Dart
d
,
bool
delDegenerateFaces
=
true
);
//TODO close degenerated boundary ???
/**
/**
* Flip the edge of d (rotation in phi1 order)
* Flip the edge of d (rotation in phi1 order)
...
@@ -333,7 +333,7 @@ public:
...
@@ -333,7 +333,7 @@ public:
* boudary dart is reached.
* boudary dart is reached.
* @param d a boundary dart
* @param d a boundary dart
*/
*/
Dart
nextOnBoundary
(
Dart
d
);
Dart
nextOnBoundary
(
Dart
d
)
;
// TODO a mettre en algo
// TODO a mettre en algo
/**
/**
...
...
src/Topology/map/map2.cpp
View file @
41a22040
...
@@ -46,7 +46,7 @@ void Map2::mergeFacewithBoundary(Dart d)
...
@@ -46,7 +46,7 @@ void Map2::mergeFacewithBoundary(Dart d)
Dart
ee
=
phi_1
(
e
);
Dart
ee
=
phi_1
(
e
);
if
(
f
!=
ee
)
if
(
f
!=
ee
)
phi1sew
(
f
,
ee
)
;
phi1sew
(
f
,
ee
)
;
deleteOrientedFace
(
e
)
;
Map1
::
deleteOrientedFace
(
e
)
;
}
}
e
=
phi1
(
e
)
;
e
=
phi1
(
e
)
;
}
while
(
e
!=
d
)
;
}
while
(
e
!=
d
)
;
...
@@ -100,45 +100,133 @@ void Map2::linkVertices(Dart d, Dart e)
...
@@ -100,45 +100,133 @@ void Map2::linkVertices(Dart d, Dart e)
void
Map2
::
cutEdge
(
Dart
d
)
void
Map2
::
cutEdge
(
Dart
d
)
{
{
Map1
::
cutEdge
(
d
);
// Cut the edge of d
// Map1::cutEdge(d); // Cut the edge of d
Dart
nd
=
phi1
(
d
);
// Dart nd = phi1(d);
// Dart e = phi2(d);
// if (e != d) // Test if an opposite edge exists
// {
// Map1::cutEdge(e); // Cut the opposite edge
// Dart ne = phi1(e);
// phi2unsew(d); // Correct the phi2 links
// phi2sew(d, ne);
// phi2sew(e, nd);
// }
// TODISCUSS: it is not allowed to cut an edge of boundary
assert
(
!
isBoundaryMarked
(
d
));
Map1
::
cutEdge
(
d
);
// Cut the 1-edge of d
Dart
e
=
phi2
(
d
);
Dart
e
=
phi2
(
d
);
if
(
e
!=
d
)
// Test if an opposite edge exists
Map1
::
cutEdge
(
e
);
// Cut the 1-edge of phi2(d)
{
Map1
::
cutEdge
(
e
);
// Cut the opposite edge
phi2unsew
(
d
);
// remove old phi2 links
Dart
ne
=
phi1
(
e
);
phi2unsew
(
d
);
// Correct the phi2 links
Dart
nd
=
phi1
(
d
);
phi2sew
(
d
,
ne
);
Dart
ne
=
phi1
(
e
);
phi2sew
(
e
,
nd
);
}
phi2sew
(
d
,
ne
);
// Correct the phi2 links
phi2sew
(
e
,
nd
);
if
(
isBoundaryMarked
(
e
))
boundaryMark
(
ne
);
// if (isBoundaryMarked(d))
// boundaryMark(nd);
}
}
void
Map2
::
uncutEdge
(
Dart
d
)
void
Map2
::
uncutEdge
(
Dart
d
)
{
{
// assert(vertexDegree(phi1(d)) == 2) ;
// Dart ne = phi2(d) ;
// if(ne == d)
// collapseEdge(d) ;
// else
// {
// Dart nd = phi1(d) ;
// Dart e = phi_1(ne) ;
// phi2unsew(e) ;
// phi2unsew(d) ;
// Map1::collapseEdge(nd) ;
// Map1::collapseEdge(ne) ;
// phi2sew(d, e) ;
// }
assert
(
vertexDegree
(
phi1
(
d
))
==
2
)
;
assert
(
vertexDegree
(
phi1
(
d
))
==
2
)
;
Dart
ne
=
phi2
(
d
)
;
Dart
ne
=
phi2
(
d
)
;
if
(
ne
==
d
)
Dart
nd
=
phi1
(
d
)
;
collapseEdge
(
d
)
;
Dart
e
=
phi_1
(
ne
)
;
else
phi2unsew
(
e
)
;
{
phi2unsew
(
d
)
;
Dart
nd
=
phi1
(
d
)
;
Map1
::
collapseEdge
(
nd
)
;
Dart
e
=
phi_1
(
ne
)
;
Map1
::
collapseEdge
(
ne
)
;
phi2unsew
(
e
)
;
phi2sew
(
d
,
e
)
;
phi2unsew
(
d
)
;
Map1
::
collapseEdge
(
nd
)
;
Map1
::
collapseEdge
(
ne
)
;
phi2sew
(
d
,
e
)
;
}
}
}
Dart
Map2
::
collapseEdge
(
Dart
d
,
bool
delDegenerateFaces
)
Dart
Map2
::
collapseEdge
(
Dart
d
,
bool
delDegenerateFaces
)
{
{
Dart
resV
;
// Dart resV ;
//
// Dart e = phi2(d);
// if (e != d) // Test if an opposite edge exists
// {
// phi2unsew(d); // Unlink the opposite edges
// Dart f = phi1(e) ;
// Dart g = phi_1(e) ;
//
// if(f != d && !isFaceTriangle(e))
// resV = f ;
// else if(phi2(g) != g)
// resV = phi2(g) ;
// else if(f != d && phi2(f) != f)
// resV = phi1(phi2(f)) ;
//
// if (f != e && delDegenerateFaces)
// {
// Map1::collapseEdge(e) ; // Collapse edge e
// collapseDegeneratedFace(f) ;// and collapse its face if degenerated
// }
// else
// Map1::collapseEdge(e) ; // Just collapse edge e
// }
//
// Dart f = phi1(d) ;
// Dart g = phi_1(d) ;
//
// if(resV == Dart::nil())
// {
// if(!isFaceTriangle(d))
// resV = f ;
// else if(phi2(g) != g)
// resV = phi2(g) ;
// else if(phi2(f) != f)
// resV = phi1(phi2(f)) ;
// }
//
// if (f != d && delDegenerateFaces)
// {
// Map1::collapseEdge(d) ; // Collapse edge d
// collapseDegeneratedFace(f) ;// and collapse its face if degenerated
// }
// else
// Map1::collapseEdge(d) ; // Just collapse edge d
//
// return resV ;
Dart
resV
=
Dart
::
nil
()
;
Dart
e
=
phi2
(
d
);
Dart
e
=
phi2
(
d
);
if
(
e
!=
d
)
// Test if an opposite edge exists
phi2unsew
(
d
);
// Unlink the opposite edges
if
(
isBoundaryMarked
(
e
))
{
Dart
f
=
phi1
(
e
)
;
Map1
::
collapseEdge
(
e
)
;
// Collapse edge e
collapseDegeneratedFace
(
f
)
;
// and collapse its face if degenerated
}
else
{
{
phi2unsew
(
d
);
// Unlink the opposite edges
Dart
f
=
phi1
(
e
)
;
Dart
f
=
phi1
(
e
)
;
Dart
g
=
phi_1
(
e
)
;
Dart
g
=
phi_1
(
e
)
;
...
@@ -184,8 +272,8 @@ Dart Map2::collapseEdge(Dart d, bool delDegenerateFaces)
...
@@ -184,8 +272,8 @@ Dart Map2::collapseEdge(Dart d, bool delDegenerateFaces)
bool
Map2
::
flipEdge
(
Dart
d
)
bool
Map2
::
flipEdge
(
Dart
d
)
{
{
Dart
e
=
phi2
(
d
);
// Test if an opposite
Dart
e
=
phi2
(
d
);
// Test if an opposite
if
(
e
!=
d
)
// edge exists
if
(
!
isBoundaryMarked
(
e
))
// edge exists
{
{
Dart
dNext
=
phi1
(
d
);
Dart
dNext
=
phi1
(
d
);
Dart
eNext
=
phi1
(
e
);
Dart
eNext
=
phi1
(
e
);
...
@@ -202,8 +290,8 @@ bool Map2::flipEdge(Dart d)
...
@@ -202,8 +290,8 @@ bool Map2::flipEdge(Dart d)
bool
Map2
::
flipBackEdge
(
Dart
d
)
bool
Map2
::
flipBackEdge
(
Dart
d
)
{
{
Dart
e
=
phi2
(
d
);
// Test if an opposite
Dart
e
=
phi2
(
d
);
// Test if an opposite
if
(
e
!=
d
)
// edge exists
if
(
!
isBoundaryMarked
(
e
))
// edge exists
{
{
Dart
dNext
=
phi1
(
d
);
Dart
dNext
=
phi1
(
d
);
Dart
eNext
=
phi1
(
e
);
Dart
eNext
=
phi1
(
e
);
...
@@ -234,11 +322,26 @@ void Map2::removeEdgeFromVertex(Dart d)
...
@@ -234,11 +322,26 @@ void Map2::removeEdgeFromVertex(Dart d)
void
Map2
::
sewFaces
(
Dart
d
,
Dart
e
)
void
Map2
::
sewFaces
(
Dart
d
,
Dart
e
)
{
{
Dart
dd
=
phi2
(
d
);
Dart
ee
=
phi2
(
ee
);
// unsew from boundary
phi2unsew
(
d
);
phi2unsew
(
e
);
// remove boundary edge
if
(
ee
!=
phi_1
(
dd
))
phi1sew
(
ee
,
phi_1
(
dd
))
;
if
(
ee
!=
phi_1
(
dd
))
phi1sew
(
ee
,
phi_1
(
dd
))
;
Map1
::
deleteOrientedFace
(
d
)
;
// main sewing
phi2sew
(
d
,
e
);
phi2sew
(
d
,
e
);
}
}
void
Map2
::
unsewFaces
(
Dart
d
)
void
Map2
::
unsewFaces
(
Dart
d
)
{
{
// TODO
phi2unsew
(
d
);
phi2unsew
(
d
);
}
}
...
@@ -268,7 +371,7 @@ void Map2::splitFace(Dart d, Dart e)
...
@@ -268,7 +371,7 @@ void Map2::splitFace(Dart d, Dart e)
bool
Map2
::
mergeFaces
(
Dart
d
)
bool
Map2
::
mergeFaces
(
Dart
d
)
{
{
Dart
e
=
phi2
(
d
)
;
Dart
e
=
phi2
(
d
)
;
if
(
e
!=
d
)
if
(
!
isBoundaryMarked
(
e
)
)
{
{
phi2unsew
(
d
);
// unsew the face of d
phi2unsew
(
d
);
// unsew the face of d
Map1
::
mergeFaces
(
d
,
e
);
// merge the two faces along edges of d and e
Map1
::
mergeFaces
(
d
,
e
);
// merge the two faces along edges of d and e
...
@@ -281,7 +384,7 @@ void Map2::extractTrianglePair(Dart d)
...
@@ -281,7 +384,7 @@ void Map2::extractTrianglePair(Dart d)
{
{
assert
(
isFaceTriangle
(
d
))
;
assert
(
isFaceTriangle
(
d
))
;
Dart
e
=
phi2
(
d
)
;
Dart
e
=
phi2
(
d
)
;
if
(
e
!=
d
)
if
(
!
isBoundaryMarked
(
e
)
)
{
{
assert
(
isFaceTriangle
(
e
))
;
assert
(
isFaceTriangle
(
e
))
;
Dart
e1
=
phi2
(
phi1
(
e
))
;
Dart
e1
=
phi2
(
phi1
(
e
))
;
...
@@ -300,12 +403,12 @@ void Map2::extractTrianglePair(Dart d)
...
@@ -300,12 +403,12 @@ void Map2::extractTrianglePair(Dart d)
void
Map2
::
insertTrianglePair
(
Dart
d
,
Dart
v1
,
Dart
v2
)
void
Map2
::
insertTrianglePair
(
Dart
d
,
Dart
v1
,
Dart
v2
)
{
{
assert
(
sameOrientedVertex
(
v1
,
v2
))
;
assert
(
sameOrientedVertex
(
v1
,
v2
))
;
assert
((
v1
!=
v2
&&
phi2
(
d
)
!=
d
)
||
(
v1
==
v2
&&
phi2
(
d
)
==
d
))
;
assert
((
v1
!=
v2
&&
!
isBoundaryMarked
(
d
))
||
(
v1
==
v2
&&
isBoundaryMarked
(
d
)
))
;
assert
(
isFaceTriangle
(
d
)
&&
phi2
(
phi1
(
d
))
==
phi1
(
d
)
&&
phi2
(
phi_1
(
d
))
==
phi_1
(
d
)
)
;
assert
(
isFaceTriangle
(
d
)
&&
isBoundaryMarked
(
phi1
(
d
))
&&
isBoundaryMarked
(
phi_1
(
d
))
)
;
Dart
e
=
phi2
(
d
)
;
Dart
e
=
phi2
(
d
)
;
if
(
e
!=
d
&&
v1
!=
v2
)
if
(
!
isBoundaryMarked
(
e
)
&&
v1
!=
v2
)
{
{
assert
(
isFaceTriangle
(
e
)
&&
phi2
(
phi1
(
e
))
==
phi1
(
e
)
&&
phi2
(
phi_1
(
e
))
==
phi_1
(
e
)
)
;
assert
(
isFaceTriangle
(
e
)
&&
isBoundaryMarked
(
phi1
(
e
))
&&
isBoundaryMarked
(
phi_1
(
e
))
)
;
Dart
vv2
=
phi2
(
v2
)
;
Dart
vv2
=
phi2
(
v2
)
;
phi2unsew
(
v2
)
;
phi2unsew
(
v2
)
;
phi2sew
(
phi_1
(
e
),
v2
)
;
phi2sew
(
phi_1
(
e
),
v2
)
;
...
@@ -506,27 +609,47 @@ unsigned int Map2::volumeDegree(Dart d)
...
@@ -506,27 +609,47 @@ unsigned int Map2::volumeDegree(Dart d)
bool
Map2
::
isBoundaryVertex
(
Dart
d
)
bool
Map2
::
isBoundaryVertex
(
Dart
d
)
{
{
// Dart dNext = d ;
// do
// {
// if(phi2(dNext) == dNext)
// return true ;
// dNext = alpha1(dNext) ;
// } while (dNext != d) ;
// return false ;
Dart
dNext
=
d
;
Dart
dNext
=
d
;
do
do
{
{
if
(
phi2
(
dNext
)
==
dNext
)
if
(
isBoundaryMarked
(
phi2
(
dNext
))
)
return
true
;
return
true
;
dNext
=
alpha1
(
dNext
)
;
dNext
=
alpha1
(
dNext
)
;
}
while
(
dNext
!=
d
)
;
}
while
(
dNext
!=
d
)
;
return
false
;
return
false
;
}
}
Dart
Map2
::
nextOnBoundary
(
Dart
d
)
Dart
Map2
::
nextOnBoundary
(
Dart
d
)
{
{
assert
(
phi2
(
d
)
==
d
);
// Only work on boundary dart
// assert(phi2(d) == d); // Only work on boundary dart
// Dart dPhi1;
// Dart dNext = d;
// do
// { // Loop inside the vertex
// dPhi1 = phi1(dNext);
// dNext = phi2(dPhi1);
// } while (dNext != dPhi1);
// return dNext;
assert
(
isBoundaryMarked
(
phi2
(
d
))
);
// Only work on boundary dart
Dart
dPhi1
;
Dart
dPhi1
;
Dart
dNext
=
d
;
Dart
dNext
=
d
;
do
do
{
// Loop inside the vertex
{
// Loop inside the vertex
dPhi1
=
phi1
(
dNext
);
dPhi1
=
phi1
(
dNext
);
dNext
=
phi2
(
dPhi1
);
dNext
=
phi2
(
dPhi1
);
}
while
(
dNext
!=
dPhi1
);
}
while
(
!
isBoundaryMarked
(
dNext
)
);
return
d
Next
;
return
d
Phi1
;
}
}
bool
Map2
::
isTriangular
()
bool
Map2
::
isTriangular
()
...
...
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