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
Thomas Pitiot
CGoGN
Commits
627a0a0d
Commit
627a0a0d
authored
Jul 01, 2011
by
Pierre Kraemer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
correction intersection.hpp
parent
80f7c7ec
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
63 additions
and
44 deletions
+63
-44
include/Algo/Geometry/intersection.hpp
include/Algo/Geometry/intersection.hpp
+40
-21
include/Algo/Import/import2tablesSurface.hpp
include/Algo/Import/import2tablesSurface.hpp
+3
-3
include/Topology/generic/cellmarker.h
include/Topology/generic/cellmarker.h
+20
-20
No files found.
include/Algo/Geometry/intersection.hpp
View file @
627a0a0d
...
...
@@ -38,15 +38,14 @@ namespace Geometry
{
template
<
typename
PFP
>
bool
intersectionLineConvexFace
(
typename
PFP
::
MAP
&
map
,
Dart
d
,
const
typename
PFP
::
TVEC3
&
position
s
,
const
typename
PFP
::
VEC3
&
P
,
const
typename
PFP
::
VEC3
&
Dir
,
typename
PFP
::
VEC3
&
Inter
)
bool
intersectionLineConvexFace
(
typename
PFP
::
MAP
&
map
,
Dart
d
,
const
typename
PFP
::
TVEC3
&
position
,
const
typename
PFP
::
VEC3
&
P
,
const
typename
PFP
::
VEC3
&
Dir
,
typename
PFP
::
VEC3
&
Inter
)
{
typedef
typename
PFP
::
VEC3
VEC3
;
const
float
SMALL_NUM
=
std
::
numeric_limits
<
typename
PFP
::
REAL
>::
min
()
*
5.0
f
;
VEC3
p1
=
position
s
[
d
];
VEC3
n
=
faceNormal
<
PFP
>
(
map
,
d
,
position
s
);
VEC3
p1
=
position
[
d
];
VEC3
n
=
faceNormal
<
PFP
>
(
map
,
d
,
position
);
VEC3
w0
=
P
-
p1
;
float
a
=
-
(
n
*
w0
);
float
b
=
n
*
Dir
;
...
...
@@ -58,7 +57,7 @@ bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename P
Inter
=
P
+
r
*
Dir
;
// intersect point of ray and plane
// is I inside the face?
VEC3
p2
=
position
s
[
map
.
phi1
(
d
)];
VEC3
p2
=
position
[
map
.
phi1
(
d
)];
VEC3
v
=
p2
-
p1
;
VEC3
vInter
=
Inter
-
p1
;
float
dirV
=
v
*
vInter
;
...
...
@@ -69,7 +68,7 @@ bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename P
while
(
it
!=
d
)
{
p1
=
p2
;
p2
=
position
s
[
map
.
phi1
(
it
)];
p2
=
position
[
map
.
phi1
(
it
)];
v
=
p2
-
p1
;
vInter
=
Inter
-
p1
;
float
dirD
=
v
*
vInter
;
...
...
@@ -85,22 +84,22 @@ bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename P
}
template
<
typename
PFP
>
bool
intersectionSegmentConvexFace
(
typename
PFP
::
MAP
&
map
,
Dart
d
,
const
typename
PFP
::
TVEC3
&
position
s
,
const
typename
PFP
::
VEC3
&
PA
,
const
typename
PFP
::
VEC3
&
PB
,
typename
PFP
::
VEC3
&
Inter
)
bool
intersectionSegmentConvexFace
(
typename
PFP
::
MAP
&
map
,
Dart
d
,
const
typename
PFP
::
TVEC3
&
position
,
const
typename
PFP
::
VEC3
&
PA
,
const
typename
PFP
::
VEC3
&
PB
,
typename
PFP
::
VEC3
&
Inter
)
{
typename
PFP
::
VEC3
dir
=
PB
-
PA
;
if
(
intersectionLineConvexFace
(
map
,
d
,
positions
,
PA
,
dir
,
Inter
))
if
(
intersectionLineConvexFace
(
map
,
d
,
position
,
PA
,
dir
,
Inter
))
{
typename
PFP
::
VEC3
dirA
=
PA
-
Inter
;
typename
PFP
::
VEC3
dirB
=
PB
-
Inter
;
typename
PFP
::
VEC3
dirB
=
PB
-
Inter
;
if
(
(
dirA
*
dirB
)
<
0
)
if
(
dirA
*
dirB
<
0
)
return
true
;
}
return
false
;
}
template
<
typename
PFP
>
bool
areTrianglesInIntersection
(
typename
PFP
::
MAP
&
map
,
Dart
tri1
,
Dart
tri2
,
const
typename
PFP
::
TVEC3
&
position
s
)
bool
areTrianglesInIntersection
(
typename
PFP
::
MAP
&
map
,
Dart
tri1
,
Dart
tri2
,
const
typename
PFP
::
TVEC3
&
position
)
{
typedef
typename
PFP
::
VEC3
VEC3
;
...
...
@@ -109,8 +108,8 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co
VEC3
tris2
[
3
];
for
(
unsigned
int
i
=
0
;
i
<
3
;
++
i
)
{
tris1
[
i
]
=
position
s
[
tri1
];
tris2
[
i
]
=
position
s
[
tri2
];
tris1
[
i
]
=
position
[
tri1
];
tris2
[
i
]
=
position
[
tri2
];
tri1
=
map
.
phi1
(
tri1
);
tri2
=
map
.
phi1
(
tri2
);
}
...
...
@@ -167,8 +166,8 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co
// return isSegmentInTriangle2D(inter1,inter2,tris2[0],tris2[1],triS2[2],nTri2);
//compute face normal
VEC3
normale1
=
faceNormal
<
PFP
>
(
map
,
tri1
,
positions
);
VEC3
bary1
=
faceCentroid
<
PFP
>
(
map
,
tri1
,
positions
);
VEC3
normale1
=
faceNormal
<
PFP
>
(
map
,
tri1
,
position
);
VEC3
bary1
=
faceCentroid
<
PFP
>
(
map
,
tri1
,
position
);
int
pos
=
0
;
int
neg
=
0
;
...
...
@@ -188,8 +187,8 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co
return
false
;
//same for the second triangle
VEC3
normale2
=
faceNormal
<
PFP
>
(
map
,
tri2
,
positions
);
VEC3
bary2
=
faceCentroid
<
PFP
>
(
map
,
tri2
,
positions
);
VEC3
normale2
=
faceNormal
<
PFP
>
(
map
,
tri2
,
position
);
VEC3
bary2
=
faceCentroid
<
PFP
>
(
map
,
tri2
,
position
);
pos
=
0
;
neg
=
0
;
for
(
unsigned
int
i
=
0
;
i
<
3
;
++
i
)
...
...
@@ -210,7 +209,7 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co
for
(
unsigned
int
i
=
0
;
i
<
3
&&
!
intersection
;
++
i
)
{
VEC3
inter
;
intersection
=
Geom
::
intersectionSegmentTriangle
(
tris1
[
i
],
tris1
[(
i
+
1
)
%
3
],
tris2
[
0
],
tris2
[
1
],
tris2
[
2
],
inter
);
intersection
=
Geom
::
intersectionSegmentTriangle
(
tris1
[
i
],
tris1
[(
i
+
1
)
%
3
],
tris2
[
0
],
tris2
[
1
],
tris2
[
2
],
inter
);
}
if
(
intersection
)
...
...
@@ -219,14 +218,34 @@ bool areTrianglesInIntersection(typename PFP::MAP& map, Dart tri1, Dart tri2, co
for
(
unsigned
int
i
=
0
;
i
<
3
&&
!
intersection
;
++
i
)
{
VEC3
inter
;
intersection
=
Geom
::
intersectionSegmentTriangle
(
tris2
[
i
],
tris2
[(
i
+
1
)
%
3
],
tris1
[
0
],
tris1
[
1
],
tris1
[
2
],
inter
);
intersection
=
Geom
::
intersectionSegmentTriangle
(
tris2
[
i
],
tris2
[(
i
+
1
)
%
3
],
tris1
[
0
],
tris1
[
1
],
tris1
[
2
],
inter
);
}
return
intersection
;
}
}
template
<
typename
PFP
>
bool
intersectionSphereEdge
(
typename
PFP
::
MAP
&
map
,
typename
PFP
::
VEC3
&
center
,
typename
PFP
::
REAL
radius
,
Dart
d
,
const
typename
PFP
::
TVEC3
&
position
,
typename
PFP
::
REAL
&
alpha
)
{
typedef
typename
PFP
::
VEC3
VEC3
;
typedef
typename
PFP
::
REAL
REAL
;
const
typename
PFP
::
VEC3
&
p1
=
position
[
d
];
const
typename
PFP
::
VEC3
&
p2
=
position
[
map
.
phi1
(
d
)];
if
(
Geom
::
isPointInSphere
(
p1
,
center
,
radius
)
&&
!
Geom
::
isPointInSphere
(
p2
,
center
,
radius
))
{
VEC3
p
=
p1
-
center
;
VEC3
qminusp
=
p2
-
center
-
p
;
REAL
s
=
p
*
qminusp
;
REAL
n2
=
qminusp
.
norm2
();
alpha
=
(
-
s
+
sqrt
(
s
*
s
+
n2
*
(
radius
*
radius
-
p
.
norm2
())))
/
n2
;
return
true
;
}
return
false
;
}
}
}
// namespace Geometry
}
// namespace Algo
}
// namespace CGoGN
include/Algo/Import/import2tablesSurface.hpp
View file @
627a0a0d
...
...
@@ -926,7 +926,7 @@ bool MeshTablesSurface<PFP>::importAHEM(const std::string& filename, std::vector
// Allocate vertices
AttributeContainer
&
vxContainer
=
m_map
.
getAttributeContainer
(
VERTEX
_CELL
);
AttributeContainer
&
vxContainer
=
m_map
.
getAttributeContainer
(
VERTEX
);
std
::
vector
<
unsigned
int
>
verticesId
;
...
...
@@ -971,10 +971,10 @@ bool MeshTablesSurface<PFP>::importAHEM(const std::string& filename, std::vector
// Read positions
AttributeHandler
<
typename
PFP
::
VEC3
>
position
=
m_map
.
template
getAttribute
<
typename
PFP
::
VEC3
>(
VERTEX
_ORBIT
,
"position"
)
;
AttributeHandler
<
typename
PFP
::
VEC3
>
position
=
m_map
.
template
getAttribute
<
typename
PFP
::
VEC3
>(
VERTEX
,
"position"
)
;
if
(
!
position
.
isValid
())
position
=
m_map
.
template
addAttribute
<
typename
PFP
::
VEC3
>(
VERTEX
_ORBIT
,
"position"
)
;
position
=
m_map
.
template
addAttribute
<
typename
PFP
::
VEC3
>(
VERTEX
,
"position"
)
;
attrNames
.
push_back
(
position
.
name
())
;
...
...
include/Topology/generic/cellmarker.h
View file @
627a0a0d
...
...
@@ -40,10 +40,10 @@ namespace CGoGN
class
CellMarkerGen
{
protected:
Mark
m_mark
;
AttribMap
&
m_map
;
unsigned
int
m_cell
;
unsigned
int
m_thread
;
Mark
m_mark
;
AttribMap
&
m_map
;
unsigned
int
m_cell
;
unsigned
int
m_thread
;
public:
/**
...
...
@@ -55,7 +55,7 @@ public:
{
if
(
!
map
.
isOrbitEmbedded
(
cell
))
map
.
addEmbedding
(
cell
)
;
m_mark
=
map
.
getNewMark
(
cell
,
thread
);
m_mark
=
map
.
getNewMark
(
cell
,
thread
)
;
}
virtual
~
CellMarkerGen
()
...
...
@@ -74,11 +74,11 @@ public:
*/
virtual
void
mark
(
Dart
d
)
{
unsigned
int
a
=
m_map
.
getEmbedding
(
m_cell
,
d
);
unsigned
int
a
=
m_map
.
getEmbedding
(
m_cell
,
d
)
;
if
(
a
==
EMBNULL
)
a
=
m_map
.
embedNewCell
(
m_cell
,
d
);
a
=
m_map
.
embedNewCell
(
m_cell
,
d
)
;
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
a
).
setMark
(
m_mark
);
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
a
).
setMark
(
m_mark
)
;
}
/**
...
...
@@ -86,11 +86,11 @@ public:
*/
virtual
void
unmark
(
Dart
d
)
{
unsigned
int
a
=
m_map
.
getEmbedding
(
m_cell
,
d
);
unsigned
int
a
=
m_map
.
getEmbedding
(
m_cell
,
d
)
;
if
(
a
==
EMBNULL
)
a
=
m_map
.
embedNewCell
(
m_cell
,
d
);
a
=
m_map
.
embedNewCell
(
m_cell
,
d
)
;
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
a
).
unsetMark
(
m_mark
);
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
a
).
unsetMark
(
m_mark
)
;
}
/**
...
...
@@ -98,11 +98,11 @@ public:
*/
virtual
bool
isMarked
(
Dart
d
)
{
unsigned
int
a
=
m_map
.
getEmbedding
(
m_cell
,
d
);
unsigned
int
a
=
m_map
.
getEmbedding
(
m_cell
,
d
)
;
if
(
a
==
EMBNULL
)
return
false
;
return
false
;
return
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
a
).
testMark
(
m_mark
);
return
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
a
).
testMark
(
m_mark
)
;
}
/**
...
...
@@ -110,7 +110,7 @@ public:
*/
virtual
void
mark
(
unsigned
int
em
)
{
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
em
).
setMark
(
m_mark
);
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
em
).
setMark
(
m_mark
)
;
}
/**
...
...
@@ -118,7 +118,7 @@ public:
*/
virtual
void
unmark
(
unsigned
int
em
)
{
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
em
).
unsetMark
(
m_mark
);
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
em
).
unsetMark
(
m_mark
)
;
}
/**
...
...
@@ -126,7 +126,7 @@ public:
*/
virtual
bool
isMarked
(
unsigned
int
em
)
{
return
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
em
).
testMark
(
m_mark
);
return
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
em
).
testMark
(
m_mark
)
;
}
/**
...
...
@@ -136,7 +136,7 @@ public:
{
AttributeContainer
&
cont
=
m_map
.
getAttributeContainer
(
m_cell
)
;
for
(
unsigned
int
i
=
cont
.
begin
();
i
!=
cont
.
end
();
cont
.
next
(
i
))
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
i
).
setMark
(
m_mark
);
m_map
.
getMarkVector
(
m_cell
,
m_thread
)
->
operator
[](
i
).
setMark
(
m_mark
)
;
}
/**
...
...
@@ -199,7 +199,7 @@ public:
virtual
~
CellMarkerStore
()
{
unmarkAll
()
;
assert
(
isAllUnmarked
());
assert
(
isAllUnmarked
())
;
}
protected:
...
...
@@ -239,7 +239,7 @@ public:
virtual
~
CellMarkerNoUnmark
()
{
assert
(
isAllUnmarked
());
assert
(
isAllUnmarked
())
;
}
protected:
...
...
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