# namespace geom

## Overview

Set of structures for geometry and linear algebra. More…

    namespace geom {

    // namespaces

    namespace geom::quadrics;

    // typedefs

    typedef Line<2> Line2;
    typedef Line<3> Line3;
    typedef Ray<2> Ray2;
    typedef Ray<3> Ray3;
    typedef TSphere<2, float> Circle;
    typedef TSphere<3, float> Sphere;
    typedef TRect<float> Rect;
    typedef TRect<int> IRect;
    typedef TRect<unsigned> URect;
    typedef TAabb<2, float> Aabb2;
    typedef TAabb<3, float> Aabb3;

    // enums

    enum Axis;

    // structs

    struct Capsule;
    struct CollisionResult;
    struct ConicalCapsule;
    struct Graph;
    struct HalfPlane;

    template <size_t N>
    struct Line;

    template <size_t N>
    struct LineSegment;

    struct LineSegment2;
    struct LineSegment3;
    struct Plane;

    template <size_t N>
    struct Ray;

    template <int dimensions, typename Type>
    struct TAabb;

    template <typename T>
    struct TRect;

    template <int N, typename T>
    struct TSphere;

    template <size_t D>
    struct TTriangle;

    struct Triangle2;
    struct Triangle3;

    // classes

    class KDop;
    class KDop13;
    class KDop3;
    class KDop4;
    class KDop7;
    class KalmanFilterObject;
    class UvSphereGenerator;

    // global variables

    static const glm::vec3 Vec3X = AxisToVec3(Axis::x);
    static const glm::vec3 Vec3Y = AxisToVec3(Axis::y);
    static const glm::vec3 Vec3Z = AxisToVec3(Axis::z);
    static const glm::vec4 Vec4X = AxisToVec4(Axis::x);
    static const glm::vec4 Vec4Y = AxisToVec4(Axis::y);
    static const glm::vec4 Vec4Z = AxisToVec4(Axis::z);
    static const std::vector<glm::vec3> KDOP_3_DIRECTIONS {     glm::vec3(1.0, 0.0, 0.0),     glm::vec3(0.0, 1.0, 0.0),     glm::vec3(0.0, 0.0, 1.0),   };
    static const std::vector<glm::vec3> KDOP_4_DIRECTIONS {     glm::vec3(1.0, 1.0, 1.0),     glm::vec3(1.0, 1.0, -1.0),     glm::vec3(1.0, -1.0, 1.0),     glm::vec3(1.0, -1.0, -1.0)   };
    static const std::vector<glm::vec3> KDOP_7_DIRECTIONS {     glm::vec3(1.0, 0.0, 0.0),     glm::vec3(0.0, 1.0, 0.0),     glm::vec3(0.0, 0.0, 1.0),      glm::vec3(1.0, 1.0, 1.0),     glm::vec3(1.0, 1.0, -1.0),     glm::vec3(1.0, -1.0, 1.0),     glm::vec3(1.0, -1.0, -1.0)   };
    static const std::vector<glm::vec3> KDOP_13_DIRECTIONS {     glm::vec3(1.0, 0.0, 0.0),     glm::vec3(0.0, 1.0, 0.0),     glm::vec3(0.0, 0.0, 1.0),      glm::vec3(1.0, 1.0, 1.0),     glm::vec3(1.0, 1.0, -1.0),     glm::vec3(1.0, -1.0, 1.0),     glm::vec3(1.0, -1.0, -1.0),      glm::vec3(0.0, 1.0, 1.0),     glm::vec3(0.0, 1.0, -1.0),     glm::vec3(1.0, 0.0, 1.0),     glm::vec3(1.0, 0.0, -1.0),     glm::vec3(1.0, 1.0, 0.0),     glm::vec3(1.0, -1.0, 0.0),   };

    // global functions

    static glm::vec3 AxisToVec3(const geom::Axis axis);
    static glm::vec4 AxisToVec4(const geom::Axis axis);
    GEOM_API Aabb3 GetAabb(const std::vector<glm::vec3>& points);
    GEOM_API Aabb3 GetAabb(const ConicalCapsule& conical_capsule);
    GEOM_API Line3 ToLine(const LineSegment3& segment);
    GEOM_API Plane ToPlane(const HalfPlane& halfplane);
    GEOM_API Plane ToPlane(const Triangle3& triangle);
    GEOM_API void CalculatePCA(const std::vector<glm::vec3>& vertices, std::vector<glm::vec3>& principalComponents, glm::vec3& pointCloudCenter);
    GEOM_API void GetTangentPlanePCA(const std::vector<glm::vec3>& points, glm::vec3& nn, glm::vec3& ev_1, glm::vec3& ev_2, glm::vec3& ev_3);
    GEOM_API void PlaneProjectionUsingPCA(const std::vector<glm::vec3>& points, std::vector<float>& pointsInPlane, std::vector<float>& vec1, std::vector<float>& vec2);
    GEOM_API glm::vec3 ProjectPointIntoPlane(const glm::vec3& q, const glm::vec3& o, const glm::vec3& n);
    GEOM_API glm::vec2 Space2Plane(const glm::vec3& q, const glm::vec3& o, const glm::vec3& e1, const glm::vec3& e2);
    GEOM_API glm::vec3 Plane2Space(const glm::vec2& q, const glm::vec3& o, const glm::vec3& e1, const glm::vec3& e2);
    GEOM_API float DeterminantInPlane(const glm::vec3& vVector1, const glm::vec3& vVector2, const glm::vec3& vVector3);

    template <typename T>
    void InflateRectangle(geom::TRect<T>& rect, const T margin);

    template <typename T>
    void DeflateRectangle(geom::TRect<T>& rect, const T margin);

    GEOM_API Plane FitPlane(const std::vector<glm::vec3>& points);
    GEOM_API glm::vec3 GetCentroid(const std::vector<glm::vec3>& points);
    GEOM_API float GetProjectionParameter(const glm::vec3& point, const geom::LineSegment3& line_segment);
    GEOM_API float GetProjectionParameterClamped(const glm::vec3& point, const geom::LineSegment3& line_segment);
    GEOM_API float GetOrientedDistance(const glm::vec3& point, const Plane& plane);
    GEOM_API float GetDistance(const glm::vec3& point, const geom::LineSegment3& line);
    GEOM_API float GetDistance(const glm::vec3& point, const Plane& plane);
    GEOM_API float GetDistance(const glm::vec3& point, const geom::Line3& line);
    GEOM_API float GetDistance(const glm::vec3& point, const ConicalCapsule& conical_capsuile);
    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const Plane& plane);
    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const LineSegment3& line_segment);
    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const Line3& line);
    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const ConicalCapsule& capsule);
    GEOM_API std::optional<glm::vec2> GetIntersection(const geom::Line2& line1, const geom::Line2& line2);
    GEOM_API bool GetIntersection(const geom::Line2& line1, const geom::Line2& line2, glm::vec2* out_intersection_point);
    GEOM_API bool GetIntersection(const geom::Line3& line, const geom::Plane& plane, glm::vec3* out_intersection_point);
    GEOM_API bool GetIntersection(const geom::LineSegment3& linesegment, const geom::Plane& plane, glm::vec3* out_intersection_point);
    GEOM_API bool GetIntersection(const geom::Line3& line, const geom::HalfPlane& half_plane, glm::vec3* out_intersection_point);
    GEOM_API bool GetIntersection(const geom::LineSegment3& linesegment, const geom::HalfPlane& half_plane, glm::vec3* out_intersection_point);
    GEOM_API bool GetIntersection(const geom::Triangle3& triangle, const geom::HalfPlane& halfplane, geom::LineSegment3* out_intersection = nullptr);
    GEOM_API bool GetIntersection(const geom::Line3& line, const geom::Aabb3& aabb);
    GEOM_API glm::vec3 Barycentric(const glm::vec3& p, const Triangle3& triangle);
    GEOM_API CollisionResult GetCollision(const geom::Capsule& capsule_1, const geom::Capsule& capsule_2);
    GEOM_API bool IsTriangleFacingToPoint(const glm::vec3& point, const geom::Triangle3& triangle);
    GEOM_API void DijkstraAlgorithm(const Graph& graph, const unsigned int start_vertex, std::vector<float>& distances, std::vector<unsigned int>& previous);
    GEOM_API void DijkstraAlgorithm(const Graph& graph, const unsigned start_vertex, const std::vector<float>& vertex_weights, std::vector<float>& out_distances, std::vector<unsigned int>& out_previous);
    GEOM_API float GetTriangleVolume(const glm::vec2& a, const glm::vec2& b, const glm::vec2& c);
    GEOM_API float GetTriangleVolume(const glm::vec3& a, const glm::vec3& b, const glm::vec3& c);
    GEOM_API glm::vec3 GetTriangleNormalCW(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2);
    GEOM_API glm::vec3 GetTriangleNormalCCW(glm::vec3 p0, glm::vec3 p1, glm::vec3 p2);
    GEOM_API bool LineTriangleIntersection(const geom::Triangle3 triangle, const geom::Line3& line, glm::vec3& out_intersection);
    GEOM_API glm::vec3 GetCentroid(std::vector<float>& vertices);
    GEOM_API glm::vec3 GetVertexLowestY(std::vector<float>& vertices);

    } // namespace geom

