Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F121793987
BVH_Example.cpp
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Sun, Jul 13, 23:13
Size
2 KB
Mime Type
text/x-c
Expires
Tue, Jul 15, 23:13 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
27392165
Attached To
rDLMA Diffusion limited mixed aggregation
BVH_Example.cpp
View Options
#include <Eigen/StdVector>
#include <unsupported/Eigen/BVH>
#include <iostream>
using
namespace
Eigen
;
typedef
AlignedBox
<
double
,
2
>
Box2d
;
namespace
Eigen
{
Box2d
bounding_box
(
const
Vector2d
&
v
)
{
return
Box2d
(
v
,
v
);
}
//compute the bounding box of a single point
}
struct
PointPointMinimizer
//how to compute squared distances between points and rectangles
{
PointPointMinimizer
()
:
calls
(
0
)
{}
typedef
double
Scalar
;
double
minimumOnVolumeVolume
(
const
Box2d
&
r1
,
const
Box2d
&
r2
)
{
++
calls
;
return
r1
.
squaredExteriorDistance
(
r2
);
}
double
minimumOnVolumeObject
(
const
Box2d
&
r
,
const
Vector2d
&
v
)
{
++
calls
;
return
r
.
squaredExteriorDistance
(
v
);
}
double
minimumOnObjectVolume
(
const
Vector2d
&
v
,
const
Box2d
&
r
)
{
++
calls
;
return
r
.
squaredExteriorDistance
(
v
);
}
double
minimumOnObjectObject
(
const
Vector2d
&
v1
,
const
Vector2d
&
v2
)
{
++
calls
;
return
(
v1
-
v2
).
squaredNorm
();
}
int
calls
;
};
int
main
()
{
typedef
std
::
vector
<
Vector2d
,
aligned_allocator
<
Vector2d
>
>
StdVectorOfVector2d
;
StdVectorOfVector2d
redPoints
,
bluePoints
;
for
(
int
i
=
0
;
i
<
100
;
++
i
)
{
//initialize random set of red points and blue points
redPoints
.
push_back
(
Vector2d
::
Random
());
bluePoints
.
push_back
(
Vector2d
::
Random
());
}
PointPointMinimizer
minimizer
;
double
minDistSq
=
std
::
numeric_limits
<
double
>::
max
();
//brute force to find closest red-blue pair
for
(
int
i
=
0
;
i
<
(
int
)
redPoints
.
size
();
++
i
)
for
(
int
j
=
0
;
j
<
(
int
)
bluePoints
.
size
();
++
j
)
minDistSq
=
std
::
min
(
minDistSq
,
minimizer
.
minimumOnObjectObject
(
redPoints
[
i
],
bluePoints
[
j
]));
std
::
cout
<<
"Brute force distance = "
<<
sqrt
(
minDistSq
)
<<
", calls = "
<<
minimizer
.
calls
<<
std
::
endl
;
//using BVH to find closest red-blue pair
minimizer
.
calls
=
0
;
KdBVH
<
double
,
2
,
Vector2d
>
redTree
(
redPoints
.
begin
(),
redPoints
.
end
()),
blueTree
(
bluePoints
.
begin
(),
bluePoints
.
end
());
//construct the trees
minDistSq
=
BVMinimize
(
redTree
,
blueTree
,
minimizer
);
//actual BVH minimization call
std
::
cout
<<
"BVH distance = "
<<
sqrt
(
minDistSq
)
<<
", calls = "
<<
minimizer
.
calls
<<
std
::
endl
;
return
0
;
}
Event Timeline
Log In to Comment