Open3D (C++ API)  0.16.0
NeighborSearchCommon.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// The MIT License (MIT)
5//
6// Copyright (c) 2018-2021 www.open3d.org
7//
8// Permission is hereby granted, free of charge, to any person obtaining a copy
9// of this software and associated documentation files (the "Software"), to deal
10// in the Software without restriction, including without limitation the rights
11// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12// copies of the Software, and to permit persons to whom the Software is
13// furnished to do so, subject to the following conditions:
14//
15// The above copyright notice and this permission notice shall be included in
16// all copies or substantial portions of the Software.
17//
18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24// IN THE SOFTWARE.
25// ----------------------------------------------------------------------------
26
27#pragma once
28
29#include <nanoflann.hpp>
30
32
33namespace open3d {
34namespace ml {
35namespace impl {
36
38enum Metric { L1, L2, Linf };
39
40#ifdef __CUDACC__
41#define HOST_DEVICE __host__ __device__
42#else
43#define HOST_DEVICE
44#endif
45
47HOST_DEVICE inline size_t SpatialHash(int x, int y, int z) {
48 return x * 73856096 ^ y * 193649663 ^ z * 83492791;
49}
50
52 return SpatialHash(xyz[0], xyz[1], xyz[2]);
53}
54
60template <class TVecf>
62 const TVecf& pos, const typename TVecf::Scalar_t& inv_voxel_size) {
63 TVecf ref_coord = pos * inv_voxel_size;
64
65 utility::MiniVec<int, 3> voxel_index;
66 voxel_index = floor(ref_coord).template cast<int>();
67 return voxel_index;
68}
69#undef HOST_DEVICE
70
72template <class T>
73class Adaptor {
74public:
75 Adaptor(size_t num_points, const T* const data)
76 : num_points(num_points), data(data) {}
77
78 inline size_t kdtree_get_point_count() const { return num_points; }
79
80 inline T kdtree_get_pt(const size_t idx, int dim) const {
81 return data[3 * idx + dim];
82 }
83
84 template <class BBOX>
85 bool kdtree_get_bbox(BBOX&) const {
86 return false;
87 }
88
89private:
90 size_t num_points;
91 const T* const data;
92};
93
94template <int METRIC, class T>
96
97template <class T>
99 typedef nanoflann::L2_Adaptor<T, Adaptor<T>> Adaptor_t;
100};
101
102template <class T>
104 typedef nanoflann::L1_Adaptor<T, Adaptor<T>> Adaptor_t;
105};
106
107} // namespace impl
108} // namespace ml
109} // namespace open3d
Adaptor for nanoflann.
Definition: NeighborSearchCommon.h:73
Adaptor(size_t num_points, const T *const data)
Definition: NeighborSearchCommon.h:75
size_t kdtree_get_point_count() const
Definition: NeighborSearchCommon.h:78
bool kdtree_get_bbox(BBOX &) const
Definition: NeighborSearchCommon.h:85
T kdtree_get_pt(const size_t idx, int dim) const
Definition: NeighborSearchCommon.h:80
#define HOST_DEVICE
Definition: NeighborSearchCommon.h:43
HOST_DEVICE size_t SpatialHash(int x, int y, int z)
Spatial hashing function for integer coordinates.
Definition: NeighborSearchCommon.h:47
Metric
Supported metrics.
Definition: NeighborSearchCommon.h:38
@ Linf
Definition: NeighborSearchCommon.h:38
@ L1
Definition: NeighborSearchCommon.h:38
@ L2
Definition: NeighborSearchCommon.h:38
HOST_DEVICE utility::MiniVec< int, 3 > ComputeVoxelIndex(const TVecf &pos, const typename TVecf::Scalar_t &inv_voxel_size)
Definition: NeighborSearchCommon.h:61
FN_SPECIFIERS MiniVec< float, N > floor(const MiniVec< float, N > &a)
Definition: MiniVec.h:94
Definition: PinholeCameraIntrinsic.cpp:35
nanoflann::L1_Adaptor< T, Adaptor< T > > Adaptor_t
Definition: NeighborSearchCommon.h:104
nanoflann::L2_Adaptor< T, Adaptor< T > > Adaptor_t
Definition: NeighborSearchCommon.h:99
Definition: NeighborSearchCommon.h:95
Definition: MiniVec.h:43