## Detailed Documentation

Set of structures for geometry and linear algebra.

### Typedefs

    typedef Line<2> Line2

Definition of a line in a 2 dimensional space.

    typedef Line<3> Line3

Definition of a line in a 3 dimensional space.

    typedef Ray<2> Ray2

Definition of a ray in a 2 dimensional space.

    typedef Ray<3> Ray3

Definition of a ray in a 3 dimensional space.

    typedef TSphere<2, float> Circle

Definition of a float type circle.

    typedef TSphere<3, float> Sphere

Definition of a float type sphere.

    typedef TRect<float> Rect

Definition of a float type rectangle.

    typedef TRect<int> IRect

Definition of an integer type rectangle.

    typedef TRect<unsigned> URect

Definition of an unsigned integer type rectangle.

    typedef TAabb<2, float> Aabb2

Two dimensional axis aligned bounding box.

    typedef TAabb<3, float> Aabb3

Three dimensional axis aligned bounding box.

### Global Variables

    static const glm::vec3 Vec3X = AxisToVec3(Axis::x)

Definition of a unit 3D vector in X axis.

    static const glm::vec3 Vec3Y = AxisToVec3(Axis::y)

Definition of a unit 3D vector in Y axis.

    static const glm::vec3 Vec3Z = AxisToVec3(Axis::z)

