HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
Data Structures | Public Types | Public Member Functions | Data Fields | Friends
hi::v1::bezier_curve Struct Reference

#include <hikogui/graphic_path/bezier_curve.hpp>

Data Structures

struct  sdf_distance_result
 

Public Types

enum class  Type : uint8_t { None , Linear , Quadratic , Cubic }
 

Public Member Functions

 bezier_curve (bezier_curve const &other) noexcept=default
 
 bezier_curve (bezier_curve &&other) noexcept=default
 
bezier_curveoperator= (bezier_curve const &other) noexcept=default
 
bezier_curveoperator= (bezier_curve &&other) noexcept=default
 
 bezier_curve (point2 const P1, point2 const P2) noexcept
 
 bezier_curve (point2 const P1, point2 const C1, point2 const P2) noexcept
 
 bezier_curve (point2 const P1, point2 const C1, point2 const C2, point2 const P2) noexcept
 
 bezier_curve (Type const type, point2 const P1, point2 const C1, point2 const C2, point2 const P2) noexcept
 
point2 pointAt (float const t) const noexcept
 
constexpr vector2 tangentAt (float const t) const noexcept
 
lean_vector< float > solveXByY (float const y) const noexcept
 
hi_force_inline lean_vector< float > solveTForNormalsIntersectingPoint (point2 P) const noexcept
 
sdf_distance_result sdf_distance (point2 P) const noexcept
 Find the distance from the point to the curve.
 
std::pair< bezier_curve, bezier_curvecubicSplit (float const t) const noexcept
 
std::pair< bezier_curve, bezier_curvequadraticSplit (float const t) const noexcept
 
std::pair< bezier_curve, bezier_curvelinearSplit (float const t) const noexcept
 
std::pair< bezier_curve, bezier_curvesplit (float const t) const noexcept
 
void subdivideUntilFlat_impl (std::vector< bezier_curve > &r, float const minimumFlatness) const noexcept
 
std::vector< bezier_curvesubdivideUntilFlat (float const tolerance) const noexcept
 
float flatness () const noexcept
 
bezier_curve toParallelLine (float const offset) const noexcept
 

Data Fields

Type type
 
point2 P1
 First point.
 
point2 C1
 Control point.
 
point2 C2
 Control point.
 
point2 P2
 Last point.
 

Friends

bool operator== (bezier_curve const &lhs, bezier_curve const &rhs) noexcept
 
bezier_curve operator* (transformer2 auto const &lhs, bezier_curve const &rhs) noexcept
 
bezier_curve operator~ (bezier_curve const &rhs) noexcept
 

Detailed Description

Bezier Curve A linear, quadratic or cubic bezier curve.

Constructor & Destructor Documentation

◆ bezier_curve() [1/4]

hi::v1::bezier_curve::bezier_curve ( point2 const P1,
point2 const P2 )
inlinenoexcept

Construct a linear bezier-curve.

◆ bezier_curve() [2/4]

hi::v1::bezier_curve::bezier_curve ( point2 const P1,
point2 const C1,
point2 const P2 )
inlinenoexcept

Construct a quadratic bezier-curve.

◆ bezier_curve() [3/4]

hi::v1::bezier_curve::bezier_curve ( point2 const P1,
point2 const C1,
point2 const C2,
point2 const P2 )
inlinenoexcept

Construct a cubic bezier-curve.

◆ bezier_curve() [4/4]

hi::v1::bezier_curve::bezier_curve ( Type const type,
point2 const P1,
point2 const C1,
point2 const C2,
point2 const P2 )
inlinenoexcept

Construct a bezier-curve of any type.

Member Function Documentation

◆ cubicSplit()

std::pair< bezier_curve, bezier_curve > hi::v1::bezier_curve::cubicSplit ( float const t) const
inlinenoexcept

Split a cubic bezier-curve into two cubic bezier-curve.

Parameters
ta relative distance between 0.0 (point P1) and 1.0 (point P2) where to split the curve.
Returns
two cubic bezier-curves.

◆ flatness()

float hi::v1::bezier_curve::flatness ( ) const
inlinenoexcept

Return the flatness of a curve.

