first working version and more or less well-documented

This commit is contained in:
Jose-Luis Blanco-Claraco
2011-08-26 21:48:10 +00:00
parent 2de6eb25a6
commit 10d947793e
6 changed files with 2995 additions and 0 deletions

37
CMakeLists.txt Normal file
View 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)

1679
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

BIN
doc/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

4
examples/CMakeLists.txt Normal file
View File

@@ -0,0 +1,4 @@
# example: "pointcloud_example"
ADD_EXECUTABLE(pointcloud_example pointcloud_example.cpp)

View 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

File diff suppressed because it is too large Load Diff