Definition of a unit 3D vector in Z axis.

    static const glm::vec4 Vec4X = AxisToVec4(Axis::x)

Definition of a unit 4D vector in X axis.

    static const glm::vec4 Vec4Y = AxisToVec4(Axis::y)

Definition of a unit 4D vector in Y axis.

    static const glm::vec4 Vec4Z = AxisToVec4(Axis::z)

Definition of a unit 4D vector in Z axis.

    static const std::vector<glm::vec3> KDOP_3_DIRECTIONS {     glm::vec3(1.0, 0.0, 0.0),     glm::vec3(0.0, 1.0, 0.0),     glm::vec3(0.0, 0.0, 1.0),   }

Directions that define default KDOP_3.

    static const std::vector<glm::vec3> KDOP_4_DIRECTIONS {     glm::vec3(1.0, 1.0, 1.0),     glm::vec3(1.0, 1.0, -1.0),     glm::vec3(1.0, -1.0, 1.0),     glm::vec3(1.0, -1.0, -1.0)   }

Directions that define default KDOP_4.

    static const std::vector<glm::vec3> KDOP_7_DIRECTIONS {     glm::vec3(1.0, 0.0, 0.0),     glm::vec3(0.0, 1.0, 0.0),     glm::vec3(0.0, 0.0, 1.0),      glm::vec3(1.0, 1.0, 1.0),     glm::vec3(1.0, 1.0, -1.0),     glm::vec3(1.0, -1.0, 1.0),     glm::vec3(1.0, -1.0, -1.0)   }