Returns
1.0 when completely flat, < 1.0 when curved.

◆ linearSplit()

std::pair< bezier_curve, bezier_curve > hi::v1::bezier_curve::linearSplit ( float const t) const
inlinenoexcept

Split a linear bezier-curve into two linear bezier-curve.

Parameters
ta relative distance between 0.0 (point P1) and 1.0 (point P2) where to split the curve.
Returns
two linear bezier-curves.

◆ pointAt()

point2 hi::v1::bezier_curve::pointAt ( float const t) const
inlinenoexcept

Return a point on the bezier-curve. Values of t beyond 0.0 and 1.0 will find a point extrapolated beyond the bezier segment.

Parameters
ta relative distance between 0.0 (point P1) and 1.0 (point P2).
Returns
the coordinates of the point on the curve.

◆ quadraticSplit()

std::pair< bezier_curve, bezier_curve > hi::v1::bezier_curve::quadraticSplit ( float const t) const
inlinenoexcept

Split a quadratic bezier-curve into two quadratic bezier-curve.

Parameters
ta relative distance between 0.0 (point P1) and 1.0 (point P2) where to split the curve.
Returns
two quadratic bezier-curves.

◆ sdf_distance()

sdf_distance_result hi::v1::bezier_curve::sdf_distance ( point2 P) const
inlinenoexcept

Find the distance from the point to the curve.

If the distances are equal between two curves, take the one with a maximum orthognality. If the orthogonality >= then the point is inside that edge.

Parameters
PThe point from which to calculate the distance to this curve.
Returns
squared distance from curve, orthogonality.

◆ solveXByY()

lean_vector< float > hi::v1::bezier_curve::solveXByY ( float const y) const
inlinenoexcept

Return the x values where the curve crosses the y-axis.

Parameters
yy-axis.
Returns
0 to 3, or infinite number of x values.

◆ split()

std::pair< bezier_curve, bezier_curve > hi::v1::bezier_curve::split ( float const t) const
inlinenoexcept

Split a bezier-curve into two bezier-curve of the same type.

Parameters
ta relative distance between 0.0 (point P1) and 1.0 (point P2) where to split the curve.
Returns
two bezier-curves.

◆ subdivideUntilFlat()

std::vector< bezier_curve > hi::v1::bezier_curve::subdivideUntilFlat ( float const tolerance) const
inlinenoexcept

Subdivide a bezier-curve until each are flat enough.

Parameters
tolerancemaximum amount of curviness.
Returns
resulting list of curve segments.

◆ subdivideUntilFlat_impl()

void hi::v1::bezier_curve::subdivideUntilFlat_impl ( std::vector< bezier_curve > & r,
float const minimumFlatness ) const
inlinenoexcept

Subdivide a bezier-curve until each are flat enough.

Parameters
rresulting list of linear segments.
minimumFlatnessminimum amount of flatness of the resulting curve segments.

◆ tangentAt()

constexpr vector2 hi::v1::bezier_curve::tangentAt ( float const t) const
inlineconstexprnoexcept

Return a tangent on the bezier-curve. Values of t beyond 0.0 and 1.0 will find a point extrapolated beyond the bezier segment.

Parameters
ta relative distance between 0.0 (point P1) and 1.0 (point P2).
Returns
the tangent-vector at point t on the curve

◆ toParallelLine()

bezier_curve hi::v1::bezier_curve::toParallelLine ( float const offset) const
inlinenoexcept

Return a line-segment from a curve at a certain distance.

Parameters
offsetpositive means the parallel line will be on the starboard of the curve.
Returns
line segment offset from the curve.

Friends And Related Symbol Documentation

◆ operator~

bezier_curve operator~ ( bezier_curve const & rhs)
friend

Reverse direction of a curve.

Field Documentation

◆ C1

point2 hi::v1::bezier_curve::C1

Control point.

◆ C2

point2 hi::v1::bezier_curve::C2

Control point.

◆ P1

point2 hi::v1::bezier_curve::P1

First point.

◆ P2

point2 hi::v1::bezier_curve::P2

Last point.


The documentation for this struct was generated from the following file: