1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
 * // Copyright (c) 2021 Feng Yang
 * //
 * // I am making my contributions/submissions to this project solely in my
 * // personal capacity and am not conveying any rights to any intellectual
 * // property of any third parties.
 */

use crate::vector3::Vector3D;
use std::sync::{RwLock, Arc};

/// Callback function for nearby search query. The first parameter is the
/// index of the nearby point, and the second is the position of the point.
pub trait ForEachNearbyPointFunc: FnMut(usize, &Vector3D) {}

impl<Super: FnMut(usize, &Vector3D)> ForEachNearbyPointFunc for Super {}

///
/// # Abstract base class for 3-D neighbor point searcher.
///
/// This class provides interface for 3-D neighbor point searcher. For given
/// list of points, the class builds internal cache to accelerate the search.
/// Once built, the data structure is used to search nearby points for given
/// origin point.
///
pub trait PointNeighborSearcher3 {
    /// Returns the type name of the derived class.
    fn type_name() -> String;

    /// Builds internal acceleration structure for given points list.
    fn build(&mut self, points: &Vec<Vector3D>);

    /// Invokes the callback function for each nearby point around the origin
    /// within given radius.
    /// - Parameters:
    ///   - origin: The origin position.
    ///   - radius: The search radius.
    ///   - callback: The callback function.
    fn for_each_nearby_point<Callback>(&self, origin: &Vector3D, radius: f64,
                                       callback: &mut Callback) where Callback: ForEachNearbyPointFunc;


    /// Returns true if there are any nearby points for given origin within radius.
    /// - Parameters:
    ///   - origin: The origin.
    ///   - radius: The radius.
    fn has_nearby_point(&self, origin: &Vector3D, radius: f64) -> bool;
}

/// Shared pointer for the PointNeighborSearcher3 type.
pub type PointNeighborSearcher3Ptr = Arc<RwLock<dyn PointNeighborSearcher3>>;

/// Abstract base class for 3-D point neighbor searcher builders.
pub trait PointNeighborSearcherBuilder3 {}

/// Shared pointer for the PointNeighborSearcherBuilder3 type.
pub type PointNeighborSearcherBuilder3Ptr = Arc<RwLock<dyn PointNeighborSearcherBuilder3>>;