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
491c2c84
Commit
491c2c84
authored
13 years ago
by
Emilie Marchandise
Browse files
Options
Downloads
Patches
Plain Diff
splitMesh OK for centerlines (next step is classification of compounds)
parent
47411592
No related branches found
No related tags found
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
Mesh/CenterlineField.cpp
+384
-129
384 additions, 129 deletions
Mesh/CenterlineField.cpp
Mesh/CenterlineField.h
+6
-2
6 additions, 2 deletions
Mesh/CenterlineField.h
contrib/DiscreteIntegration/Integration3D.h
+4
-4
4 additions, 4 deletions
contrib/DiscreteIntegration/Integration3D.h
with
394 additions
and
135 deletions
Mesh/CenterlineField.cpp
+
384
−
129
View file @
491c2c84
...
...
@@ -19,12 +19,12 @@
#include
"OS.h"
#include
"GModel.h"
#include
"MElement.h"
#include
"MTriangle.h"
#include
"MVertex.h"
#include
"MLine.h"
#include
"GEntity.h"
#include
"Field.h"
#include
"GFace.h"
#include
"Integration3D.h"
#if defined(HAVE_ANN)
#include
<ANN/ANN.h>
...
...
@@ -44,7 +44,48 @@ double computeLength(std::vector<MLine*> lines){
return
length
;
}
void
orderMLines
(
std
::
vector
<
MLine
*>
&
lines
)
{
//, std::set<MVertex*> & junctions, MVertex *vB, MVertex *vE){
bool
isClosed
(
std
::
set
<
MEdge
,
Less_Edge
>
&
theCut
){
std
::
multiset
<
MVertex
*>
boundV
;
std
::
set
<
MEdge
,
Less_Edge
>::
iterator
it
=
theCut
.
begin
();
for
(;
it
!=
theCut
.
end
();
it
++
){
boundV
.
insert
(
it
->
getVertex
(
0
));
boundV
.
insert
(
it
->
getVertex
(
1
));
}
std
::
multiset
<
MVertex
*>::
iterator
itb
=
boundV
.
begin
();
for
(
;
itb
!=
boundV
.
end
();
++
itb
){
if
(
boundV
.
count
(
*
itb
)
!=
2
)
{
return
false
;
}
}
return
true
;
// std::list<MEdge> segments;
// std::map<MVertex*, MEdge> boundv;
// std::set<MEdge,Less_Edge>::iterator it = theCut.begin();
// for (; it!= theCut.end(); it++){
// segments.push_back(*it);
// }
// // find a lonely MEdge
// for (std::list<MEdge>::iterator it = segments.begin();
// it != segments.end(); ++it){
// MVertex *vL = it->getVertex(0);
// MVertex *vR = it->getVertex(1);
// std::map<MVertex*,MEdge>::iterator it1 = boundv.find(vL);
// if (it1 == boundv.end()) boundv.insert(std::make_pair(vL,*it));
// else boundv.erase(it1);
// std::map<MVertex*,MEdge>::iterator it2 = boundv.find(vR);
// if (it2 == boundv.end()) boundv.insert(std::make_pair(vR,*it));
// else boundv.erase(it2);
// }
// if (boundv.size() == 0) return true;
// else return false;
}
void
orderMLines
(
std
::
vector
<
MLine
*>
&
lines
,
MVertex
*
vB
,
MVertex
*
vE
){
std
::
vector
<
MLine
*>
_m
;
std
::
list
<
MLine
*>
segments
;
...
...
@@ -72,7 +113,13 @@ void orderMLines(std::vector<MLine*> &lines) { //, std::set<MVertex*> & junction
// find the first MLine and erase it from the list segments
MLine
*
firstLine
;
if
(
boundv
.
size
()
==
2
){
// non periodic
firstLine
=
(
boundv
.
begin
())
->
second
;
MVertex
*
v
=
(
boundv
.
begin
())
->
first
;
if
(
v
==
vB
)
firstLine
=
(
boundv
.
begin
())
->
second
;
else
{
MVertex
*
v
=
(
boundv
.
rbegin
())
->
first
;
if
(
v
==
vB
)
firstLine
=
(
boundv
.
rbegin
())
->
second
;
else
{
Msg
::
Error
(
"begin vertex not found for branch"
);
exit
(
1
);}
}
for
(
std
::
list
<
MLine
*>::
iterator
it
=
segments
.
begin
();
it
!=
segments
.
end
();
++
it
){
if
(
*
it
==
firstLine
){
...
...
@@ -81,13 +128,8 @@ void orderMLines(std::vector<MLine*> &lines) { //, std::set<MVertex*> & junction
}
}
}
else
if
(
boundv
.
size
()
==
0
){
// periodic
firstLine
=
*
(
segments
.
begin
());
segments
.
erase
(
segments
.
begin
());
}
else
{
Msg
::
Error
(
"line is wrong (it has %d end points)"
,
boundv
.
size
());
Msg
::
Error
(
"line is wrong (it has %d end points)"
,
boundv
.
size
());
}
// loop over all segments to order segments and store it in the list _m
...
...
@@ -152,6 +194,92 @@ void orderMLines(std::vector<MLine*> &lines) { //, std::set<MVertex*> & junction
// printf("in order vB= %d =%d \n", vB->getNum(), vE->getNum());
}
void
cutTriangle
(
MTriangle
*
tri
,
std
::
map
<
MEdge
,
MVertex
*
,
Less_Edge
>
&
cutEdges
,
std
::
set
<
MVertex
*>
&
cutVertices
,
std
::
vector
<
MTriangle
*>
&
newTris
,
std
::
set
<
MEdge
,
Less_Edge
>
&
newCut
){
MVertex
*
c
[
3
]
=
{
0
,
0
,
0
};
for
(
int
j
=
0
;
j
<
3
;
j
++
){
MEdge
ed
=
tri
->
getEdge
(
j
);
std
::
map
<
MEdge
,
MVertex
*
,
Less_Edge
>
::
iterator
it
=
cutEdges
.
find
(
ed
);
if
(
it
!=
cutEdges
.
end
()){
c
[
j
]
=
it
->
second
;
}
}
if
(
c
[
0
]
&&
c
[
1
]){
newTris
.
push_back
(
new
MTriangle
(
c
[
0
],
tri
->
getVertex
(
1
),
c
[
1
]));
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
0
),
c
[
0
],
tri
->
getVertex
(
2
)));
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
2
),
c
[
0
],
c
[
1
]));
newCut
.
insert
(
MEdge
(
c
[
0
],
c
[
1
]));
}
else
if
(
c
[
0
]
&&
c
[
2
]){
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
0
),
c
[
0
],
c
[
2
]));
newTris
.
push_back
(
new
MTriangle
(
c
[
0
],
tri
->
getVertex
(
1
),
tri
->
getVertex
(
2
)));
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
2
),
c
[
2
],
c
[
0
]));
newCut
.
insert
(
MEdge
(
c
[
0
],
c
[
2
]));
}
else
if
(
c
[
1
]
&&
c
[
2
]){
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
2
),
c
[
2
],
c
[
1
]));
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
0
),
tri
->
getVertex
(
1
),
c
[
2
]));
newTris
.
push_back
(
new
MTriangle
(
c
[
2
],
tri
->
getVertex
(
1
),
c
[
1
]));
newCut
.
insert
(
MEdge
(
c
[
1
],
c
[
2
]));
}
else
if
(
c
[
0
]){
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
0
),
c
[
0
],
tri
->
getVertex
(
2
)));
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
2
),
c
[
0
],
tri
->
getVertex
(
1
)));
if
(
cutVertices
.
find
(
tri
->
getVertex
(
0
))
!=
cutVertices
.
end
()){
newCut
.
insert
(
MEdge
(
c
[
0
],
tri
->
getVertex
(
0
)));
}
else
if
(
cutVertices
.
find
(
tri
->
getVertex
(
1
))
!=
cutVertices
.
end
())
{
newCut
.
insert
(
MEdge
(
c
[
0
],
tri
->
getVertex
(
1
)));
}
else
{
newCut
.
insert
(
MEdge
(
c
[
0
],
tri
->
getVertex
(
2
)));
}
}
else
if
(
c
[
1
]){
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
1
),
c
[
1
],
tri
->
getVertex
(
0
)));
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
0
),
c
[
1
],
tri
->
getVertex
(
2
)));
if
(
cutVertices
.
find
(
tri
->
getVertex
(
0
))
!=
cutVertices
.
end
()){
newCut
.
insert
(
MEdge
(
c
[
1
],
tri
->
getVertex
(
0
)));
}
else
if
(
cutVertices
.
find
(
tri
->
getVertex
(
1
))
!=
cutVertices
.
end
())
{
newCut
.
insert
(
MEdge
(
c
[
1
],
tri
->
getVertex
(
1
)));
}
else
{
newCut
.
insert
(
MEdge
(
c
[
1
],
tri
->
getVertex
(
2
)));
}
}
else
if
(
c
[
2
]){
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
0
),
tri
->
getVertex
(
1
),
c
[
2
]));
newTris
.
push_back
(
new
MTriangle
(
tri
->
getVertex
(
1
),
tri
->
getVertex
(
2
),
c
[
2
]));
if
(
cutVertices
.
find
(
tri
->
getVertex
(
0
))
!=
cutVertices
.
end
()){
newCut
.
insert
(
MEdge
(
c
[
2
],
tri
->
getVertex
(
0
)));
}
else
if
(
cutVertices
.
find
(
tri
->
getVertex
(
1
))
!=
cutVertices
.
end
())
{
newCut
.
insert
(
MEdge
(
c
[
2
],
tri
->
getVertex
(
1
)));
}
else
{
newCut
.
insert
(
MEdge
(
c
[
2
],
tri
->
getVertex
(
2
)));
}
}
else
{
newTris
.
push_back
(
tri
);
if
(
cutVertices
.
find
(
tri
->
getVertex
(
0
))
!=
cutVertices
.
end
()
&&
cutVertices
.
find
(
tri
->
getVertex
(
1
))
!=
cutVertices
.
end
())
newCut
.
insert
(
MEdge
(
tri
->
getVertex
(
0
),
tri
->
getVertex
(
1
)));
if
(
cutVertices
.
find
(
tri
->
getVertex
(
0
))
!=
cutVertices
.
end
()
&&
cutVertices
.
find
(
tri
->
getVertex
(
1
))
!=
cutVertices
.
end
())
newCut
.
insert
(
MEdge
(
tri
->
getVertex
(
0
),
tri
->
getVertex
(
2
)));
if
(
cutVertices
.
find
(
tri
->
getVertex
(
2
))
!=
cutVertices
.
end
()
&&
cutVertices
.
find
(
tri
->
getVertex
(
1
))
!=
cutVertices
.
end
())
newCut
.
insert
(
MEdge
(
tri
->
getVertex
(
2
),
tri
->
getVertex
(
1
)));
}
}
Centerline
::
Centerline
(
std
::
string
fileName
)
:
kdtree
(
0
),
nodes
(
0
){
index
=
new
ANNidx
[
1
];
...
...
@@ -186,7 +314,17 @@ void Centerline::importFile(std::string fileName){
std
::
vector
<
GEntity
*>
entities
;
current
->
getEntities
(
entities
)
;
for
(
unsigned
int
i
=
0
;
i
<
entities
.
size
();
i
++
){
if
(
entities
[
i
]
->
dim
()
==
2
)
surfaces
.
push_back
((
GFace
*
)
entities
[
i
]);
if
(
entities
[
i
]
->
dim
()
!=
2
)
continue
;
for
(
int
j
=
0
;
j
<
entities
[
i
]
->
getNumMeshElements
();
j
++
){
MElement
*
e
=
entities
[
i
]
->
getMeshElement
(
j
);
if
(
e
->
getType
()
!=
TYPE_TRI
){
Msg
::
Error
(
"Centerline split only implemented for tri meshes so far ..."
);
exit
(
1
);
}
else
{
triangles
.
push_back
((
MTriangle
*
)
e
);
}
}
}
entities
.
clear
();
...
...
@@ -300,7 +438,7 @@ void Centerline::createBranches(int maxN){
else
itl
++
;
}
if
(
vB
==
vE
)
{
Msg
::
Error
(
"Begin and end points branch are the same
\n
"
);
break
;}
orderMLines
(
myLines
);
orderMLines
(
myLines
,
vB
,
vE
);
std
::
vector
<
Branch
>
children
;
Branch
newBranch
=
{
tag
++
,
myLines
,
computeLength
(
myLines
),
vB
,
vE
,
children
,
1.e6
,
0.0
};
//printf("branch = %d VB = %d VE %d \n", myLines.size(), vB->getNum(), vE->getNum());
...
...
@@ -342,48 +480,83 @@ void Centerline::createBranches(int maxN){
void
Centerline
::
distanceToLines
(){
Msg
::
Info
(
"Centerline: computing distance to lines "
);
//EMI TO DO DO THIS WITH ANN !
//MUCH FASTER
//SOLUTION 1: REVERSE ANN TREE (SURFACE POINTS IN TREE)
ANNkd_tree
*
kdtreeR
;
ANNpointArray
nodesR
;
ANNidxArray
indexR
=
new
ANNidx
[
1
];
ANNdistArray
distR
=
new
ANNdist
[
1
];
std
::
vector
<
SPoint3
>
pts
;
std
::
set
<
SPoint3
>
pts_set
;
std
::
vector
<
double
>
distances
;
std
::
vector
<
double
>
distancesE
;
std
::
vector
<
SPoint3
>
closePts
;
std
::
set
<
MVertex
*>
allVS
;
for
(
int
j
=
0
;
j
<
triangles
.
size
();
j
++
)
for
(
int
k
=
0
;
k
<
3
;
k
++
)
allVS
.
insert
(
triangles
[
j
]
->
getVertex
(
k
));
for
(
unsigned
int
i
=
0
;
i
<
surfaces
.
size
();
i
++
){
for
(
int
j
=
0
;
j
<
surfaces
[
i
]
->
getNumMeshElements
();
j
++
){
MElement
*
e
=
surfaces
[
i
]
->
getMeshElement
(
j
);
for
(
int
k
=
0
;
k
<
e
->
getNumVertices
();
k
++
){
MVertex
*
v
=
e
->
getVertex
(
k
);
pts_set
.
insert
(
SPoint3
(
v
->
x
(),
v
->
y
(),
v
->
z
()));
}
}
}
std
::
set
<
SPoint3
>::
iterator
its
=
pts_set
.
begin
();
for
(;
its
!=
pts_set
.
end
();
its
++
){
pts
.
push_back
(
*
its
);
int
nbSNodes
=
allVS
.
size
();
nodesR
=
annAllocPts
(
nbSNodes
,
3
);
int
ind
=
0
;
std
::
set
<
MVertex
*>::
iterator
itp
=
allVS
.
begin
();
while
(
itp
!=
allVS
.
end
()){
MVertex
*
v
=
*
itp
;
nodesR
[
ind
][
0
]
=
v
->
x
();
nodesR
[
ind
][
1
]
=
v
->
y
();
nodesR
[
ind
][
2
]
=
v
->
z
();
itp
++
;
ind
++
;
}
if
(
pts
.
size
()
==
0
)
{
Msg
::
Error
(
"Centerline needs a GModel with a surface
\n
"
);
exit
(
1
);
}
kdtreeR
=
new
ANNkd_tree
(
nodesR
,
nbSNodes
,
3
);
for
(
unsigned
int
i
=
0
;
i
<
lines
.
size
();
i
++
){
std
::
vector
<
double
>
iDistances
;
std
::
vector
<
SPoint3
>
iClosePts
;
std
::
vector
<
double
>
iDistancesE
;
MLine
*
l
=
lines
[
i
];
MVertex
*
v1
=
l
->
getVertex
(
0
);
MVertex
*
v2
=
l
->
getVertex
(
1
);
SPoint3
p1
(
v1
->
x
(),
v1
->
y
(),
v1
->
z
());
SPoint3
p2
(
v2
->
x
(),
v2
->
y
(),
v2
->
z
());
signedDistancesPointsLine
(
iDistances
,
iClosePts
,
pts
,
p1
,
p2
);
double
minRad
=
std
::
abs
(
iDistances
[
0
]);
for
(
unsigned
int
kk
=
1
;
kk
<
pts
.
size
();
kk
++
)
{
if
(
std
::
abs
(
iDistances
[
kk
])
<
minRad
)
minRad
=
std
::
abs
(
iDistances
[
kk
]);
}
double
midp
[
3
]
=
{
0.5
*
(
v1
->
x
()
+
v2
->
x
()),
0.5
*
(
v1
->
y
()
+
v1
->
y
()),
0.5
*
(
v1
->
z
()
+
v2
->
z
())};
kdtreeR
->
annkSearch
(
midp
,
1
,
indexR
,
distR
);
double
minRad
=
sqrt
(
distR
[
0
]);
radiusl
.
insert
(
std
::
make_pair
(
lines
[
i
],
minRad
));
}
delete
kdtreeR
;
annDeallocPts
(
nodesR
);
delete
[]
indexR
;
delete
[]
distR
;
// //SOLUTION 2: DISTANCE TO LINES (QUITE SLOW)
// std::vector<SPoint3> pts;
// std::set<SPoint3> pts_set;
// std::vector<double> distances;
// std::vector<double> distancesE;
// std::vector<SPoint3> closePts;
// for(unsigned int i = 0; i < surfaces.size(); i++){
// for(int j = 0; j < surfaces[i]->getNumMeshElements(); j++){
// MElement *e = surfaces[i]->getMeshElement(j);
// for (int k = 0; k < e->getNumVertices(); k++){
// MVertex *v = e->getVertex(k);
// pts_set.insert(SPoint3(v->x(), v->y(),v->z()));
// }
// }
// }
// std::set<SPoint3>::iterator its = pts_set.begin();
// for (; its != pts_set.end(); its++){
// pts.push_back(*its);
// }
// if (pts.size() == 0) {Msg::Error("Centerline needs a GModel with a surface \n"); exit(1);}
// for(unsigned int i = 0; i < lines.size(); i++){
// std::vector<double> iDistances;
// std::vector<SPoint3> iClosePts;
// std::vector<double> iDistancesE;
// MLine *l = lines[i];
// MVertex *v1 = l->getVertex(0);
// MVertex *v2 = l->getVertex(1);
// SPoint3 p1(v1->x(), v1->y(), v1->z());
// SPoint3 p2(v2->x(), v2->y(), v2->z());
// signedDistancesPointsLine(iDistances, iClosePts, pts, p1,p2);
// double minRad = std::abs(iDistances[0]);
// for (unsigned int kk = 1; kk< pts.size(); kk++) {
// if (std::abs(iDistances[kk]) < minRad)
// minRad = std::abs(iDistances[kk]);
// }
// radiusl.insert(std::make_pair(lines[i], minRad));
// }
}
void
Centerline
::
computeRadii
(){
...
...
@@ -448,96 +621,178 @@ void Centerline::buildKdTree(){
void
Centerline
::
splitMesh
(){
Msg
::
Info
(
"Splitting surface mesh with centerline field "
);
Msg
::
Info
(
"Splitting surface mesh
(%d tris)
with centerline field "
,
triangles
.
size
()
);
for
(
unsigned
int
i
=
0
;
i
<
edges
.
size
();
++
i
){
for
(
unsigned
int
i
=
0
;
i
<
edges
.
size
();
i
++
){
printf
(
"*** branch =%d
\n
"
,
i
);
std
::
vector
<
MLine
*>
lines
=
edges
[
i
].
lines
;
MVertex
*
v1
=
edges
[
i
].
vE
;
double
L
=
edges
[
i
].
length
;
double
R
=
edges
[
i
].
maxRad
;
if
(
edges
[
i
].
children
.
size
()
>
0.0
&&
L
/
R
>
1.5
){
MVertex
*
v1
=
lines
[
lines
.
size
()
-
1
]
->
getVertex
(
1
);
//end vertex
MVertex
*
v2
;
SPoint3
pt
(
v1
->
x
(),
v1
->
y
(),
v1
->
z
());
if
(
lines
[
0
]
->
getVertex
(
0
)
==
v1
)
v2
=
lines
[
0
]
->
getVertex
(
1
);
else
if
(
lines
[
0
]
->
getVertex
(
1
)
==
v1
)
v2
=
lines
[
0
]
->
getVertex
(
0
);
else
if
(
lines
.
back
()
->
getVertex
(
0
)
==
v1
)
v2
=
lines
.
back
()
->
getVertex
(
1
);
else
if
(
lines
.
back
()
->
getVertex
(
1
)
==
v1
)
v2
=
lines
.
back
()
->
getVertex
(
0
);
if
(
L
/
R
<
2.0
)
v2
=
lines
[
0
]
->
getVertex
(
0
);
else
if
(
lines
.
size
()
>
4
)
v2
=
lines
[
lines
.
size
()
-
4
]
->
getVertex
(
0
);
else
v2
=
lines
[
lines
.
size
()
-
1
]
->
getVertex
(
0
);
SVector3
pt
(
v1
->
x
(),
v1
->
y
(),
v1
->
z
());
SVector3
dir
(
v2
->
x
()
-
v1
->
x
(),
v2
->
y
()
-
v1
->
y
(),
v2
->
z
()
-
v1
->
z
());
if
(
edges
[
i
].
children
.
size
()
>
0.0
){
cutByDisk
(
pt
,
dir
,
1.2
*
edges
[
i
].
maxRad
);
}
}
}
void
Centerline
::
cutByDisk
(
SPoint3
pt
,
SVector3
norm
,
double
rad
){
printf
(
"Cutting disk centered at pt %g %g %g dir %g %g %g
\n
"
,
pt
.
x
(),
pt
.
y
(),
pt
.
z
(),
norm
.
x
(),
norm
.
y
(),
norm
.
z
());
double
a
=
norm
.
x
();
double
b
=
norm
.
y
();
double
c
=
norm
.
z
();
double
d
=
-
a
*
pt
[
0
]
-
b
*
pt
[
1
]
-
c
*
pt
[
2
];
printf
(
"Plane = %g %g %g %g
\n
"
,
a
,
b
,
c
,
d
);
//ls = a * x + b * y + c * z + d;
//variables for using the cutting tools
std
::
vector
<
DI_Line
*>
lines
;
std
::
vector
<
DI_Triangle
*>
triangles
;
std
::
vector
<
DI_Quad
*>
quads
;
DI_Point
::
Container
cp
;
//cut points
std
::
vector
<
DI_IntegrationPoint
*>
ipV
;
//integration points vol
std
::
vector
<
DI_IntegrationPoint
*>
ipS
;
//integration points surf
bool
isCut
=
false
;
int
integOrder
=
1
;
int
recur
=
0
;
gLevelset
*
GLS
=
new
gLevelsetPlane
(
0.
,
0.
,
0.
,
0.
);
std
::
vector
<
gLevelset
*>
RPN
;
RPN
.
push_back
(
GLS
);
//loop over all surface mesh elements
for
(
unsigned
int
i
=
0
;
i
<
surfaces
.
size
();
i
++
){
for
(
int
j
=
0
;
j
<
surfaces
[
i
]
->
getNumMeshElements
();
j
++
){
MElement
*
e
=
surfaces
[
i
]
->
getMeshElement
(
j
);
if
(
e
->
getNumVertices
()
!=
3
){
Msg
::
Error
(
"Centerline split only implemented for tri meshes so far ..."
);
exit
(
1
);
cutByDisk
(
pt
,
dir
,
edges
[
i
].
maxRad
);
}
}
FILE
*
f2
=
fopen
(
"myCUT.pos"
,
"w"
);
fprintf
(
f2
,
"View
\"\"
{
\n
"
);
std
::
set
<
MEdge
,
Less_Edge
>::
iterator
itp
=
theCut
.
begin
();
while
(
itp
!=
theCut
.
end
()){
MEdge
l
=
*
itp
;
fprintf
(
f2
,
"SL(%g,%g,%g,%g,%g,%g){%g,%g};
\n
"
,
l
.
getVertex
(
0
)
->
x
(),
l
.
getVertex
(
0
)
->
y
(),
l
.
getVertex
(
0
)
->
z
(),
l
.
getVertex
(
1
)
->
x
(),
l
.
getVertex
(
1
)
->
y
(),
l
.
getVertex
(
1
)
->
z
(),
1.0
,
1.0
);
itp
++
;
}
// for (int i= 0; i< triangles.size(); i++){
// MTriangle *t = triangles[i];
// fprintf(f2, "ST(%g,%g,%g,%g,%g,%g,%g,%g,%g){%g,%g,%g};\n",
// t->getVertex(0)->x(), t->getVertex(0)->y(), t->getVertex(0)->z(),
// t->getVertex(1)->x(), t->getVertex(1)->y(), t->getVertex(1)->z(),
// t->getVertex(2)->x(), t->getVertex(2)->y(), t->getVertex(2)->z(),
// 1.0,1.0,1.0);
// }
fprintf
(
f2
,
"};
\n
"
);
fclose
(
f2
);
Msg
::
Info
(
"Splitting mesh by centerlines done "
);
}
void
Centerline
::
cutByDisk
(
SVector3
&
PT
,
SVector3
&
NORM
,
double
&
maxRad
){
double
a
=
NORM
.
x
();
double
b
=
NORM
.
y
();
double
c
=
NORM
.
z
();
double
d
=
-
a
*
PT
.
x
()
-
b
*
PT
.
y
()
-
c
*
PT
.
z
();
printf
(
"cut disk (R=%g)= %g %g %g %g
\n
"
,
maxRad
,
a
,
b
,
c
,
d
);
//EMI STUFF
const
double
EPS
=
0.001
;
std
::
set
<
MEdge
,
Less_Edge
>
allEdges
;
for
(
unsigned
int
i
=
0
;
i
<
triangles
.
size
();
i
++
){
for
(
unsigned
int
j
=
0
;
j
<
3
;
j
++
)
allEdges
.
insert
(
triangles
[
i
]
->
getEdge
(
j
));
}
bool
closedCut
=
false
;
int
step
=
0
;
while
(
!
closedCut
&&
step
<
10
){
double
rad
=
1.3
*
maxRad
+
0.15
*
step
*
maxRad
;
//printf("radius(%d) =%g \n", step, rad);
std
::
map
<
MEdge
,
MVertex
*
,
Less_Edge
>
cutEdges
;
std
::
set
<
MVertex
*>
cutVertices
;
std
::
vector
<
MTriangle
*>
newTris
;
std
::
set
<
MEdge
,
Less_Edge
>
newCut
;
cutEdges
.
clear
();
cutVertices
.
clear
();
newTris
.
clear
();
newCut
.
clear
();
for
(
std
::
set
<
MEdge
,
Less_Edge
>::
iterator
it
=
allEdges
.
begin
();
it
!=
allEdges
.
end
()
;
++
it
){
MEdge
me
=
*
it
;
SVector3
P1
(
me
.
getVertex
(
0
)
->
x
(),
me
.
getVertex
(
0
)
->
y
(),
me
.
getVertex
(
0
)
->
z
());
SVector3
P2
(
me
.
getVertex
(
1
)
->
x
(),
me
.
getVertex
(
1
)
->
y
(),
me
.
getVertex
(
1
)
->
z
());
double
V1
=
a
*
P1
.
x
()
+
b
*
P1
.
y
()
+
c
*
P1
.
z
()
+
d
;
double
V2
=
a
*
P2
.
x
()
+
b
*
P2
.
y
()
+
c
*
P2
.
z
()
+
d
;
bool
inters
=
(
V1
*
V2
<
0.0
)
?
true
:
false
;
double
rdist
=
-
V1
/
(
V2
-
V1
);
if
(
inters
&&
rdist
>
EPS
&&
rdist
<
1.
-
EPS
){
SVector3
PZ
=
P1
+
rdist
*
(
P2
-
P1
);
MVertex
*
newv
=
new
MVertex
(
PZ
.
x
(),
PZ
.
y
(),
PZ
.
z
());
if
(
norm
(
PZ
-
PT
)
<
rad
)
cutEdges
.
insert
(
std
::
make_pair
(
*
it
,
newv
));
}
else
if
(
inters
&&
rdist
<=
EPS
&&
norm
(
P1
-
PT
)
<
rad
)
cutVertices
.
insert
(
me
.
getVertex
(
0
));
else
if
(
inters
&&
rdist
>=
1.
-
EPS
&&
norm
(
P2
-
PT
)
<
rad
)
cutVertices
.
insert
(
me
.
getVertex
(
1
));
}
for
(
unsigned
int
i
=
0
;
i
<
triangles
.
size
();
i
++
){
cutTriangle
(
triangles
[
i
],
cutEdges
,
cutVertices
,
newTris
,
newCut
);
}
if
(
isClosed
(
newCut
))
{
printf
(
"closed cut
\n
"
);
triangles
=
newTris
;
theCut
.
insert
(
newCut
.
begin
(),
newCut
.
end
());
//if (step > 1) printf("YOUPIIIIIIIIIIIIIIIIIIIIIII \n");
break
;
}
int
nbV
=
e
->
getNumVertices
();
double
**
nodeLs
=
new
double
*
[
nbV
];
DI_Triangle
T
(
e
->
getVertex
(
0
)
->
x
(),
e
->
getVertex
(
0
)
->
y
(),
e
->
getVertex
(
0
)
->
z
(),
e
->
getVertex
(
1
)
->
x
(),
e
->
getVertex
(
1
)
->
y
(),
e
->
getVertex
(
1
)
->
z
(),
e
->
getVertex
(
2
)
->
x
(),
e
->
getVertex
(
2
)
->
y
(),
e
->
getVertex
(
2
)
->
z
());
SPoint3
cg
(
0.333
*
(
e
->
getVertex
(
0
)
->
x
()
+
e
->
getVertex
(
1
)
->
x
()
+
e
->
getVertex
(
2
)
->
x
()),
0.333
*
(
e
->
getVertex
(
0
)
->
y
()
+
e
->
getVertex
(
1
)
->
y
()
+
e
->
getVertex
(
2
)
->
y
()),
0.333
*
(
e
->
getVertex
(
0
)
->
z
()
+
e
->
getVertex
(
1
)
->
z
()
+
e
->
getVertex
(
2
)
->
z
()));
T
.
setPolynomialOrder
(
1
);
double
x0
=
e
->
getVertex
(
0
)
->
x
(),
y0
=
e
->
getVertex
(
0
)
->
y
(),
z0
=
e
->
getVertex
(
0
)
->
z
();
double
val0
=
a
*
x0
+
b
*
y0
+
c
*
z0
+
d
;
double
sign0
=
val0
;
bool
zeroElem
=
false
;
nodeLs
[
0
]
=
new
double
[
1
];
//one ls value
nodeLs
[
0
][
0
]
=
val0
;
for
(
int
i
=
1
;
i
<
nbV
;
i
++
){
double
x
=
e
->
getVertex
(
i
)
->
x
(),
y
=
e
->
getVertex
(
i
)
->
y
(),
z
=
e
->
getVertex
(
i
)
->
z
();
double
val
=
a
*
x
+
b
*
y
+
c
*
z
+
d
;
double
sign
=
sign0
*
val
;
if
(
sign
<
0.0
&&
!
zeroElem
)
zeroElem
=
true
;
nodeLs
[
i
]
=
new
double
[
1
];
//one ls value
nodeLs
[
i
][
0
]
=
val
;
}
if
(
zeroElem
){
double
radius
=
sqrt
((
cg
.
x
()
-
pt
.
x
())
*
(
cg
.
x
()
-
pt
.
x
())
+
(
cg
.
y
()
-
pt
.
y
())
*
(
cg
.
y
()
-
pt
.
y
())
+
(
cg
.
z
()
-
pt
.
z
())
*
(
cg
.
z
()
-
pt
.
z
()));
if
(
radius
<
rad
){
isCut
=
T
.
cut
(
RPN
,
ipV
,
ipS
,
cp
,
integOrder
,
integOrder
,
integOrder
,
quads
,
triangles
,
lines
,
recur
,
nodeLs
);
}
}
else
triangles
.
push_back
(
&
T
);
for
(
int
i
=
0
;
i
<
nbV
;
i
++
)
delete
nodeLs
[
i
];
delete
[]
nodeLs
;
}
}
printf
(
"split mesh done
\n
"
);
else
{
if
(
step
==
9
)
printf
(
"no closed cut %d
\n
"
,
newCut
.
size
());
step
++
;
// // triangles = newTris;
// // theCut.insert(newCut.begin(),newCut.end());
// char name[256];
// sprintf(name, "myCUT-%d.pos", step);
// FILE * f2 = fopen(name,"w");
// fprintf(f2, "View \"\"{\n");
// std::set<MEdge,Less_Edge>::iterator itp = newCut.begin();
// while (itp != newCut.end()){
// MEdge l = *itp;
// fprintf(f2, "SL(%g,%g,%g,%g,%g,%g){%g,%g};\n",
// l.getVertex(0)->x(), l.getVertex(0)->y(), l.getVertex(0)->z(),
// l.getVertex(1)->x(), l.getVertex(1)->y(), l.getVertex(1)->z(),
// 1.0,1.0);
// itp++;
// }
// fprintf(f2,"};\n");
// fclose(f2);
}
}
// //GAETAN STUFF
// //variables for using the cutting tools
// DI_Point::Container cp;//cut points
// std::vector<DI_IntegrationPoint *> ipV;//integration points vol
// std::vector<DI_IntegrationPoint *> ipS;//integration points surf
// bool isCut = false;
// gLevelset *GLS = new gLevelsetPlane(0., 0., 0., 0.);
// std::vector<gLevelset *> RPN;
// RPN.push_back(GLS);
// //loop over all surface mesh elements
// for(unsigned int i = 0; i < triangles.size(); i++){
// MTriangle *e = triangles[i];
// double **nodeLs= new double*[3];
// DI_Triangle *T = new DI_Triangle(e->getVertex(0)->x(), e->getVertex(0)->y(), e->getVertex(0)->z(),
// e->getVertex(1)->x(), e->getVertex(1)->y(), e->getVertex(1)->z(),
// e->getVertex(2)->x(), e->getVertex(2)->y(), e->getVertex(2)->z());
// SPoint3 cg(0.333*(e->getVertex(0)->x()+e->getVertex(1)->x()+e->getVertex(2)->x()),
// 0.333*(e->getVertex(0)->y()+e->getVertex(1)->y()+e->getVertex(2)->y()),
// 0.333*(e->getVertex(0)->z()+e->getVertex(1)->z()+e->getVertex(2)->z()));
// double x0 = e->getVertex(0)->x(), y0= e->getVertex(0)->y(), z0=e->getVertex(0)->z();
// double val0 = a * x0 + b * y0 + c * z0 + d;
// double sign0 = val0;
// bool zeroElem = false;
// nodeLs[0] = new double[1];//one ls value
// nodeLs[0][0]= val0;
// for(int i=1;i<3;i++){
// double x = e->getVertex(i)->x(), y= e->getVertex(i)->y(), z=e->getVertex(i)->z();
// double val = a * x + b * y + c * z + d;
// double sign = sign0*val;
// if (sign < 0.0 && !zeroElem) zeroElem = true;
// nodeLs[i] = new double[1];//one ls value
// nodeLs[i][0]= val;
// }
// if (zeroElem){
// double radius = sqrt((cg.x()-PT.x())*(cg.x()-PT.x())+(cg.y()-PT.y())*(cg.y()-PT.y())+(cg.z()-PT.z())*(cg.z()-PT.z()));
// if (radius < rad){
// isCut = T->cut(RPN, ipV, ipS, cp, 1, 1, 1,
// cutQUAD, cutTRI, cutLIN, 0, nodeLs);
// }
// else cutTRI.push_back(T);
// }
// else cutTRI.push_back(T);
// for(int i=0;i<3;i++) delete nodeLs[i];
// delete []nodeLs;
// }
return
;
}
...
...
This diff is collapsed.
Click to expand it.
Mesh/CenterlineField.h
+
6
−
2
View file @
491c2c84
...
...
@@ -14,11 +14,13 @@
#include
<set>
#include
<string>
#include
"Field.h"
#include
"MEdge.h"
class
GModel
;
class
GFace
;
class
MLine
;
class
MVertex
;
class
GEntity
;
class
MTriangle
;
#if defined(HAVE_ANN)
#include
<ANN/ANN.h>
...
...
@@ -66,7 +68,9 @@ class Centerline : public Field{
std
::
map
<
MLine
*
,
int
>
colorl
;
//the tubular surface mesh
std
::
vector
<
GFace
*>
surfaces
;
std
::
vector
<
MTriangle
*>
triangles
;
//the lines cut of the tubular mesh by planes
std
::
set
<
MEdge
,
Less_Edge
>
theCut
;
public:
Centerline
(
std
::
string
fileName
);
...
...
@@ -116,7 +120,7 @@ class Centerline : public Field{
// Cut the tubular structure with a disk
// perpendicular to the tubular structure
void
cutByDisk
(
S
Point
3
pt
,
SVector3
dir
,
double
r
ad
);
void
cutByDisk
(
S
Vector
3
&
pt
,
SVector3
&
dir
,
double
&
maxR
ad
);
//Print for debugging
void
printSplit
()
const
;
...
...
This diff is collapsed.
Click to expand it.
contrib/DiscreteIntegration/Integration3D.h
+
4
−
4
View file @
491c2c84
...
...
@@ -324,13 +324,13 @@ class DI_Element
void
getCuttingPoints
(
const
DI_Element
*
e
,
const
std
::
vector
<
gLevelset
*>
&
RPNi
,
std
::
vector
<
DI_CuttingPoint
*>
&
cp
)
const
;
// return the ith point
virtual
DI_Point
*
pt
(
int
i
)
const
{
return
(
i
<
nbVert
())
?
&
(
pts_
[
i
])
:
&
(
mid_
[
i
-
nbVert
()]);}
DI_Point
*
pt
(
int
i
)
const
{
return
(
i
<
nbVert
())
?
&
(
pts_
[
i
])
:
&
(
mid_
[
i
-
nbVert
()]);}
// return the ith middle point
inline
DI_Point
*
mid
(
int
i
)
const
{
return
mid_
?
&
(
mid_
[
i
])
:
NULL
;}
// return the coordinates of the ith point
virtual
double
x
(
int
i
)
const
{
return
pt
(
i
)
->
x
();}
virtual
double
y
(
int
i
)
const
{
return
pt
(
i
)
->
y
();}
virtual
double
z
(
int
i
)
const
{
return
pt
(
i
)
->
z
();}
double
x
(
int
i
)
const
{
return
pt
(
i
)
->
x
();
}
double
y
(
int
i
)
const
{
return
pt
(
i
)
->
y
();}
double
z
(
int
i
)
const
{
return
pt
(
i
)
->
z
();}
// return the last levelset value of the ith point
virtual
double
ls
(
int
i
)
const
{
return
pt
(
i
)
->
ls
();}
// return the jth levelset value of the ith point
...
...
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