ArborX / Spatial indexes / ArborX::BVH
ArborX::BVH<MemorySpace, Value, IndexableGetter, BoundingVolume>::BVH¶
BVH() noexcept; // (1)
template <typename ExecutionSpace, typename Values>
BVH(ExecutionSpace const& space, Values const& values); // (2)
template <typename ExecutionSpace, typename Values>
BVH(ExecutionSpace const& space, Values const& values, IndexableGetter const& indexable_getter); // (3)
Default constructor. Constructs an empty tree.
Constructs a bounding volume hierarchy from a given data source.
Constructs a bounding volume hierarchy from a given data source and a function tranforming a value into indexable.
Parameters¶
space: execution space
values: values stored in the container
indexable_getter: a function object to transform a value into an indexable
Type requirements¶
MemorySpacemust be accessible fromExecutionSpace(i.e.,Kokkos::SpaceAccessibility<ExecutionSpace, MemorySpace>::accessiblemust betrue).A specialization of ArborX::AccessTraits must match
Valuesas the template argument.The return type of
ArborX::AccessTraits<Values>::get()must decay toValue.IndexableGettermust provide anoperator()taking in a type that decays toValueand returning an indexable (geometric object).
Complexity¶
O(N log N), where N is the number of primitives passed to the constructor (ArborX::AccessTraits<Values>::size(values)).
Exceptions¶
Memory allocation with Kokkos may throw.
Notes¶
Example¶
#include <ArborX_LinearBVH.hpp>
#include <Kokkos_Core.hpp>
#include <iostream>
std::ostream &operator<<(std::ostream &os, ArborX::Point<3> const &p)
{
os << '(' << p[0] << ',' << p[1] << ',' << p[2] << ')';
return os;
}
int main(int argc, char *argv[])
{
Kokkos::ScopeGuard guard(argc, argv);
Kokkos::View<ArborX::Point<3> *> cloud("point_cloud", 1000);
Kokkos::parallel_for(1000, KOKKOS_LAMBDA(int i) {
cloud[i] = {(float)i, (float)i, (float)i};
});
using memory_space = decltype(cloud)::memory_space; // where to store the tree
using execution_space = decltype(cloud)::execution_space; // where to execute code
ArborX::BVH bvh{execution_space{}, cloud};
auto const box = bvh.bounds();
std::cout << box.minCorner() << " - " << box.maxCorner() << '\n';
return 0;
}
Output
(0,0,0) - (999,999,999)