1#ifndef TATOOINE_KDTREE_H
2#define TATOOINE_KDTREE_H
12template <
typename Mesh>
13struct kdtree :
aabb<typename Mesh::real_type, Mesh::num_dimensions()> {
14 static constexpr auto num_dimensions() -> std::size_t {
return Mesh::num_dimensions(); }
59 size_t const level,
size_t const max_depth)
99 if (
mesh()[v](split_index) <= split_pos) {
102 if (
mesh()[v](split_index) >= split_pos) {
110 auto min0 = this->
min();
111 auto max0 = this->
max();
112 auto min1 = this->
min();
113 auto max1 = this->
max();
114 auto split_index = std::numeric_limits<size_t>::max();
115 auto split_pos = std::numeric_limits<real_type>::max();
117 auto dim_positions = std::vector<real_type>{};
121 dim_positions.push_back(
mesh()[v](i));
123 std::sort(
begin(dim_positions),
end(dim_positions));
124 if (
auto const space = dim_positions.back() - dim_positions.front();
125 space > max_space_range) {
126 max_space_range = space;
129 size_t const i0 =
size(dim_positions) / 2;
130 split_pos = (dim_positions[i0] + dim_positions[i0 - 1]) / 2;
132 dim_positions.clear();
134 assert(split_index != std::numeric_limits<size_t>::max());
135 max0(split_index) = split_pos;
136 min1(split_index) = split_pos;
152 std::vector<std::vector<size_t>> indices;
154 f.write_points(positions);
155 f.write_lines(indices);
161 std::vector<std::vector<size_t>>& indices,
size_t cur_idx = 0) ->
size_t {
163 positions.push_back(
vec{
min(0),
min(1)});
164 positions.push_back(
vec{
max(0),
min(1)});
165 positions.push_back(
vec{
max(0),
max(1)});
166 positions.push_back(
vec{
min(0),
max(1)});
168 {cur_idx, cur_idx + 1, cur_idx + 2, cur_idx + 3, cur_idx});
172 cur_idx = child->write_vtk_collect_positions_and_indices(
173 positions, indices, cur_idx);
187 {cur_idx, cur_idx + 1, cur_idx + 2, cur_idx + 3, cur_idx});
189 {cur_idx + 4, cur_idx + 5, cur_idx + 6, cur_idx + 7, cur_idx + 4});
190 indices.push_back({cur_idx, cur_idx + 4});
191 indices.push_back({cur_idx + 1, cur_idx + 5});
192 indices.push_back({cur_idx + 2, cur_idx + 6});
193 indices.push_back({cur_idx + 3, cur_idx + 7});
197 cur_idx = child->write_vtk_collect_positions_and_indices(
198 positions, indices, cur_idx);
207template <
typename Mesh>
215 return is_kdtree<std::decay_t<T>>();
auto & vertices(face f)
Definition: mesh.h:427
Definition: vtk_legacy.h:448
Definition: algorithm.h:6
auto begin(Range &&range)
Definition: iterator_facade.h:318
auto end(Range &&range)
Definition: iterator_facade.h:322
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
constexpr auto is_kdtree()
Definition: kdtree.h:210
Definition: axis_aligned_bounding_box.h:103
vec< Real, NumDimensions > vec_type
Definition: axis_aligned_bounding_box.h:108
auto constexpr is_inside(pos_type const &p) const
Definition: axis_aligned_bounding_box.h:191
auto constexpr max() const -> auto const &
Definition: axis_aligned_bounding_box.h:156
auto constexpr min() const -> auto const &
Definition: axis_aligned_bounding_box.h:151
constexpr auto is_simplex_inside(vec< Real, 2 > const &x0, vec< Real, 2 > const &x1, vec< Real, 2 > const &x2) const
Definition: axis_aligned_bounding_box.h:254
auto num_triangle_handles() const
Definition: kdtree.h:69
static constexpr auto num_dimensions() -> std::size_t
Definition: kdtree.h:14
auto mesh() const -> auto const &
Definition: kdtree.h:66
typename Mesh::real_type real_type
Definition: kdtree.h:15
size_t m_max_depth
Definition: kdtree.h:30
auto split_if_necessary() -> void
Definition: kdtree.h:84
size_t m_level
Definition: kdtree.h:29
auto constexpr max() const -> auto const &
Definition: axis_aligned_bounding_box.h:156
std::array< std::unique_ptr< kdtree >, 2 > m_children
Definition: kdtree.h:33
constexpr auto is_at_max_depth() const
Definition: kdtree.h:92
constexpr auto holds_vertices() const
Definition: kdtree.h:91
static constexpr size_t default_max_depth
Definition: kdtree.h:34
typename Mesh::vertex_handle vertex_handle
Definition: kdtree.h:23
Mesh const * m_mesh
Definition: kdtree.h:28
auto constexpr min() const -> auto const &
Definition: axis_aligned_bounding_box.h:151
std::vector< vertex_handle > m_vertex_handles
Definition: kdtree.h:31
auto write_vtk_collect_positions_and_indices(std::vector< vec< real_type, num_dimensions()> > &positions, std::vector< std::vector< size_t > > &indices, size_t cur_idx=0) -> size_t
Definition: kdtree.h:159
auto distribute_vertices(size_t const split_index, real_type const split_pos)
Definition: kdtree.h:96
auto num_vertex_handles() const
Definition: kdtree.h:68
kdtree(Mesh const &mesh, vec_type const &min, vec_type const &max, size_t const level, size_t const max_depth)
Definition: kdtree.h:58
auto split()
Definition: kdtree.h:109
constexpr auto is_splitted() const
Definition: kdtree.h:90
auto write_vtk(filesystem::path const &path)
Definition: kdtree.h:148
virtual ~kdtree()=default
kdtree(Mesh const &mesh, size_t const max_depth=default_max_depth)
Definition: kdtree.h:37
std::vector< size_t > m_triangle_handles
Definition: kdtree.h:32
static auto constexpr ones()
Definition: vec.h:28