Directions that define default KDOP_7.

    static const std::vector<glm::vec3> KDOP_13_DIRECTIONS {     glm::vec3(1.0, 0.0, 0.0),     glm::vec3(0.0, 1.0, 0.0),     glm::vec3(0.0, 0.0, 1.0),      glm::vec3(1.0, 1.0, 1.0),     glm::vec3(1.0, 1.0, -1.0),     glm::vec3(1.0, -1.0, 1.0),     glm::vec3(1.0, -1.0, -1.0),      glm::vec3(0.0, 1.0, 1.0),     glm::vec3(0.0, 1.0, -1.0),     glm::vec3(1.0, 0.0, 1.0),     glm::vec3(1.0, 0.0, -1.0),     glm::vec3(1.0, 1.0, 0.0),     glm::vec3(1.0, -1.0, 0.0),   }

Directions that define default KDOP_13.

### Global Functions

    static glm::vec3 AxisToVec3(const geom::Axis axis)

Converts an Axis to the glm::vec3.

    static glm::vec4 AxisToVec4(const geom::Axis axis)

Converts an Axis to the glm::vec4. Homogenic (w) coordinate is zero.

    GEOM_API Aabb3 GetAabb(const std::vector<glm::vec3>& points)

Get Aabb3 that covers every point in the point set.

    GEOM_API Aabb3 GetAabb(const ConicalCapsule& conical_capsule)

Get Aabb3 that covers the entire ConicalCapsule.

    GEOM_API Line3 ToLine(const LineSegment3& segment)

Convert 3D LineSegment object to 3D Line.

    GEOM_API Plane ToPlane(const HalfPlane& halfplane)

Convert HalfPlane object to Plane.

    GEOM_API Plane ToPlane(const Triangle3& triangle)

Convert 3D Triangle primitive to Plane.

    template <typename T>
    void InflateRectangle(geom::TRect<T>& rect, const T margin)

Inflate each side of the rectangle by specified margin.

    template <typename T>
    void DeflateRectangle(geom::TRect<T>& rect, const T margin)

Deflate each side of the rectangle by specified margin.

    GEOM_API Plane FitPlane(const std::vector<glm::vec3>& points)

Fit a 3D plane to the point set.

    GEOM_API glm::vec3 GetCentroid(const std::vector<glm::vec3>& points)

Calculate mean point of the point set.

    GEOM_API float GetProjectionParameter(const glm::vec3& point, const geom::LineSegment3& line_segment)

Calculate interpolation parameter of point projection onto the line segment.

Resulting parameter of value 0 tells the projection lays on segment line point1, and value 1 tells the projection lays on segment line point2. Anything between 0 and 1 tells the point projection lays directly on line segment

Returns:

Parameter value between -inf and inf.

    GEOM_API float GetProjectionParameterClamped(const glm::vec3& point, const geom::LineSegment3& line_segment)

Calculate interpolation parameter of point projection onto the line segment.

Resulting parameter of value 0 tells the projection lays on segment line point1, and value 1 tells the projection lays on segment line point2. Anything between 0 and 1 tells the point projection lays directly on line segment

Returns:

Parameter value between 0 and 1.

    GEOM_API float GetOrientedDistance(const glm::vec3& point, const Plane& plane)

Calculates the oriented distance of point to a plane. The value is positive if the point lies in the half-space pointed to by the plane normal.

    GEOM_API float GetDistance(const glm::vec3& point, const geom::LineSegment3& line)

Calculates a distance of the point to the 3D line segment.

    GEOM_API float GetDistance(const glm::vec3& point, const Plane& plane)

Calculate the distance of the point from the plane.

    GEOM_API float GetDistance(const glm::vec3& point, const geom::Line3& line)

Calculate the distance of the point from the 3D line.

    GEOM_API float GetDistance(const glm::vec3& point, const ConicalCapsule& conical_capsuile)

Calculate distance of point to the capsule surface.

Returns:

Negative distance when point is inside capsule, zero when it is on surface and positive value otherwise.

    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const Plane& plane)

Calculate projection of point onto a plane.

    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const LineSegment3& line_segment)

Calculate projection of point onto a line segment in 3D.

    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const Line3& line)

Calculate projection of point onto a line in 3D.

    GEOM_API glm::vec3 GetProjection(const glm::vec3& point, const ConicalCapsule& capsule)

Calculate projection of point onto a ConicalCapsule.

    GEOM_API std::optional<glm::vec2> GetIntersection(const geom::Line2& line1, const geom::Line2& line2)

Get intersection point between two 2D planes.