mirror of
https://github.com/jlblancoc/nanoflann.git
synced 2026-01-16 21:01:17 +01:00
first working version and more or less well-documented
This commit is contained in:
37
CMakeLists.txt
Normal file
37
CMakeLists.txt
Normal file
@@ -0,0 +1,37 @@
|
||||
# ----------------------------------------------------------------------------
|
||||
# Root CMake file for nanoflann
|
||||
#
|
||||
# 2011 - Jose Luis Blanco
|
||||
# ----------------------------------------------------------------------------
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
|
||||
PROJECT(nanoflann)
|
||||
|
||||
# --------------------------------------------------------------
|
||||
# Indicate CMake 2.7 and above that we don't want to mix relative
|
||||
# and absolute paths in lib lists. Run "cmake --help-policy CMP0003" for info
|
||||
# --------------------------------------------------------------
|
||||
if(COMMAND cmake_policy)
|
||||
cmake_policy(SET CMP0003 NEW)
|
||||
endif(COMMAND cmake_policy)
|
||||
|
||||
SET( EXECUTABLE_OUTPUT_PATH ${nanoflann_BINARY_DIR}/bin CACHE PATH "Output directory for programs" )
|
||||
|
||||
|
||||
# Compiler options:
|
||||
IF(CMAKE_COMPILER_IS_GNUCXX)
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -mtune=native ")
|
||||
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
|
||||
|
||||
|
||||
|
||||
# Include dir:
|
||||
INCLUDE_DIRECTORIES(${nanoflann_SOURCE_DIR}/include)
|
||||
|
||||
# Examples
|
||||
add_subdirectory(examples)
|
||||
|
||||
# Tests
|
||||
#add_subdirectory(tests)
|
||||
|
||||
|
||||
BIN
doc/logo.png
Normal file
BIN
doc/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.2 KiB |
4
examples/CMakeLists.txt
Normal file
4
examples/CMakeLists.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
|
||||
# example: "pointcloud_example"
|
||||
ADD_EXECUTABLE(pointcloud_example pointcloud_example.cpp)
|
||||
|
||||
141
examples/pointcloud_example.cpp
Normal file
141
examples/pointcloud_example.cpp
Normal file
@@ -0,0 +1,141 @@
|
||||
/***********************************************************************
|
||||
* Software License Agreement (BSD License)
|
||||
*
|
||||
* Copyright 2011 Jose Luis Blanco (joseluisblancoc@gmail.com).
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*************************************************************************/
|
||||
|
||||
#include <nanoflann.hpp>
|
||||
|
||||
#include <cstdlib>
|
||||
#include <iostream>
|
||||
|
||||
using namespace std;
|
||||
using namespace nanoflann;
|
||||
|
||||
// This is an exampleof a custom data set class
|
||||
template <typename T>
|
||||
struct PointCloud
|
||||
{
|
||||
struct Point
|
||||
{
|
||||
T x,y,z;
|
||||
};
|
||||
|
||||
std::vector<Point> pts;
|
||||
|
||||
typedef PointCloud Derived; //!< In this case the dataset class is myself.
|
||||
|
||||
/// CRTP helper method
|
||||
inline const Derived& derived() const { return *static_cast<const Derived*>(this); }
|
||||
/// CRTP helper method
|
||||
inline Derived& derived() { return *static_cast<Derived*>(this); }
|
||||
|
||||
// Must return the number of data points
|
||||
inline size_t kdtree_get_point_count() const { return pts.size(); }
|
||||
|
||||
// Returns the distance between the vector "p1[0:size-1]" and the data point with index "idx_p2" stored in the class:
|
||||
inline float kdtree_distance(const float *p1, const size_t idx_p2,size_t size) const
|
||||
{
|
||||
float d0=p1[0]-pts[idx_p2].x;
|
||||
float d1=p1[1]-pts[idx_p2].y;
|
||||
float d2=p1[2]-pts[idx_p2].z;
|
||||
return d0*d0+d1*d1+d2*d2;
|
||||
}
|
||||
|
||||
// Returns the dim'th component of the idx'th point in the class:
|
||||
// Since this is inlined and the "dim" argument is typically an immediate value, the
|
||||
// "if/else's" are actually solved at compile time.
|
||||
inline float kdtree_get_pt(const size_t idx, int dim) const
|
||||
{
|
||||
if (dim==0) return pts[idx].x;
|
||||
else if (dim==1) return pts[idx].y;
|
||||
else return pts[idx].z;
|
||||
}
|
||||
|
||||
// Optional bounding-box computation: return false to default to a standard bbox computation loop.
|
||||
// Return true if the BBOX was already computed by the class and returned in "bb" so it can be avoided to redo it again.
|
||||
// Look at bb.size() to find out the expected dimensionality (e.g. 2 or 3 for point clouds)
|
||||
template <class BBOX>
|
||||
bool kdtree_get_bbox(BBOX &bb) const { return false; }
|
||||
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
void generateRandomPointCloud(PointCloud<T> &point, const size_t N, const T max_range = 10)
|
||||
{
|
||||
std::cout << "Generating "<< N << " point cloud...";
|
||||
point.pts.resize(N);
|
||||
for (size_t i=0;i<N;i++)
|
||||
{
|
||||
point.pts[i].x = max_range * (rand() % 1000) / T(1000);
|
||||
point.pts[i].y = max_range * (rand() % 1000) / T(1000);
|
||||
point.pts[i].z = max_range * (rand() % 1000) / T(1000);
|
||||
}
|
||||
|
||||
std::cout << "done\n";
|
||||
}
|
||||
|
||||
template <typename num_t>
|
||||
void perf_test(const size_t N)
|
||||
{
|
||||
PointCloud<num_t> cloud;
|
||||
|
||||
// Generate points:
|
||||
generateRandomPointCloud(cloud, N);
|
||||
|
||||
num_t query_pt[3] = { 0.5, 0.5, 0.5};
|
||||
|
||||
|
||||
// construct an randomized kd-tree index using 4 kd-trees
|
||||
typedef KDTreeSingleIndexAdaptor<
|
||||
L2_Simple_Adaptor<num_t, PointCloud<num_t> > ,
|
||||
PointCloud<num_t>,
|
||||
3 /* dim */
|
||||
> my_kd_tree_t;
|
||||
|
||||
my_kd_tree_t index(3 /*dim*/, cloud, KDTreeSingleIndexAdaptorParams(10 /* max leaf */) );
|
||||
index.buildIndex();
|
||||
|
||||
// do a knn search
|
||||
const size_t num_results = 1;
|
||||
int ret_index;
|
||||
num_t out_dist_sqr;
|
||||
nanoflann::KNNResultSet<num_t> resultSet(num_results);
|
||||
resultSet.init(&ret_index, &out_dist_sqr );
|
||||
index.findNeighbors(resultSet, &query_pt[0], nanoflann::SearchParams(10));
|
||||
//index.knnSearch(query, indices, dists, num_results, mrpt_flann::SearchParams(10));
|
||||
|
||||
std::cout << "knnSearch(nn="<<num_results<<"): \n";
|
||||
std::cout << "ret_index=" << ret_index << " out_dist_sqr=" << out_dist_sqr << endl;
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
perf_test<float>(1e5);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
1134
include/nanoflann.hpp
Normal file
1134
include/nanoflann.hpp
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user