Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
gmsh
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
45485ad6
Commit
45485ad6
authored
13 years ago
by
Amaury Johnen
Browse files
Options
Downloads
Patches
Plain Diff
it works !
parent
ae592081
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
Mesh/meshGFaceRecombine.cpp
+572
-57
572 additions, 57 deletions
Mesh/meshGFaceRecombine.cpp
Mesh/meshGFaceRecombine.h
+91
-13
91 additions, 13 deletions
Mesh/meshGFaceRecombine.h
with
663 additions
and
70 deletions
Mesh/meshGFaceRecombine.cpp
+
572
−
57
View file @
45485ad6
...
...
@@ -34,6 +34,66 @@ Rec2DData *Rec2DData::_current = NULL;
double
**
Rec2DVertex
::
_qualVSnum
=
NULL
;
double
**
Rec2DVertex
::
_gains
=
NULL
;
bool
edgesInOrder
(
Rec2DEdge
**
edges
,
int
numEdges
)
{
Rec2DVertex
**
v
,
*
v0
,
*
v1
;
v
=
new
Rec2DVertex
*
[
numEdges
];
v0
=
edges
[
0
]
->
getVertex
(
0
);
v1
=
edges
[
0
]
->
getVertex
(
1
);
if
(
edges
[
1
]
->
getVertex
(
0
)
==
v0
||
edges
[
1
]
->
getVertex
(
1
)
==
v0
)
{
v
[
0
]
=
v0
;
if
(
edges
[
1
]
->
getVertex
(
0
)
==
v0
)
v
[
1
]
=
edges
[
1
]
->
getVertex
(
1
);
else
v
[
1
]
=
edges
[
1
]
->
getVertex
(
0
);
}
else
if
(
edges
[
1
]
->
getVertex
(
0
)
==
v1
||
edges
[
1
]
->
getVertex
(
1
)
==
v1
)
{
v
[
0
]
=
v1
;
if
(
edges
[
1
]
->
getVertex
(
0
)
==
v1
)
v
[
1
]
=
edges
[
1
]
->
getVertex
(
1
);
else
v
[
1
]
=
edges
[
1
]
->
getVertex
(
0
);
}
else
{
Msg
::
Error
(
"edges not in order (1)"
);
for
(
int
i
=
0
;
i
<
numEdges
;
++
i
)
{
edges
[
i
]
->
print
();
}
return
false
;
}
for
(
int
i
=
2
;
i
<
numEdges
;
++
i
)
{
if
(
edges
[
i
]
->
getVertex
(
0
)
==
v
[
i
-
1
])
v
[
i
]
=
edges
[
i
]
->
getVertex
(
1
);
else
if
(
edges
[
i
]
->
getVertex
(
1
)
==
v
[
i
-
1
])
v
[
i
]
=
edges
[
i
]
->
getVertex
(
0
);
else
{
Msg
::
Error
(
"edges not in order (2)"
);
for
(
int
i
=
0
;
i
<
numEdges
;
++
i
)
{
edges
[
i
]
->
print
();
}
return
false
;
}
}
if
(
v
[
0
]
==
v1
&&
v
[
numEdges
-
1
]
!=
v0
||
v
[
0
]
==
v0
&&
v
[
numEdges
-
1
]
!=
v1
)
{
Msg
::
Error
(
"edges not in order (3)"
);
for
(
int
i
=
0
;
i
<
numEdges
;
++
i
)
{
edges
[
i
]
->
print
();
}
return
false
;
}
delete
v
;
return
true
;
}
void
crash
()
{
int
a
[
2
];
int
e
=
0
;
for
(
int
i
=
0
;
i
<
10000000
;
++
i
)
e
+=
a
[
i
];
Msg
::
Info
(
"%d"
,
e
);
}
int
otherParity
(
int
a
)
{
if
(
a
%
2
)
...
...
@@ -275,6 +335,7 @@ double Recombine2D::recombine(int depth)
FlGui
::
instance
()
->
check
();
time
=
Cpu
();
#endif
Recombine2D
::
drawStateOrigin
();
Rec2DNode
*
root
=
new
Rec2DNode
(
NULL
,
NULL
,
bestGlobalQuality
,
depth
);
Rec2DNode
*
currentNode
=
root
->
selectBestNode
();
...
...
@@ -284,7 +345,7 @@ double Recombine2D::recombine(int depth)
while
(
currentNode
)
{
//_data->checkQuality();
FlGui
::
instance
()
->
check
();
#ifdef REC2D_DRAW // draw state at origin
#if
0//
def REC2D_DRAW // draw state at origin
_gf->triangles = _data->_tri;
_gf->quadrangles = _data->_quad;
CTX::instance()->mesh.changed = ENT_ALL;
...
...
@@ -293,7 +354,7 @@ double Recombine2D::recombine(int depth)
FlGui::instance()->check();
time = Cpu();
#endif
#ifdef REC2D_DRAW // draw all states
#if
0//
def REC2D_DRAW // draw all states
if ( !((i+1) % ((int)std::sqrt(num)+1)) ) {
dx = .0;
dy -= 1.1;
...
...
@@ -417,11 +478,20 @@ void Recombine2D::drawState(double shiftx, double shifty) const
{
//_data->drawTriangles(shiftx, shifty);
_data
->
drawElements
(
shiftx
,
shifty
);
_data
->
drawChanges
(
shiftx
,
shifty
);
//
_data->drawChanges(shiftx, shifty);
CTX
::
instance
()
->
mesh
.
changed
=
ENT_ALL
;
drawContext
::
global
()
->
draw
();
}
void
Recombine2D
::
drawStateOrigin
()
{
_current
->
_gf
->
triangles
=
_current
->
_data
->
_tri
;
_current
->
_gf
->
quadrangles
=
_current
->
_data
->
_quad
;
CTX
::
instance
()
->
mesh
.
changed
=
ENT_ALL
;
drawContext
::
global
()
->
draw
();
FlGui
::
instance
()
->
check
();
}
void
Recombine2D
::
printState
()
const
{
_data
->
printState
();
...
...
@@ -675,6 +745,43 @@ void Rec2DData::checkQuality() const
}
}
void
Rec2DData
::
checkEntities
()
{
iter_rv
itv
;
for
(
itv
=
firstVertex
();
itv
!=
lastVertex
();
++
itv
)
{
if
(
!
(
*
itv
)
->
checkCoherence
())
{
Msg
::
Error
(
"Incoherence vertex"
);
crash
();
return
;
}
}
iter_re
ite
;
for
(
ite
=
firstEdge
();
ite
!=
lastEdge
();
++
ite
)
{
if
(
!
(
*
ite
)
->
checkCoherence
())
{
Msg
::
Error
(
"Incoherence edge"
);
crash
();
return
;
}
}
iter_rel
itel
;
for
(
itel
=
firstElement
();
itel
!=
lastElement
();
++
itel
)
{
if
(
!
(
*
itel
)
->
checkCoherence
())
{
Msg
::
Error
(
"Incoherence element"
);
crash
();
return
;
}
}
std
::
list
<
Rec2DAction
*>::
iterator
ita
=
_current
->
_actions
.
begin
();
for
(;
ita
!=
_current
->
_actions
.
end
();
++
ita
)
{
if
(
!
(
*
ita
)
->
checkCoherence
())
{
Msg
::
Error
(
"Incoherence action"
);
crash
();
return
;
}
}
//Msg::Fatal("Je meurs !!");
}
void
Rec2DData
::
printActions
()
const
{
std
::
map
<
int
,
std
::
vector
<
double
>
>
data
;
...
...
@@ -959,9 +1066,11 @@ Rec2DChange::Rec2DChange(Rec2DAction *ra, bool toHide) : _entity(ra), _info(NULL
ra
->
hide
();
_type
=
HideAction
;
}
else
else
{
ra
->
addPointing
();
_type
=
CreatedAction
;
}
}
Rec2DChange
::
Rec2DChange
(
const
std
::
vector
<
Rec2DAction
*>
&
actions
,
bool
toHide
)
:
_info
(
NULL
)
{
...
...
@@ -1087,6 +1196,26 @@ Rec2DChange::Rec2DChange(Rec2DVertex *rv0, Rec2DVertex *rv1,
_entity
=
_info
=
NULL
;
}
Rec2DChange
::
Rec2DChange
(
Rec2DVertex
*
rv0
,
Rec2DVertex
*
rv1
,
const
std
::
vector
<
Rec2DElement
*>
&
elem
,
Rec2DChangeType
type
)
{
if
(
type
==
SwapMVertInElement
)
{
_type
=
type
;
std
::
vector
<
Rec2DElement
*>
*
vect
=
new
std
::
vector
<
Rec2DElement
*>
();
*
vect
=
elem
;
_entity
=
vect
;
std
::
pair
<
Rec2DVertex
*
,
Rec2DVertex
*>
*
pairVert
;
pairVert
=
new
std
::
pair
<
Rec2DVertex
*
,
Rec2DVertex
*>
(
rv1
,
rv0
);
_info
=
pairVert
;
for
(
unsigned
int
i
=
0
;
i
<
elem
.
size
();
++
i
)
elem
[
i
]
->
swapMVertex
(
rv0
,
rv1
);
return
;
}
_type
=
Error
;
_entity
=
_info
=
NULL
;
}
Rec2DChange
::
Rec2DChange
(
Rec2DEdge
*
re0
,
Rec2DEdge
*
re1
,
const
std
::
vector
<
Rec2DAction
*>
&
actions
,
Rec2DChangeType
type
)
...
...
@@ -1180,13 +1309,18 @@ void Rec2DChange::revert()
case
CreatedAction
:
{
Rec2DAction
*
action
=
(
Rec2DAction
*
)
_entity
;
if
(
action
->
getInfant
())
{
action
->
hide
();
Rec2DData
::
addHidden
(
action
);
Rec2DAction
*
ra
=
(
Rec2DAction
*
)
_entity
;
if
(
ra
->
getPointing
())
{
ra
->
hide
();
}
else
{
if
(
ra
->
getInfant
())
{
ra
->
hide
();
Rec2DData
::
addHidden
(
ra
);
}
else
delete
action
;
delete
ra
;
}
}
break
;
...
...
@@ -1202,8 +1336,19 @@ void Rec2DChange::revert()
case
CreatedActions
:
{
std
::
vector
<
Rec2DAction
*>
*
vect
=
(
std
::
vector
<
Rec2DAction
*>*
)
_entity
;
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
for
(
unsigned
int
i
=
0
;
i
<
vect
->
size
();
++
i
)
{
if
((
*
vect
)[
i
]
->
getPointing
())
{
(
*
vect
)[
i
]
->
hide
();
}
else
{
if
((
*
vect
)[
i
]
->
getInfant
())
{
(
*
vect
)[
i
]
->
hide
();
Rec2DData
::
addHidden
((
*
vect
)[
i
]);
}
else
delete
(
*
vect
)[
i
];
}
}
delete
vect
;
}
break
;
...
...
@@ -1253,6 +1398,18 @@ void Rec2DChange::revert()
}
break
;
case
SwapMVertInElement
:
{
std
::
vector
<
Rec2DElement
*>
*
elem
=
(
std
::
vector
<
Rec2DElement
*>*
)
_entity
;
std
::
pair
<
Rec2DVertex
*
,
Rec2DVertex
*>
*
pairVert
;
pairVert
=
(
std
::
pair
<
Rec2DVertex
*
,
Rec2DVertex
*>*
)
_info
;
for
(
unsigned
int
i
=
0
;
i
<
elem
->
size
();
++
i
)
(
*
elem
)[
i
]
->
swapMVertex
(
pairVert
->
first
,
pairVert
->
second
);
delete
elem
;
delete
pairVert
;
}
break
;
case
RemoveElem
:
{
std
::
vector
<
Rec2DElement
*>
*
elem
=
(
std
::
vector
<
Rec2DElement
*>*
)
_info
;
...
...
@@ -1354,15 +1511,17 @@ void Rec2DDataChange::swapFor(Rec2DVertex *rv0, Rec2DVertex *rv1)
elem
[
i
]
->
getUniqueActions
(
actions
);
}
Rec2DAction
::
removeDuplicate
(
actions
);
_changes
.
push_back
(
new
Rec2DChange
(
rv0
,
rv1
,
actions
,
SwapVertInAction
));
_changes
.
push_back
(
new
Rec2DChange
(
rv0
,
elem
,
RemoveElem
));
_changes
.
push_back
(
new
Rec2DChange
(
rv0
,
rv1
,
edges
,
SwapVertInEdge
));
_changes
.
push_back
(
new
Rec2DChange
(
rv0
,
rv1
,
actions
,
SwapVertInAction
));
_changes
.
push_back
(
new
Rec2DChange
(
rv1
,
elem
,
AddElem
));
_changes
.
push_back
(
new
Rec2DChange
(
rv0
,
rv1
,
elem
,
SwapMVertInElement
));
}
void
Rec2DDataChange
::
revert
()
{
//Msg::Info("reverting");
Msg
::
Info
(
"reverting"
);
_ra
->
printIdentity
();
for
(
int
i
=
(
int
)
_changes
.
size
()
-
1
;
i
>
-
1
;
--
i
)
_changes
[
i
]
->
revert
();
//Msg::Info(".");
...
...
@@ -1382,7 +1541,7 @@ bool gterRec2DAction::operator()(Rec2DAction *ra1, Rec2DAction *ra2) const
}
Rec2DAction
::
Rec2DAction
()
:
_globQualIfExecuted
(
.0
),
_lastUpdate
(
-
2
)
:
_globQualIfExecuted
(
.0
),
_lastUpdate
(
-
2
)
,
_numPointing
(
0
)
{
}
...
...
@@ -1455,6 +1614,8 @@ Rec2DTwoTri2Quad::Rec2DTwoTri2Quad(Rec2DElement *el0, Rec2DElement *el1)
_triangles
[
0
]
->
add
(
this
);
_triangles
[
1
]
->
add
(
this
);
Rec2DData
::
add
(
this
);
if
(
!
edgesInOrder
(
_edges
,
4
))
Msg
::
Error
(
"recomb |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
}
void
Rec2DTwoTri2Quad
::
hide
()
...
...
@@ -1480,6 +1641,84 @@ void Rec2DTwoTri2Quad::reveal()
Rec2DData
::
add
(
this
);
}
bool
Rec2DTwoTri2Quad
::
checkCoherence
()
const
{
Rec2DEdge
*
edge4
=
Rec2DElement
::
getCommonEdge
(
_triangles
[
0
],
_triangles
[
1
]);
if
(
!
edge4
)
{
if
(
!
_triangles
[
0
]
->
has
(
_edges
[
4
])
||
!
_triangles
[
1
]
->
has
(
_edges
[
4
]))
{
Msg
::
Error
(
"inco action -1, |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
}
}
else
if
(
_edges
[
4
]
!=
edge4
)
{
Msg
::
Error
(
"inco action 0, |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
if
(
_edges
[
4
])
_edges
[
4
]
->
print
();
else
Msg
::
Info
(
"no edge"
);
if
(
Rec2DElement
::
getCommonEdge
(
_triangles
[
0
],
_triangles
[
1
]))
Rec2DElement
::
getCommonEdge
(
_triangles
[
0
],
_triangles
[
1
])
->
print
();
else
Msg
::
Info
(
"no edge"
);
return
false
;
}
std
::
vector
<
Rec2DEdge
*>
edges
;
Rec2DEdge
*
re
[
4
];
_triangles
[
0
]
->
getMoreEdges
(
edges
);
_triangles
[
1
]
->
getMoreEdges
(
edges
);
int
k
=
-
1
;
for
(
unsigned
int
i
=
0
;
i
<
edges
.
size
();
++
i
)
{
if
(
edges
[
i
]
!=
_edges
[
4
])
re
[
++
k
]
=
edges
[
i
];
}
if
(
k
>
3
)
Msg
::
Error
(
"[Rec2DTwoTri2Quad] too much edges"
);
// reoder edges if needed
if
(
edges
[
1
]
==
_edges
[
4
])
{
Rec2DEdge
*
e
=
re
[
0
];
re
[
0
]
=
re
[
1
];
re
[
1
]
=
e
;
}
if
(
edges
[
4
]
==
_edges
[
4
])
{
Rec2DEdge
*
e
=
re
[
2
];
re
[
2
]
=
re
[
3
];
re
[
3
]
=
e
;
}
for
(
int
i
=
0
;
i
<
4
;
++
i
)
{
if
(
re
[
i
]
!=
_edges
[
i
])
{
Msg
::
Error
(
"inco action 1, |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
for
(
int
i
=
0
;
i
<
4
;
++
i
)
{
_edges
[
i
]
->
print
();
re
[
i
]
->
print
();
Msg
::
Info
(
" "
);
}
return
false
;
}
}
if
(
_vertices
[
0
]
!=
_edges
[
4
]
->
getVertex
(
0
))
{
Msg
::
Error
(
"inco action 2, |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
return
false
;
}
if
(
_vertices
[
1
]
!=
_edges
[
4
]
->
getVertex
(
1
))
{
Msg
::
Error
(
"inco action 3, |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
return
false
;
}
if
(
_vertices
[
2
]
!=
_triangles
[
0
]
->
getOtherVertex
(
_vertices
[
0
],
_vertices
[
1
]))
{
Msg
::
Error
(
"inco action 4, |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
return
false
;
}
if
(
_vertices
[
3
]
!=
_triangles
[
1
]
->
getOtherVertex
(
_vertices
[
0
],
_vertices
[
1
]))
{
Msg
::
Error
(
"inco action 5, |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
return
false
;
}
return
true
;
}
void
Rec2DTwoTri2Quad
::
printIdentity
()
const
{
Msg
::
Info
(
"Recombine |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
}
//void Rec2DTwoTri2Quad::print()
//{
// Msg::Info("Printing Action %d |%d|%d|...", this, _triangles[0]->getNum(), _triangles[1]->getNum());
...
...
@@ -1597,9 +1836,10 @@ void Rec2DTwoTri2Quad::apply(std::vector<Rec2DVertex*> &newPar)
Recombine2D
::
incNumChange
();
}
void
Rec2DTwoTri2Quad
::
apply
(
Rec2DDataChange
*
rdc
)
const
void
Rec2DTwoTri2Quad
::
apply
(
Rec2DDataChange
*
rdc
,
std
::
vector
<
Rec2DAction
*>
*&
createdActions
)
const
{
//
Msg::Info("Applying Rec2DTwoTri2Quad |%d|%d|", _triangles[0]->getNum(), _triangles[1]->getNum());
Msg
::
Info
(
"Applying Rec2DTwoTri2Quad |%d|%d|"
,
_triangles
[
0
]
->
getNum
(),
_triangles
[
1
]
->
getNum
());
if
(
isObsolete
())
{
Msg
::
Error
(
"[Rec2DTwoTri2Quad] I was obsolete !"
);
}
...
...
@@ -1868,7 +2108,25 @@ void Rec2DCollapse::printReward() const
void
Rec2DCollapse
::
_computeGlobQual
()
{
std
::
vector
<
Rec2DVertex
*>
verts
;
_rec
->
_vertices
[
0
]
->
getMoreNeighbourVertices
(
verts
);
_rec
->
_vertices
[
1
]
->
getMoreNeighbourVertices
(
verts
);
for
(
unsigned
int
i
=
0
;
i
<
verts
.
size
();
++
i
)
{
if
(
verts
[
i
]
->
getLastUpdate
()
>
_lastUpdate
)
{
//std::vector<Rec2DElement*> elem;
//getElements(elem);
//Msg::Info("collapse(%d, %d) -> %g", elem[0]->getNum(), elem[1]->getNum(), _globQualIfExecuted);
delete
(
new
Rec2DNode
(
NULL
,
this
,
_globQualIfExecuted
,
0
));
_lastUpdate
=
Recombine2D
::
getNumChange
();
return
;
}
}
}
void
Rec2DCollapse
::
printIdentity
()
const
{
Msg
::
Info
(
"Collapse |%d|%d|"
,
_rec
->
_triangles
[
0
]
->
getNum
(),
_rec
->
_triangles
[
1
]
->
getNum
());
}
void
Rec2DCollapse
::
apply
(
std
::
vector
<
Rec2DVertex
*>
&
newPar
)
...
...
@@ -1877,9 +2135,10 @@ void Rec2DCollapse::apply(std::vector<Rec2DVertex*> &newPar)
if
(
++
a
<
1
)
Msg
::
Error
(
"FIXME Need definition Rec2DTwoTri2Quad::apply(newPar)"
);
}
void
Rec2DCollapse
::
apply
(
Rec2DDataChange
*
rdc
)
const
void
Rec2DCollapse
::
apply
(
Rec2DDataChange
*
rdc
,
std
::
vector
<
Rec2DAction
*>
*&
createdActions
)
const
{
//
Msg::Info("Applying Rec2DCollapse |%d|%d|", _rec->_triangles[0]->getNum(), _rec->_triangles[1]->getNum());
Msg
::
Info
(
"Applying Rec2DCollapse |%d|%d|"
,
_rec
->
_triangles
[
0
]
->
getNum
(),
_rec
->
_triangles
[
1
]
->
getNum
());
if
(
isObsolete
())
{
Msg
::
Error
(
"[Rec2DTwoTri2Quad] I was obsolete !"
);
}
...
...
@@ -1919,6 +2178,7 @@ void Rec2DCollapse::apply(Rec2DDataChange *rdc) const
//Msg::Info("v--%g", Rec2DData::getValVert());
bool
edge12KO
=
_rec
->
_edges
[
1
]
->
getVertex
(
0
)
==
vKO
||
_rec
->
_edges
[
1
]
->
getVertex
(
1
)
==
vKO
;
//Msg::Info("swap %d for %d", vKO->getNum(), vOK->getNum());
rdc
->
swapFor
(
vKO
,
vOK
);
//Msg::Info("v---%g", Rec2DData::getValVert());
rdc
->
hide
(
vKO
);
...
...
@@ -1938,19 +2198,34 @@ void Rec2DCollapse::apply(Rec2DDataChange *rdc) const
rdc
->
swapFor
(
_rec
->
_edges
[
i1
],
_rec
->
_edges
[
i3
]);
rdc
->
hide
(
_rec
->
_edges
[
i0
]);
rdc
->
hide
(
_rec
->
_edges
[
i1
]);
if
(
createdActions
)
{
for
(
unsigned
int
i
=
0
;
i
<
createdActions
->
size
();
++
i
)
{
(
*
createdActions
)[
i
]
->
reveal
();
rdc
->
append
((
*
createdActions
)[
i
]);
}
}
else
{
createdActions
=
new
std
::
vector
<
Rec2DAction
*>
;
Rec2DElement
*
elem
[
2
];
Rec2D
TwoTri2Quad
*
newAction
;
Rec2D
Action
*
newAction
;
Rec2DEdge
::
getElements
(
_rec
->
_edges
[
i2
],
elem
);
if
(
elem
[
1
]
&&
elem
[
0
]
->
isTri
()
&&
elem
[
1
]
->
isTri
())
{
newAction
=
new
Rec2DTwoTri2Quad
(
elem
[
0
],
elem
[
1
]);
rdc
->
append
(
new
Rec2DCollapse
(
newAction
));
rdc
->
append
(
newAction
);
createdActions
->
push_back
(
newAction
);
newAction
=
new
Rec2DCollapse
((
Rec2DTwoTri2Quad
*
)
newAction
);
rdc
->
append
(
newAction
);
createdActions
->
push_back
(
newAction
);
}
Rec2DEdge
::
getElements
(
_rec
->
_edges
[
i3
],
elem
);
if
(
elem
[
1
]
&&
elem
[
0
]
->
isTri
()
&&
elem
[
1
]
->
isTri
())
{
newAction
=
new
Rec2DTwoTri2Quad
(
elem
[
0
],
elem
[
1
]);
rdc
->
append
(
new
Rec2DCollapse
(
newAction
));
rdc
->
append
(
newAction
);
createdActions
->
push_back
(
newAction
);
newAction
=
new
Rec2DCollapse
((
Rec2DTwoTri2Quad
*
)
newAction
);
rdc
->
append
(
newAction
);
createdActions
->
push_back
(
newAction
);
}
}
}
...
...
@@ -1976,9 +2251,19 @@ bool Rec2DCollapse::isObsolete() const
int
p
[
2
];
p
[
0
]
=
_rec
->
_vertices
[
0
]
->
getParity
();
p
[
1
]
=
_rec
->
_vertices
[
1
]
->
getParity
();
return
(
p
[
0
]
&&
p
[
0
]
/
2
==
p
[
1
]
/
2
&&
p
[
0
]
%
2
!=
p
[
1
]
%
2
)
||
(
_rec
->
_vertices
[
0
]
->
getOnBoundary
()
&&
_rec
->
_vertices
[
1
]
->
getOnBoundary
()
)
;
return
p
[
0
]
&&
p
[
0
]
/
2
==
p
[
1
]
/
2
&&
p
[
0
]
%
2
!=
p
[
1
]
%
2
||
_rec
->
_vertices
[
0
]
->
getOnBoundary
()
&&
_rec
->
_vertices
[
1
]
->
getOnBoundary
()
||
!
_rec
->
_vertices
[
2
]
->
getOnBoundary
()
&&
_rec
->
_vertices
[
2
]
->
getNumElements
()
<
4
||
!
_rec
->
_vertices
[
3
]
->
getOnBoundary
()
&&
_rec
->
_vertices
[
3
]
->
getNumElements
()
<
4
;
}
bool
Rec2DCollapse
::
_hasIdenticalElement
()
const
{
return
_rec
->
_triangles
[
0
]
->
hasIdenticalNeighbour
()
||
_rec
->
_triangles
[
1
]
->
hasIdenticalNeighbour
()
;
}
bool
Rec2DCollapse
::
whatWouldYouDo
...
...
@@ -1993,9 +2278,10 @@ bool Rec2DCollapse::whatWouldYouDo
/** Rec2DEdge **/
/*****************/
Rec2DEdge
::
Rec2DEdge
(
Rec2DVertex
*
rv0
,
Rec2DVertex
*
rv1
)
:
_rv0
(
rv0
),
_rv1
(
rv1
),
_lastUpdate
(
-
2
),
:
_rv0
(
rv0
),
_rv1
(
rv1
),
_lastUpdate
(
-
1
),
_weight
(
REC2D_EDGE_BASE
+
2
*
REC2D_EDGE_QUAD
),
_boundary
(
-
1
)
{
_computeQual
();
reveal
();
}
...
...
@@ -2015,6 +2301,24 @@ void Rec2DEdge::reveal()
Rec2DData
::
addEdge
(
_weight
,
getWeightedQual
());
}
bool
Rec2DEdge
::
checkCoherence
()
const
{
if
(
_rv0
==
_rv1
)
return
false
;
if
(
!
_rv0
->
has
(
this
)
||
!
_rv1
->
has
(
this
))
return
false
;
return
true
;
Rec2DElement
*
elem
[
2
];
Rec2DEdge
::
getElements
(
this
,
elem
);
if
(
elem
[
1
])
{
if
(
!
elem
[
0
]
->
has
(
this
)
||
!
elem
[
1
]
->
has
(
this
))
return
false
;
if
(
!
elem
[
0
]
->
isNeighbour
(
this
,
elem
[
1
])
||
!
elem
[
1
]
->
isNeighbour
(
this
,
elem
[
0
])
)
return
false
;
}
else
{
if
(
!
elem
[
0
]
->
has
(
this
))
return
false
;
if
(
!
elem
[
0
]
->
isNeighbour
(
this
,
NULL
))
return
false
;
}
}
void
Rec2DEdge
::
_computeQual
()
{
double
alignment
=
_straightAlignment
();
...
...
@@ -2214,7 +2518,7 @@ void Rec2DEdge::getActions(std::vector<Rec2DAction*> &actions) const
/*******************/
Rec2DVertex
::
Rec2DVertex
(
MVertex
*
v
)
:
_v
(
v
),
_angle
(
4.
*
M_PI
),
_onWhat
(
1
),
_parity
(
0
),
_lastUpdate
(
Recombine2D
::
getNumChange
()
),
_sumQualAngle
(
.0
)
_lastUpdate
(
-
1
),
_sumQualAngle
(
.0
)
{
reparamMeshVertexOnFace
(
_v
,
Recombine2D
::
getGFace
(),
_param
);
Rec2DData
::
add
(
this
);
...
...
@@ -2273,12 +2577,29 @@ void Rec2DVertex::reveal()
Rec2DData
::
addVert
(
2
,
getQual
());
}
bool
Rec2DVertex
::
checkCoherence
()
const
{
for
(
unsigned
int
i
=
0
;
i
<
_edges
.
size
();
++
i
)
{
if
(
!
_edges
[
i
]
->
has
(
this
))
return
false
;
for
(
unsigned
int
j
=
0
;
j
<
i
;
++
j
)
{
if
(
_edges
[
i
]
==
_edges
[
j
])
return
false
;
}
}
for
(
unsigned
int
i
=
0
;
i
<
_elements
.
size
();
++
i
)
{
if
(
!
_elements
[
i
]
->
has
(
this
))
return
false
;
for
(
unsigned
int
j
=
0
;
j
<
i
;
++
j
)
{
if
(
_elements
[
i
]
==
_elements
[
j
])
return
false
;
}
}
return
true
;
}
void
Rec2DVertex
::
initStaticTable
()
{
// _qualVSnum[onWhat][numEl]; onWhat={0:edge,1:face}
// _gains[onWhat][numEl]; onWhat={0:edge,1:face} (earning of adding an element)
if
(
_qualVSnum
==
NULL
)
{
int
nE
=
1
0
,
nF
=
2
0
;
//edge, face
int
nE
=
2
0
,
nF
=
4
0
;
//edge, face
_qualVSnum
=
new
double
*
[
2
];
_qualVSnum
[
0
]
=
new
double
[
nE
];
...
...
@@ -2464,6 +2785,13 @@ void Rec2DVertex::getElements(std::vector<Rec2DElement*> &elem) const
}
}
void
Rec2DVertex
::
getMoreNeighbourVertices
(
std
::
vector
<
Rec2DVertex
*>
&
verts
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
_edges
.
size
();
++
i
)
{
verts
.
push_back
(
_edges
[
i
]
->
getOtherVertex
(
this
));
}
}
void
Rec2DVertex
::
getUniqueEdges
(
std
::
vector
<
Rec2DEdge
*>
&
edges
)
const
{
unsigned
int
size
=
edges
.
size
();
...
...
@@ -2535,7 +2863,7 @@ double Rec2DVertex::getGainMerge(const Rec2DElement *rel1,
+
getGainDegree
(
-
1
);
}
void
Rec2DVertex
::
add
(
Rec2DEdge
*
re
)
void
Rec2DVertex
::
add
(
const
Rec2DEdge
*
re
)
{
for
(
unsigned
int
i
=
0
;
i
<
_edges
.
size
();
++
i
)
{
if
(
_edges
[
i
]
==
re
)
{
...
...
@@ -2543,10 +2871,10 @@ void Rec2DVertex::add(Rec2DEdge *re)
return
;
}
}
_edges
.
push_back
(
re
);
_edges
.
push_back
(
(
Rec2DEdge
*
)
re
);
}
bool
Rec2DVertex
::
has
(
Rec2DEdge
*
re
)
const
bool
Rec2DVertex
::
has
(
const
Rec2DEdge
*
re
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
_edges
.
size
();
++
i
)
{
if
(
_edges
[
i
]
==
re
)
...
...
@@ -2555,7 +2883,7 @@ bool Rec2DVertex::has(Rec2DEdge *re) const
return
false
;
}
void
Rec2DVertex
::
rmv
(
Rec2DEdge
*
re
)
void
Rec2DVertex
::
rmv
(
const
Rec2DEdge
*
re
)
{
unsigned
int
i
=
0
;
while
(
i
<
_edges
.
size
())
{
...
...
@@ -2569,7 +2897,7 @@ void Rec2DVertex::rmv(Rec2DEdge *re)
Msg
::
Error
(
"[Rec2DVertex] Didn't removed edge, didn't have it"
);
}
void
Rec2DVertex
::
add
(
Rec2DElement
*
rel
)
void
Rec2DVertex
::
add
(
const
Rec2DElement
*
rel
)
{
for
(
unsigned
int
i
=
0
;
i
<
_elements
.
size
();
++
i
)
{
if
(
_elements
[
i
]
==
rel
)
{
...
...
@@ -2580,13 +2908,13 @@ void Rec2DVertex::add(Rec2DElement *rel)
if
(
_elements
.
size
())
Rec2DData
::
addVert
(
-
2
,
-
getQual
());
_elements
.
push_back
(
rel
);
_elements
.
push_back
(
(
Rec2DElement
*
)
rel
);
_sumQualAngle
+=
_angle2Qual
(
rel
->
getAngle
(
this
));
Rec2DData
::
addVert
(
2
,
getQual
());
_lastUpdate
=
Recombine2D
::
getNumChange
();
}
bool
Rec2DVertex
::
has
(
Rec2DElement
*
rel
)
const
bool
Rec2DVertex
::
has
(
const
Rec2DElement
*
rel
)
const
{
for
(
unsigned
int
i
=
0
;
i
<
_elements
.
size
();
++
i
)
{
if
(
_elements
[
i
]
==
rel
)
...
...
@@ -2595,7 +2923,7 @@ bool Rec2DVertex::has(Rec2DElement *rel) const
return
false
;
}
void
Rec2DVertex
::
rmv
(
Rec2DElement
*
rel
)
void
Rec2DVertex
::
rmv
(
const
Rec2DElement
*
rel
)
{
unsigned
int
i
=
0
;
while
(
i
<
_elements
.
size
())
{
...
...
@@ -2647,6 +2975,7 @@ Rec2DElement::Rec2DElement(MTriangle *t, const Rec2DEdge **re, Rec2DVertex **rv)
_elements
[
3
]
=
NULL
;
reveal
(
rv
);
if
(
!
edgesInOrder
(
_edges
,
3
))
Msg
::
Error
(
"tri |%d|"
,
getNum
());
}
Rec2DElement
::
Rec2DElement
(
MQuadrangle
*
q
,
const
Rec2DEdge
**
re
,
Rec2DVertex
**
rv
)
...
...
@@ -2658,6 +2987,7 @@ Rec2DElement::Rec2DElement(MQuadrangle *q, const Rec2DEdge **re, Rec2DVertex **r
_elements
[
i
]
=
Rec2DEdge
::
getUniqueElement
(
_edges
[
i
]);
reveal
(
rv
);
if
(
!
edgesInOrder
(
_edges
,
4
))
Msg
::
Error
(
"quad |%d|"
,
getNum
());
}
void
Rec2DElement
::
hide
()
...
...
@@ -2704,6 +3034,93 @@ void Rec2DElement::reveal(Rec2DVertex **rv)
Rec2DData
::
add
(
this
);
}
bool
Rec2DElement
::
checkCoherence
()
const
{
Rec2DVertex
*
v
[
4
],
*
v0
,
*
v1
;
v0
=
_edges
[
0
]
->
getVertex
(
0
);
v1
=
_edges
[
0
]
->
getVertex
(
1
);
if
(
_edges
[
1
]
->
getVertex
(
0
)
==
v0
||
_edges
[
1
]
->
getVertex
(
1
)
==
v0
)
{
v
[
0
]
=
v0
;
if
(
_edges
[
1
]
->
getVertex
(
0
)
==
v0
)
v
[
1
]
=
_edges
[
1
]
->
getVertex
(
1
);
else
v
[
1
]
=
_edges
[
1
]
->
getVertex
(
0
);
}
else
if
(
_edges
[
1
]
->
getVertex
(
0
)
==
v1
||
_edges
[
1
]
->
getVertex
(
1
)
==
v1
)
{
v
[
0
]
=
v1
;
if
(
_edges
[
1
]
->
getVertex
(
0
)
==
v1
)
v
[
1
]
=
_edges
[
1
]
->
getVertex
(
1
);
else
v
[
1
]
=
_edges
[
1
]
->
getVertex
(
0
);
}
else
{
Msg
::
Error
(
"not only %d vertex or edge not in order 1 (im %d)"
,
_numEdge
,
getNum
());
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
_edges
[
i
]
->
print
();
}
return
false
;
}
for
(
int
i
=
2
;
i
<
_numEdge
;
++
i
)
{
if
(
_edges
[
i
]
->
getVertex
(
0
)
==
v
[
i
-
1
])
v
[
i
]
=
_edges
[
i
]
->
getVertex
(
1
);
else
if
(
_edges
[
i
]
->
getVertex
(
1
)
==
v
[
i
-
1
])
v
[
i
]
=
_edges
[
i
]
->
getVertex
(
0
);
else
{
Msg
::
Error
(
"not only %d vertex or edge not in order 2 (im %d)"
,
_numEdge
,
getNum
());
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
_edges
[
i
]
->
print
();
}
return
false
;
}
}
if
(
v
[
0
]
==
v1
&&
v
[
_numEdge
-
1
]
!=
v0
||
v
[
0
]
==
v0
&&
v
[
_numEdge
-
1
]
!=
v1
)
{
Msg
::
Error
(
"not only %d vertex or edge not in order 3 (im %d)"
,
_numEdge
,
getNum
());
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
_edges
[
i
]
->
print
();
}
return
false
;
}
for
(
int
i
=
1
;
i
<
_numEdge
;
++
i
)
{
for
(
int
j
=
0
;
j
<
i
;
++
j
)
{
if
(
_edges
[
i
]
==
_edges
[
j
])
return
false
;
if
(
v
[
i
]
==
v
[
j
])
return
false
;
}
}
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
if
(
!
v
[
i
]
->
has
(
this
))
{
Msg
::
Error
(
"vertex don't have me (im %d)"
,
getNum
());
return
false
;
}
if
(
_elements
[
i
]
&&
(
!
_elements
[
i
]
->
has
(
this
)
||
!
_elements
[
i
]
->
has
(
_edges
[
i
])))
{
Msg
::
Error
(
"does %d know me ? %d / does it know edge ? %d (im %d)"
,
_elements
[
i
]
->
getNum
(),
_elements
[
i
]
->
has
(
this
),
_elements
[
i
]
->
has
(
_edges
[
i
]),
getNum
()
);
return
false
;
}
}
return
true
;
}
bool
Rec2DElement
::
has
(
const
Rec2DVertex
*
rv
)
const
{
std
::
vector
<
Rec2DVertex
*>
verts
;
getVertices
(
verts
);
for
(
unsigned
int
i
=
0
;
i
<
verts
.
size
();
++
i
)
if
(
verts
[
i
]
==
rv
)
return
true
;
return
false
;
}
bool
Rec2DElement
::
has
(
const
Rec2DElement
*
rel
)
const
{
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
if
(
_elements
[
i
]
==
rel
)
return
true
;
return
false
;
}
void
Rec2DElement
::
add
(
Rec2DEdge
*
re
)
{
int
i
;
...
...
@@ -2813,6 +3230,31 @@ void Rec2DElement::rmvNeighbour(const Rec2DEdge *re, const Rec2DElement *rel)
Msg
::
Error
(
"[Rec2DElement] Edge not found (rmv) (im %d, edge %d %d)"
,
getNum
(),
a
,
b
);
}
bool
Rec2DElement
::
isNeighbour
(
const
Rec2DEdge
*
re
,
const
Rec2DElement
*
rel
)
const
{
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
if
(
_edges
[
i
]
==
re
)
{
if
(
_elements
[
i
]
==
rel
)
return
true
;
return
false
;
}
}
return
false
;
}
bool
Rec2DElement
::
hasIdenticalNeighbour
()
const
{
for
(
int
i
=
1
;
i
<
_numEdge
;
++
i
)
{
if
(
_elements
[
i
])
{
for
(
int
j
=
0
;
j
<
i
;
++
j
)
{
if
(
_elements
[
i
]
==
_elements
[
j
])
return
true
;
}
}
}
return
false
;
}
void
Rec2DElement
::
swap
(
Rec2DEdge
*
re1
,
Rec2DEdge
*
re2
)
{
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
...
...
@@ -2868,6 +3310,35 @@ void Rec2DElement::swap(Rec2DEdge *re1, Rec2DEdge *re2)
}
}
void
Rec2DElement
::
swapMVertex
(
Rec2DVertex
*
rv0
,
Rec2DVertex
*
rv1
)
{
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
if
(
_mEl
->
getVertex
(
i
)
==
rv0
->
getMVertex
())
{
_mEl
->
setVertex
(
i
,
rv1
->
getMVertex
());
return
;
}
}
std
::
vector
<
Rec2DVertex
*>
v
;
getVertices
(
v
);
if
(
_numEdge
==
3
)
{
Msg
::
Info
(
"im %d, my vert %d %d %d"
,
getNum
(),
v
[
0
]
->
getNum
(),
v
[
1
]
->
getNum
(),
v
[
2
]
->
getNum
());
Msg
::
Info
(
"%d %d = %d %d %d"
,
rv0
->
getNum
(),
rv1
->
getNum
(),
_mEl
->
getVertex
(
0
)
->
getNum
(),
_mEl
->
getVertex
(
1
)
->
getNum
(),
_mEl
->
getVertex
(
2
)
->
getNum
());
}
if
(
_numEdge
==
4
)
{
Msg
::
Info
(
"im %d, my vert %d %d %d %d"
,
getNum
(),
v
[
0
]
->
getNum
(),
v
[
1
]
->
getNum
(),
v
[
2
]
->
getNum
(),
v
[
3
]
->
getNum
());
Msg
::
Info
(
"%d %d = %d %d %d %d"
,
rv0
->
getNum
(),
rv1
->
getNum
(),
_mEl
->
getVertex
(
0
)
->
getNum
(),
_mEl
->
getVertex
(
1
)
->
getNum
(),
_mEl
->
getVertex
(
2
)
->
getNum
(),
_mEl
->
getVertex
(
3
)
->
getNum
());
}
Msg
::
Error
(
"[Rec2DElement] Didn't find your MVertex"
);
crash
();
}
double
Rec2DElement
::
getAngle
(
const
Rec2DVertex
*
rv
)
const
{
std
::
vector
<
Rec2DVertex
*>
vert
;
...
...
@@ -2882,6 +3353,19 @@ double Rec2DElement::getAngle(const Rec2DVertex *rv) const
}
if
(
index
==
-
1
)
{
Msg
::
Error
(
"[Rec2DElement] I don't have your vertex..."
);
Msg
::
Info
(
"im %d, this is %d"
,
getNum
(),
rv
->
getNum
());
for
(
int
i
=
0
;
i
<
_numEdge
;
++
i
)
{
Rec2DElement
*
elem
[
2
];
Rec2DEdge
::
getElements
(
_edges
[
i
],
elem
);
int
a
,
b
=
a
=
NULL
;
if
(
elem
[
0
])
a
=
elem
[
0
]
->
getNum
();
if
(
elem
[
1
])
b
=
elem
[
1
]
->
getNum
();
Msg
::
Info
(
"edge %d %d - %d %d"
,
_edges
[
i
]
->
getVertex
(
0
)
->
getNum
(),
_edges
[
i
]
->
getVertex
(
1
)
->
getNum
(),
a
,
b
);
}
crash
();
return
-
1.
;
}
...
...
@@ -2916,13 +3400,13 @@ void Rec2DElement::getVertices(std::vector<Rec2DVertex*> &verts) const
b
=
false
;
}
if
(
b
)
{
++
k
;
// make sure they are well ordered (edges are ordered)
if
(
k
==
2
&&
_edges
[
i
/
2
]
->
getVertex
((
i
+
1
)
%
2
)
==
verts
[
0
])
{
Rec2DVertex
*
rv
=
verts
[
0
];
verts
[
0
]
=
verts
[
1
];
verts
[
1
]
=
rv
;
}
++
k
;
}
++
i
;
}
...
...
@@ -2950,9 +3434,18 @@ void Rec2DElement::getUniqueActions(std::vector<Rec2DAction*> &vectRA) const
Rec2DEdge
*
Rec2DElement
::
getCommonEdge
(
const
Rec2DElement
*
rel0
,
const
Rec2DElement
*
rel1
)
{
bool
foundOne
=
false
;
for
(
int
i
=
0
;
i
<
rel0
->
_numEdge
;
++
i
)
{
if
(
rel1
->
has
(
rel0
->
_edges
[
i
]))
if
(
rel1
->
has
(
rel0
->
_edges
[
i
]))
{
if
(
!
foundOne
)
{
return
rel0
->
_edges
[
i
];
foundOne
=
true
;
}
else
{
Msg
::
Warning
(
"[Rec2DElement] More than one common edge"
);
return
NULL
;
}
}
}
Msg
::
Error
(
"[Rec2DElement] didn't find edge, returning NULL"
);
return
NULL
;
...
...
@@ -3062,7 +3555,7 @@ bool moreRec2DNode::operator()(Rec2DNode *rn1, Rec2DNode *rn2) const
Rec2DNode
::
Rec2DNode
(
Rec2DNode
*
father
,
Rec2DAction
*
ra
,
double
&
bestEndGlobQual
,
int
depth
)
:
_father
(
father
),
_ra
(
ra
),
_globalQuality
(
.0
),
_bestEndGlobQual
(
.0
),
_dataChange
(
NULL
)
_createdActions
(
NULL
),
_dataChange
(
NULL
)
{
for
(
int
i
=
0
;
i
<
REC2D_NUM_SON
;
++
i
)
_son
[
i
]
=
NULL
;
...
...
@@ -3072,7 +3565,10 @@ Rec2DNode::Rec2DNode(Rec2DNode *father, Rec2DAction *ra,
if
(
depth
)
_ra
->
getNeighbourElements
(
neighbours
);
_dataChange
=
Rec2DData
::
getNewDataChange
();
_ra
->
apply
(
_dataChange
);
_ra
->
apply
(
_dataChange
,
_createdActions
);
Rec2DData
::
checkEntities
();
Recombine2D
::
drawStateOrigin
();
_ra
->
addPointing
();
}
if
(
father
)
...
...
@@ -3094,12 +3590,13 @@ Rec2DNode::Rec2DNode(Rec2DNode *father, Rec2DAction *ra,
for
(
unsigned
int
i
=
0
;
i
<
actions
.
size
();
++
i
)
{
std
::
vector
<
Rec2DElement
*>
elem
;
actions
[
i
]
->
getElements
(
elem
);
if
(
actions
[
i
]
->
getBase
())
/*
if (actions[i]->getBase())
Msg::Info("collapse[%d](%d, %d) -> %g", i, elem[0]->getNum(), elem[1]->getNum(), actions[i]->getReward());
else
Msg
::
Info
(
"recombine[%d](%d, %d) -> %g"
,
i
,
elem
[
0
]
->
getNum
(),
elem
[
1
]
->
getNum
(),
actions
[
i
]
->
getReward
());
actions
[
i
]
->
printReward
();
Msg::Info("recombine[%d](%d, %d) -> %g", i, elem[0]->getNum(), elem[1]->getNum(), actions[i]->getReward());
*/
//
actions[i]->printReward();
double
bestSonEGQ
;
_son
[
i
]
=
new
Rec2DNode
(
this
,
actions
[
i
],
bestSonEGQ
,
depth
-
1
);
if
(
bestSonEGQ
>
_bestEndGlobQual
)
{
_bestEndGlobQual
=
bestSonEGQ
;
...
...
@@ -3119,6 +3616,8 @@ Rec2DNode::Rec2DNode(Rec2DNode *father, Rec2DAction *ra,
if
(
!
Rec2DData
::
revertDataChange
(
_dataChange
))
{
Msg
::
Error
(
" 1 - don't reverted changes"
);
Msg
::
Error
(
" "
);
}
Recombine2D
::
drawStateOrigin
();
Rec2DData
::
checkEntities
();
_dataChange
=
NULL
;
}
}
...
...
@@ -3127,6 +3626,8 @@ Rec2DNode::~Rec2DNode()
{
for
(
int
i
=
0
;
i
<
REC2D_NUM_SON
;
++
i
)
delete
_son
[
i
];
if
(
_ra
)
_ra
->
rmvPointing
();
}
Rec2DNode
*
Rec2DNode
::
selectBestNode
()
...
...
@@ -3172,7 +3673,9 @@ void Rec2DNode::develop(int depth, double &bestEndGlobQual)
}
if
(
delChanges
)
{
_dataChange
=
Rec2DData
::
getNewDataChange
();
_ra
->
apply
(
_dataChange
);
_ra
->
apply
(
_dataChange
,
_createdActions
);
Rec2DData
::
checkEntities
();
Recombine2D
::
drawStateOrigin
();
}
if
(
_son
[
0
])
{
...
...
@@ -3199,6 +3702,13 @@ void Rec2DNode::develop(int depth, double &bestEndGlobQual)
Msg
::
Error
(
"null %d/%d"
,
i
,
actions
.
size
());
}
double
bestSonEGQ
;
std
::
vector
<
Rec2DElement
*>
elem
;
actions
[
i
]
->
getElements
(
elem
);
/*if (actions[i]->getBase())
Msg::Info("collapse[%d](%d, %d) -> %g", i, elem[0]->getNum(), elem[1]->getNum(), actions[i]->getReward());
else
Msg::Info("recombine[%d](%d, %d) -> %g", i, elem[0]->getNum(), elem[1]->getNum(), actions[i]->getReward());*/
//
_son
[
i
]
=
new
Rec2DNode
(
this
,
actions
[
i
],
bestSonEGQ
,
depth
-
1
);
if
(
bestSonEGQ
>
_bestEndGlobQual
)
{
_bestEndGlobQual
=
bestSonEGQ
;
...
...
@@ -3218,6 +3728,8 @@ void Rec2DNode::develop(int depth, double &bestEndGlobQual)
if
(
!
Rec2DData
::
revertDataChange
(
_dataChange
))
{
Msg
::
Error
(
" 1 - don't reverted changes"
);
Msg
::
Error
(
" "
);
}
Recombine2D
::
drawStateOrigin
();
Rec2DData
::
checkEntities
();
_dataChange
=
NULL
;
}
}
...
...
@@ -3235,7 +3747,9 @@ bool Rec2DNode::makeChanges()
while
(
Cpu
()
-
time
<
REC2D_WAIT_TIME
)
FlGui
::
instance
()
->
check
();
#endif
_ra
->
apply
(
_dataChange
);
_ra
->
apply
(
_dataChange
,
_createdActions
);
Rec2DData
::
checkEntities
();
Recombine2D
::
drawStateOrigin
();
Rec2DData
::
setNumTri
(
_remainingTri
);
return
true
;
}
...
...
@@ -3247,6 +3761,8 @@ bool Rec2DNode::revertChanges()
if
(
!
Rec2DData
::
revertDataChange
(
_dataChange
))
{
Msg
::
Error
(
" 1 - don't reverted changes"
);
Msg
::
Error
(
" "
);
}
Recombine2D
::
drawStateOrigin
();
Rec2DData
::
checkEntities
();
_dataChange
=
NULL
;
return
true
;
}
...
...
@@ -3256,4 +3772,3 @@ bool Rec2DNode::operator<(Rec2DNode &other)
return
_globalQuality
<
other
.
_globalQuality
;
}
This diff is collapsed.
Click to expand it.
Mesh/meshGFaceRecombine.h
+
91
−
13
View file @
45485ad6
...
...
@@ -70,6 +70,7 @@ class Recombine2D {
inline
void
setStrategy
(
int
s
)
{
_strategy
=
s
;}
void
drawState
(
double
shiftx
,
double
shifty
)
const
;
void
printState
()
const
;
static
void
drawStateOrigin
();
static
inline
GFace
*
getGFace
()
{
return
_current
->
_gf
;}
static
inline
int
getNumChange
()
{
return
_current
->
_numChange
;}
...
...
@@ -109,7 +110,7 @@ class Rec2DData {
Rec2DData
();
~
Rec2DData
();
static
void
checkEntities
();
void
printState
()
const
;
void
printActions
()
const
;
...
...
@@ -215,6 +216,7 @@ enum Rec2DChangeType {
SwapVertInAction
,
SwapVertInEdge
,
//10-11
SwapEdgeInAction
,
SwapEdgeInElem
,
//12-13
RemoveElem
,
AddElem
,
Relocate
,
ChangePar
,
SavePar
,
//14-18
SwapMVertInElement
,
Error
,
Reverted
};
...
...
@@ -242,6 +244,9 @@ class Rec2DChange {
Rec2DChange
(
Rec2DVertex
*
,
Rec2DVertex
*
,
const
std
::
vector
<
Rec2DAction
*>&
,
Rec2DChangeType
);
// swap vertex1 to vertex2 (action)
Rec2DChange
(
Rec2DVertex
*
,
Rec2DVertex
*
,
const
std
::
vector
<
Rec2DElement
*>&
,
Rec2DChangeType
);
// swap mvertex1 to mvertex2 (element)
Rec2DChange
(
Rec2DEdge
*
,
Rec2DEdge
*
,
Rec2DChangeType
);
// swap edge1 to edge2 (element)
Rec2DChange
(
Rec2DEdge
*
,
Rec2DEdge
*
,
const
std
::
vector
<
Rec2DAction
*>&
,
...
...
@@ -290,19 +295,20 @@ class Rec2DDataChange {
class
Rec2DAction
{
protected
:
double
_globQualIfExecuted
;
int
_lastUpdate
;
int
_lastUpdate
,
_numPointing
;
public
:
Rec2DAction
();
virtual
~
Rec2DAction
()
{}
virtual
void
hide
()
=
0
;
virtual
void
reveal
()
=
0
;
virtual
bool
checkCoherence
()
const
=
0
;
bool
operator
<
(
Rec2DAction
&
);
double
getReward
();
virtual
void
color
(
int
,
int
,
int
)
const
=
0
;
virtual
void
apply
(
std
::
vector
<
Rec2DVertex
*>
&
newPar
)
=
0
;
virtual
void
apply
(
Rec2DDataChange
*
)
const
=
0
;
virtual
void
apply
(
Rec2DDataChange
*
,
std
::
vector
<
Rec2DAction
*>*&
)
const
=
0
;
virtual
bool
isObsolete
()
const
=
0
;
virtual
Rec2DVertex
*
getVertex
(
int
)
const
=
0
;
virtual
int
getNumElement
()
=
0
;
...
...
@@ -319,6 +325,10 @@ class Rec2DAction {
virtual
void
swap
(
Rec2DEdge
*
,
Rec2DEdge
*
)
=
0
;
virtual
void
printAdress
()
=
0
;
virtual
void
printReward
()
const
=
0
;
inline
void
addPointing
()
{
++
_numPointing
;}
inline
void
rmvPointing
()
{
--
_numPointing
;}
inline
bool
getPointing
()
{
return
_numPointing
;}
virtual
void
printIdentity
()
const
=
0
;
private
:
virtual
void
_computeGlobQual
()
=
0
;
...
...
@@ -338,10 +348,11 @@ class Rec2DTwoTri2Quad : public Rec2DAction {
~
Rec2DTwoTri2Quad
()
{
if
(
_col
)
Msg
::
Error
(
"[Rec2DTwoTri2Quad] have collapse"
);
hide
();}
virtual
void
hide
();
virtual
void
reveal
();
virtual
bool
checkCoherence
()
const
;
virtual
void
color
(
int
,
int
,
int
)
const
;
virtual
void
apply
(
std
::
vector
<
Rec2DVertex
*>
&
newPar
);
virtual
void
apply
(
Rec2DDataChange
*
)
const
;
virtual
void
apply
(
Rec2DDataChange
*
,
std
::
vector
<
Rec2DAction
*>*&
)
const
;
virtual
bool
isObsolete
()
const
;
...
...
@@ -359,6 +370,7 @@ class Rec2DTwoTri2Quad : public Rec2DAction {
virtual
void
swap
(
Rec2DEdge
*
,
Rec2DEdge
*
);
virtual
void
printAdress
()
{
Msg
::
Info
(
" %d"
,
this
);}
virtual
void
printReward
()
const
;
virtual
void
printIdentity
()
const
;
private
:
virtual
void
_computeGlobQual
();
...
...
@@ -377,12 +389,13 @@ class Rec2DCollapse : public Rec2DAction {
~
Rec2DCollapse
()
{
_rec
->
_col
=
NULL
;
hide
();}
virtual
void
hide
();
virtual
void
reveal
();
virtual
bool
checkCoherence
()
const
{
return
_rec
->
checkCoherence
();}
virtual
void
color
(
int
c1
,
int
c2
,
int
c3
)
const
{
_rec
->
color
(
c1
,
c2
,
c3
);
}
virtual
void
apply
(
std
::
vector
<
Rec2DVertex
*>
&
newPar
);
virtual
void
apply
(
Rec2DDataChange
*
)
const
;
virtual
void
apply
(
Rec2DDataChange
*
,
std
::
vector
<
Rec2DAction
*>*&
)
const
;
virtual
bool
isObsolete
()
const
;
virtual
bool
whatWouldYouDo
(
std
::
map
<
Rec2DVertex
*
,
std
::
vector
<
int
>
>&
);
...
...
@@ -411,9 +424,11 @@ class Rec2DCollapse : public Rec2DAction {
inline
virtual
void
swap
(
Rec2DEdge
*
re0
,
Rec2DEdge
*
re1
)
{
_rec
->
swap
(
re0
,
re1
);}
virtual
void
printAdress
()
{
_rec
->
printAdress
();}
virtual
void
printReward
()
const
;
virtual
void
printIdentity
()
const
;
private
:
virtual
void
_computeGlobQual
();
bool
_hasIdenticalElement
()
const
;
};
class
Rec2DEdge
{
...
...
@@ -428,6 +443,8 @@ class Rec2DEdge {
~
Rec2DEdge
()
{
hide
();}
void
hide
();
void
reveal
();
bool
checkCoherence
()
const
;
inline
bool
has
(
const
Rec2DVertex
*
v
)
const
{
return
v
==
_rv0
||
v
==
_rv1
;}
//double getQualL() const;
//double getQualO() const;
...
...
@@ -486,6 +503,7 @@ class Rec2DVertex {
~
Rec2DVertex
()
{
hide
();}
void
hide
();
void
reveal
();
bool
checkCoherence
()
const
;
inline
int
getNum
()
const
{
return
_v
->
getNum
();}
inline
double
getAngle
()
const
{
return
_angle
;}
...
...
@@ -506,6 +524,7 @@ class Rec2DVertex {
inline
int
getNumElements
()
const
{
return
_elements
.
size
();}
inline
void
getEdges
(
std
::
vector
<
Rec2DEdge
*>
&
v
)
const
{
v
=
_edges
;}
void
getUniqueEdges
(
std
::
vector
<
Rec2DEdge
*>&
)
const
;
void
getMoreNeighbourVertices
(
std
::
vector
<
Rec2DVertex
*>&
)
const
;
void
getTriangles
(
std
::
set
<
Rec2DElement
*>&
)
const
;
void
getElements
(
std
::
vector
<
Rec2DElement
*>&
)
const
;
inline
MVertex
*
getMVertex
()
const
{
return
_v
;}
...
...
@@ -521,13 +540,13 @@ class Rec2DVertex {
void
relocate
(
SPoint2
p
);
inline
void
getParam
(
SPoint2
*
p
)
{
*
p
=
_param
;}
void
add
(
Rec2DEdge
*
);
bool
has
(
Rec2DEdge
*
)
const
;
void
rmv
(
Rec2DEdge
*
);
void
add
(
const
Rec2DEdge
*
);
bool
has
(
const
Rec2DEdge
*
)
const
;
void
rmv
(
const
Rec2DEdge
*
);
void
add
(
Rec2DElement
*
);
bool
has
(
Rec2DElement
*
)
const
;
void
rmv
(
Rec2DElement
*
);
void
add
(
const
Rec2DElement
*
);
bool
has
(
const
Rec2DElement
*
)
const
;
void
rmv
(
const
Rec2DElement
*
);
void
getUniqueActions
(
std
::
vector
<
Rec2DAction
*>&
)
const
;
...
...
@@ -559,6 +578,9 @@ class Rec2DElement {
~
Rec2DElement
()
{
hide
();}
void
hide
();
void
reveal
(
Rec2DVertex
**
rv
=
NULL
);
bool
checkCoherence
()
const
;
bool
has
(
const
Rec2DVertex
*
)
const
;
bool
has
(
const
Rec2DElement
*
)
const
;
bool
inline
isTri
()
const
{
return
_numEdge
==
3
;}
bool
inline
isQuad
()
const
{
return
_numEdge
==
4
;}
...
...
@@ -569,8 +591,10 @@ class Rec2DElement {
void
remove
(
const
Rec2DAction
*
);
void
addNeighbour
(
const
Rec2DEdge
*
,
const
Rec2DElement
*
);
void
rmvNeighbour
(
const
Rec2DEdge
*
,
const
Rec2DElement
*
);
bool
isNeighbour
(
const
Rec2DEdge
*
,
const
Rec2DElement
*
)
const
;
void
swap
(
Rec2DEdge
*
,
Rec2DEdge
*
);
void
swapMVertex
(
Rec2DVertex
*
,
Rec2DVertex
*
);
inline
MElement
*
getMElement
()
const
{
return
_mEl
;}
#ifdef REC2D_DRAW
...
...
@@ -606,6 +630,7 @@ class Rec2DElement {
Rec2DVertex
*
getOtherVertex
(
const
Rec2DVertex
*
,
const
Rec2DVertex
*
)
const
;
static
Rec2DEdge
*
getCommonEdge
(
const
Rec2DElement
*
,
const
Rec2DElement
*
);
static
void
getElements
(
const
Rec2DEdge
*
,
Rec2DElement
**
);
bool
hasIdenticalNeighbour
()
const
;
inline
int
getNum
()
const
{
return
_mEl
->
getNum
();}
...
...
@@ -620,6 +645,7 @@ class Rec2DNode {
Rec2DAction
*
_ra
;
double
_globalQuality
,
_bestEndGlobQual
;
int
_remainingTri
;
std
::
vector
<
Rec2DAction
*>
*
_createdActions
;
Rec2DDataChange
*
_dataChange
;
...
...
@@ -643,5 +669,57 @@ class Rec2DNode {
inline
int
getNumTri
()
const
{
return
_remainingTri
;}
};
#endif
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment