Skip to content

Commit

Permalink
Add rknnSearch() method
Browse files Browse the repository at this point in the history
  • Loading branch information
jlblancoc committed Nov 27, 2023
1 parent 2b090a8 commit 7c7b9e1
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 7 deletions.
6 changes: 5 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
nanoflann 1.5.1: UNRELEASED
* **API changes:**
- Add new search method `rknnSearch()` for knn searches with a maximum radius.
- Add missing `SearchParameters` argument to `KDTreeSingleIndexDynamicAdaptor_::knnSearch()` ([PR#213](https://github.com/jlblancoc/nanoflann/pull/213) by [ManosPapadakis95](https://github.com/ManosPapadakis95)).
- Add missing method `KNNResultSet::empty()` for consistency with the other result sets.
* **Other changes**:
- Add examples: `nanoflann_gui_example_R3_knn` and `nanoflann_gui_example_R3_radius`
- Add GUI examples for each search type:
- `nanoflann_gui_example_R3_knn`
- `nanoflann_gui_example_R3_radius`
- `nanoflann_gui_example_R3_rknn`


nanoflann 1.5.0: Released Jun 16, 2023
Expand Down
5 changes: 5 additions & 0 deletions examples/examples_gui/nanoflann_gui_example_R3/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,25 @@ find_package(mrpt-gui REQUIRED)

add_executable(${PROJECT_NAME}_radius ${PROJECT_NAME}.cpp)
add_executable(${PROJECT_NAME}_knn ${PROJECT_NAME}.cpp)
add_executable(${PROJECT_NAME}_rknn ${PROJECT_NAME}.cpp)

target_compile_definitions(${PROJECT_NAME}_radius PRIVATE USE_RADIUS_SEARCH)
target_compile_definitions(${PROJECT_NAME}_knn PRIVATE USE_KNN_SEARCH)
target_compile_definitions(${PROJECT_NAME}_rknn PRIVATE USE_RKNN_SEARCH)

# optimized build:
if (CMAKE_COMPILER_IS_GNUCXX)
target_compile_options(${PROJECT_NAME}_radius PRIVATE -O2 -mtune=native)
target_compile_options(${PROJECT_NAME}_knn PRIVATE -O2 -mtune=native)
target_compile_options(${PROJECT_NAME}_rknn PRIVATE -O2 -mtune=native)
endif()

# Make sure the include path is used:
target_link_libraries(${PROJECT_NAME}_radius nanoflann::nanoflann mrpt::gui)
target_link_libraries(${PROJECT_NAME}_knn nanoflann::nanoflann mrpt::gui)
target_link_libraries(${PROJECT_NAME}_rknn nanoflann::nanoflann mrpt::gui)

# for this example to find "../utils.h"
target_include_directories(${PROJECT_NAME}_radius PRIVATE ".")
target_include_directories(${PROJECT_NAME}_knn PRIVATE ".")
target_include_directories(${PROJECT_NAME}_rknn PRIVATE ".")
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ void kdtree_demo(const size_t N)
glFoundPts->setColor_u8(0x00, 0x00, 0xff, 0x80);
scene->insert(glFoundPts);

#if defined(USE_RADIUS_SEARCH)
#if defined(USE_RADIUS_SEARCH) || defined(USE_RKNN_SEARCH)
glQuerySphere->setColor_u8(0xe0, 0xe0, 0xe0, 0x30);
glQuerySphere->enableDrawSolid3D(true);
#else
Expand Down Expand Up @@ -108,21 +108,22 @@ void kdtree_demo(const size_t N)
// Declare here to avoid reallocations:
#if defined(USE_RADIUS_SEARCH)
std::vector<nanoflann::ResultItem<size_t, double>> indicesDists;
#elif defined(USE_KNN_SEARCH)
#elif defined(USE_KNN_SEARCH) || defined(USE_RKNN_SEARCH)
std::vector<size_t> indices;
std::vector<double> distances;
#else
#error Expected either KNN or radius search build flag!
#error Expected either KNN, radius, or RKNN search build flag!
#endif

// Loop: different searches until the window is closed:
while (win.isOpen())
{
// Unsorted radius search:
#if defined(USE_RADIUS_SEARCH)
#if defined(USE_RADIUS_SEARCH) || defined(USE_RKNN_SEARCH)
const double radius = rng.drawUniform(0.1, maxRangeXY * 0.5);
const double sqRadius = radius * radius;
#else
#endif
#if defined(USE_KNN_SEARCH) || defined(USE_RKNN_SEARCH)
const size_t nnToSearch = (rng.drawUniform32bit() % 10) + 1;
#endif
const double queryPt[3] = {
Expand All @@ -138,7 +139,16 @@ void kdtree_demo(const size_t N)
sqRadius, indicesDists);
index.findNeighbors(resultSet, queryPt);
#else

#if defined(USE_RKNN_SEARCH)
nanoflann::RKNNResultSet<double, size_t> resultSet(
nnToSearch, sqRadius);
#elif defined(USE_KNN_SEARCH)
nanoflann::KNNResultSet<double, size_t> resultSet(nnToSearch);
#else
#error Should not reach here!
#endif

indices.resize(nnToSearch);
distances.resize(nnToSearch);
resultSet.init(indices.data(), distances.data());
Expand Down Expand Up @@ -178,7 +188,7 @@ void kdtree_demo(const size_t N)
glQueryPt->insertPoint(queryPt[0], queryPt[1], queryPt[2]);

glQuerySphere->setLocation(queryPt[0], queryPt[1], queryPt[2]);
#if defined(USE_RADIUS_SEARCH)
#if defined(USE_RADIUS_SEARCH) || defined(USE_RKNN_SEARCH)
glQuerySphere->setRadius(radius);
#else
glQuerySphere->setRadius(worstDist);
Expand Down

0 comments on commit 7c7b9e1

Please sign in to comment.