Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Open sidebar
CGoGN
CGoGN
Commits
fee3b1fc
Commit
fee3b1fc
authored
Jun 14, 2011
by
Pierre Kraemer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
corrections intersection sphere / edge
parent
b18a529d
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
53 additions
and
68 deletions
+53
-68
include/Algo/Geometry/curvature.hpp
include/Algo/Geometry/curvature.hpp
+3
-2
include/Algo/Geometry/intersection.h
include/Algo/Geometry/intersection.h
+9
-6
include/Algo/Geometry/intersection.hpp
include/Algo/Geometry/intersection.hpp
+24
-23
include/Algo/Selection/collector.h
include/Algo/Selection/collector.h
+2
-11
include/Algo/Selection/collector.hpp
include/Algo/Selection/collector.hpp
+12
-23
include/Geometry/inclusion.h
include/Geometry/inclusion.h
+1
-1
include/Geometry/intersection.h
include/Geometry/intersection.h
+2
-2
No files found.
include/Algo/Geometry/curvature.hpp
View file @
fee3b1fc
...
...
@@ -360,8 +360,9 @@ void computeCurvatureVertex_NormalCycles(
const
std
::
vector
<
Dart
>&
vd2
=
neigh
.
getBorder
()
;
for
(
std
::
vector
<
Dart
>::
const_iterator
it
=
vd2
.
begin
();
it
!=
vd2
.
end
();
++
it
)
{
const
VEC3
e
=
position
[
map
.
phi2
(
*
it
)]
-
position
[
*
it
]
;
const
REAL
alpha
=
neigh
.
intersect_SphereEdge
(
*
it
,
map
.
phi2
(
*
it
))
;
const
VEC3
e
=
Algo
::
Geometry
::
vectorOutOfDart
<
PFP
>
(
map
,
*
it
,
position
)
;
REAL
alpha
;
Algo
::
Geometry
::
intersectionSphereEdge
<
PFP
>
(
map
,
center
,
radius
,
*
it
,
position
,
alpha
)
;
tensor
+=
Geom
::
transposed_vectors_mult
(
e
,
e
)
*
edgeangle
[
*
it
]
*
(
1
/
e
.
norm
())
*
alpha
;
}
...
...
include/Algo/Geometry/intersection.h
View file @
fee3b1fc
...
...
@@ -50,12 +50,12 @@ namespace Geometry
* @return true if segment intersects the face
*/
template
<
typename
PFP
>
bool
intersectionLineConvexFace
(
typename
PFP
::
MAP
&
map
,
Dart
d
,
const
typename
PFP
::
TVEC3
&
position
s
,
const
typename
PFP
::
VEC3
&
P
A
,
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
)
;
/**
* test the intersection between a segment and a n-sided face (n>=3)
* (works with triangular faces but not optimized)
* TODO
to
optimize -based on intersectionLineConvexFace- check whether the points are on both sides of the face before computing intersection
* TODO optimize -
based on intersectionLineConvexFace
- check whether the points are on both sides of the face before computing intersection
* @param map the map
* @param d a dart defining the n-sided face
* @param PA segment point 1
...
...
@@ -64,7 +64,7 @@ bool intersectionLineConvexFace(typename PFP::MAP& map, Dart d, const typename P
* @return true if segment intersects the face
*/
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
)
;
/**
* test if two triangles intersect
...
...
@@ -74,13 +74,16 @@ bool intersectionSegmentConvexFace(typename PFP::MAP& map, Dart d, const typenam
* @param a dart of the second triangle
*/
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
)
;
/**
*
* alpha = coef d'interpolation dans [0 ,1] tel que v = (1-alpha)*pin + alpha*pout
* est le point d'intersection entre la sphère et le segment [pin, pout]
* avec pin = position[din] à l'intérieur de la sphère
* avec pout = position[dout] à l'extérieur de la sphère
*/
template
<
typename
PFP
>
bool
intersectionSphereEdge
(
typename
PFP
::
MAP
&
map
,
typename
PFP
::
VEC3
&
center
,
typename
PFP
::
REAL
radius
,
Dart
d
,
const
typename
PFP
::
TVEC3
&
position
s
,
typename
PFP
::
REAL
&
alpha
)
;
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
)
;
}
// namespace Geometry
...
...
include/Algo/Geometry/intersection.hpp
View file @
fee3b1fc
...
...
@@ -24,7 +24,6 @@
#include "Algo/Geometry/normal.h"
#include "Algo/Geometry/centroid.h"
#include "intersection.h"
#include <limits>
...
...
@@ -38,15 +37,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 +56,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 +67,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 +83,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
,
position
s
,
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 +107,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 +165,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
,
position
s
);
VEC3
bary1
=
faceCentroid
<
PFP
>
(
map
,
tri1
,
position
s
);
VEC3
normale1
=
faceNormal
<
PFP
>
(
map
,
tri1
,
position
);
VEC3
bary1
=
faceCentroid
<
PFP
>
(
map
,
tri1
,
position
);
int
pos
=
0
;
int
neg
=
0
;
...
...
@@ -188,8 +186,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
,
position
s
);
VEC3
bary2
=
faceCentroid
<
PFP
>
(
map
,
tri2
,
position
s
);
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 +208,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,17 +217,20 @@ 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
s
,
typename
PFP
::
REAL
&
alpha
)
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
)
{
typename
PFP
::
VEC3
&
p1
=
position
[
d
];
typename
PFP
::
VEC3
&
p2
=
position
[
map
.
phi1
(
d
)];
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
;
...
...
include/Algo/Selection/collector.h
View file @
fee3b1fc
...
...
@@ -25,6 +25,8 @@
#ifndef __COLLECTOR_H__
#define __COLLECTOR_H__
#include "Algo/Geometry/intersection.h"
/*****************************************
* Class hierarchy :
* Collector (virtual)
...
...
@@ -135,7 +137,6 @@ template <typename PFP>
class
Collector_WithinSphere
:
public
Collector
<
PFP
>
{
protected:
typename
PFP
::
REAL
radius_2
;
typename
PFP
::
VEC3
centerPosition
;
typename
PFP
::
REAL
area
;
...
...
@@ -145,16 +146,6 @@ public:
{}
void
init
(
Dart
d
,
typename
PFP
::
REAL
r
=
0
);
void
collect
();
bool
isInside
(
Dart
d
)
{
return
(
this
->
position
[
d
]
-
centerPosition
).
norm2
()
<
radius_2
;
}
// alpha = coef d'interpolation dans [0 ,1] tel que v= (1-alpha)*pin + alpha*pout
// est le point d'intersection entre la sphère et le segment [pin, pout]
// avec pin = position[din] à l'intérieur de la sphère
// avec pout = position[dout] à l'extérieur de la sphère
typename
PFP
::
REAL
intersect_SphereEdge
(
const
Dart
din
,
const
Dart
dout
);
void
computeArea
();
typename
PFP
::
REAL
getArea
()
const
{
return
area
;
}
};
...
...
include/Algo/Selection/collector.hpp
View file @
fee3b1fc
...
...
@@ -112,7 +112,6 @@ void Collector_WithinSphere<PFP>::init(Dart d, typename PFP::REAL r)
this
->
insideEdges
.
clear
();
this
->
insideFaces
.
clear
();
this
->
border
.
clear
();
radius_2
=
r
*
r
;
centerPosition
=
this
->
position
[
d
];
area
=
0
;
}
...
...
@@ -143,7 +142,7 @@ void Collector_WithinSphere<PFP>::collect()
const
Dart
f
=
this
->
map
.
phi1
(
e
);
const
Dart
g
=
this
->
map
.
phi1
(
f
);
if
(
!
this
->
isInside
(
f
))
if
(
!
Geom
::
isPointInSphere
(
this
->
position
[
f
],
centerPosition
,
this
->
radius
))
{
this
->
border
.
push_back
(
e
);
// add to border
em
.
mark
(
e
);
...
...
@@ -161,7 +160,7 @@ void Collector_WithinSphere<PFP>::collect()
this
->
insideEdges
.
push_back
(
e
);
em
.
mark
(
e
);
}
if
(
!
fm
.
isMarked
(
e
)
&&
this
->
isInside
(
g
))
if
(
!
fm
.
isMarked
(
e
)
&&
Geom
::
isPointInSphere
(
this
->
position
[
g
],
centerPosition
,
this
->
radius
))
{
this
->
insideFaces
.
push_back
(
e
);
fm
.
mark
(
e
);
...
...
@@ -174,41 +173,31 @@ void Collector_WithinSphere<PFP>::collect()
}
}
//template <typename PFP>
//typename PFP::REAL Collector_WithinSphere<PFP>::intersect_SphereEdge(const Dart din, const Dart dout)
//{
// typedef typename PFP::VEC3 VEC3;
// typedef typename PFP::REAL REAL;
// VEC3 p = this->position[din] - this->centerPosition;
// VEC3 qminusp = this->position[dout] - this->centerPosition - p;
// REAL s = p * qminusp;
// REAL n2 = qminusp.norm2();
// return (- s + sqrt(s * s + n2 * (this->radius_2 - p.norm2()))) / n2;
//}
template
<
typename
PFP
>
void
Collector_WithinSphere
<
PFP
>::
computeArea
()
{
for
(
std
::
vector
<
Dart
>::
const_iterator
it
=
this
->
insideFaces
.
begin
();
it
!=
this
->
insideFaces
.
end
();
++
it
)
{
this
->
area
+=
Algo
::
Geometry
::
triangleArea
<
PFP
>
(
this
->
map
,
*
it
,
this
->
position
);
area
+=
Algo
::
Geometry
::
triangleArea
<
PFP
>
(
this
->
map
,
*
it
,
this
->
position
);
}
for
(
std
::
vector
<
Dart
>::
const_iterator
it
=
this
->
border
.
begin
();
it
!=
this
->
border
.
end
();
++
it
)
{
const
Dart
f
=
this
->
map
.
phi1
(
*
it
);
// we know that f is outside
const
Dart
g
=
this
->
map
.
phi1
(
f
);
if
(
this
->
isInside
(
g
))
if
(
Geom
::
isPointInSphere
(
this
->
position
[
g
],
centerPosition
,
this
->
radius
))
{
// only f is outside
typename
PFP
::
REAL
alpha
=
this
->
intersect_SphereEdge
(
*
it
,
f
);
typename
PFP
::
REAL
beta
=
this
->
intersect_SphereEdge
(
g
,
f
);
this
->
area
+=
(
alpha
+
beta
-
alpha
*
beta
)
*
Algo
::
Geometry
::
triangleArea
<
PFP
>
(
this
->
map
,
*
it
,
this
->
position
);
typename
PFP
::
REAL
alpha
,
beta
;
Algo
::
Geometry
::
intersectionSphereEdge
<
PFP
>
(
this
->
map
,
centerPosition
,
this
->
radius
,
*
it
,
this
->
position
,
alpha
);
Algo
::
Geometry
::
intersectionSphereEdge
<
PFP
>
(
this
->
map
,
centerPosition
,
this
->
radius
,
this
->
map
.
phi2
(
f
),
this
->
position
,
beta
);
area
+=
(
alpha
+
beta
-
alpha
*
beta
)
*
Algo
::
Geometry
::
triangleArea
<
PFP
>
(
this
->
map
,
*
it
,
this
->
position
);
}
else
{
// f and g are outside
typename
PFP
::
REAL
alpha
=
this
->
intersect_SphereEdge
(
*
it
,
f
);
typename
PFP
::
REAL
beta
=
this
->
intersect_SphereEdge
(
*
it
,
g
);
this
->
area
+=
alpha
*
beta
*
Algo
::
Geometry
::
triangleArea
<
PFP
>
(
this
->
map
,
*
it
,
this
->
position
);
typename
PFP
::
REAL
alpha
,
beta
;
Algo
::
Geometry
::
intersectionSphereEdge
<
PFP
>
(
this
->
map
,
centerPosition
,
this
->
radius
,
*
it
,
this
->
position
,
alpha
);
Algo
::
Geometry
::
intersectionSphereEdge
<
PFP
>
(
this
->
map
,
centerPosition
,
this
->
radius
,
this
->
map
.
phi2
(
g
),
this
->
position
,
beta
);
area
+=
alpha
*
beta
*
Algo
::
Geometry
::
triangleArea
<
PFP
>
(
this
->
map
,
*
it
,
this
->
position
);
}
}
}
...
...
include/Geometry/inclusion.h
View file @
fee3b1fc
...
...
@@ -54,7 +54,7 @@ template <typename VEC3>
Inclusion
isPointInTriangle
(
const
VEC3
&
point
,
const
VEC3
&
Ta
,
const
VEC3
&
Tb
,
const
VEC3
&
Tc
)
;
template
<
typename
VEC3
>
Inclusion
isPointInSphere
(
const
VEC3
&
point
,
const
VEC3
&
center
,
const
typename
VEC3
::
DATA_TYPE
&
radius
)
;
bool
isPointInSphere
(
const
VEC3
&
point
,
const
VEC3
&
center
,
const
typename
VEC3
::
DATA_TYPE
&
radius
)
;
/**
* test if a segment is inside a triangle, the segment MUST be in the plane of the triangle
...
...
include/Geometry/intersection.h
View file @
fee3b1fc
...
...
@@ -95,9 +95,9 @@ Intersection intersectionPlaneRay(const PLANE3D& pl,const VEC3& p1,const VEC3& d
template
<
typename
VEC3
>
Intersection
intersection2DSegmentSegment
(
const
VEC3
&
PA
,
const
VEC3
&
PB
,
const
VEC3
&
QA
,
const
VEC3
&
QB
,
VEC3
&
Inter
)
;
}
}
// namespace Geom
}
}
// namespace CGoGN
#include "intersection.hpp"
...
...
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