# class cogs::Octree

## Overview

Space-partitioning data structure for point clouds. More…

    #include <Octree.h>

    class Octree {
    public:
        // fields

        static const uint8_t POINTS_THRESHOLD = 64;

        // construction

        Octree();
        Octree(const cogs::PointCloud& cloud);
        Octree(const std::vector<glm::vec3>& positions);
        ~Octree();

        // methods

        void Include(const cogs::PointCloud& cloud);
        void Include(const std::vector<const cogs::PointCloud*>& clouds);
        std::string ToString() const;
        size_t GetNodeCount() const;
        std::vector<geom::Aabb3> GetNodeCubes() const;
        bool HasPointIn(const glm::vec3& location, float_t radius) const;
        bool HasPointIn(const geom::Aabb3& search_range) const;
        std::vector<uint32_t> Find(const glm::vec3& location, float_t radius) const;
        std::vector<uint32_t> Find(const geom::Aabb3& search_range) const;
        int32_t GetIntersectedPoint(const geom::Ray3& ray, std::optional<float> tolerance = std::nullopt) const;
    };

## Detailed Documentation

Space-partitioning data structure for point clouds.

### Fields

    static const uint8_t POINTS_THRESHOLD = 64

When an octree node contains this number of points or less, it does not subdivide further.

### Construction

    Octree()

Default constructor.

    Octree(const cogs::PointCloud& cloud)

Constructs Octree over the given cloud.

Parameters:

cloud | Octree will be constructed over points of this cloud.

    Octree(const std::vector<glm::vec3>& positions)

Constructs Octree over the given vector of points.

Parameters:

positions | Octree will be constructed over these points.

    ~Octree()

Octree destructor.

### Methods

    void Include(const cogs::PointCloud& cloud)

Adds points of the input cloud into the Octree.

Parameters:

positions | Points of this cloud will be included in the octree.

    void Include(const std::vector<const cogs::PointCloud*>& clouds)

Adds points of input clouds into the Octree.

Parameters:

positions | Points from all the clouds in this vector will be included in the octree.

    std::string ToString() const

Get the string representation of this octree.

Returns:

String representation of this octree.

    size_t GetNodeCount() const

Get the number of nodes in the octree.

Returns:

Node count.

    std::vector<geom::Aabb3> GetNodeCubes() const

Returns the vector of bounding boxes of all internal nodes.

Returns:

Vector of bounding boxes.

    bool HasPointIn(const glm::vec3& location, float_t radius) const

Whether any of the points exist in the range from the given location.

Parameters:

location | Location in the world around which will be searched.
radius | Radius range of the search area.

Returns:

True if any point is in range, false otherwise.

    bool HasPointIn(const geom::Aabb3& search_range) const

Whether any of the points exist inside the input AABB.

Parameters:

search_range | Area of this axis aligned box will be searched for points.

Returns:

True if any point is included in the input AABB, false otherwise.

    std::vector<uint32_t> Find(const glm::vec3& location, float_t radius) const

Get indices of points in the radius from the given location.

Parameters:

location | Location in the world around which will be searched.
radius | Radius range of the search area.

Returns:

Vector of point indices in the area.

    std::vector<uint32_t> Find(const geom::Aabb3& search_range) const

Get indices of points that are inside the input AABB.

Parameters:

search_range | Area of this axis aligned box will be searched for points.

Returns:

Vector of point indices inside the input AABB.

    int32_t GetIntersectedPoint(const geom::Ray3& ray, std::optional<float> tolerance = std::nullopt) const

Check whether the input ray hits any of the points and if yes, returns the one closest to the origin.

Parameters:

ray | Ray casted in the world.
tolerance | Maximal distance between point and ray in order to intersect it. When set tu nullopt, automatic value is used.

Returns:

Index of the intersected point closest to the origin of the ray, -1 otherwise.