67#include "Configuration.h"
70#include "common/Interval.h"
71#include "spat/Vector.h"
101 static dclspc std::unique_ptr<RoadwayTwist>
Make(
TwistType type )
noexcept;
104 static dclspc std::unique_ptr<RoadwayTwist>
Make(
TwistType type,
const RoadwayTwist& fromTwist )
noexcept;
111 virtual
TwistType GetTwistType() const noexcept = 0;
115 virtual
std::unique_ptr<RoadwayTwist>
Clone() const = 0;
144 virtual
bool ZeroFlip(
bool bActive ) noexcept = 0;
151 virtual
void Flip() noexcept = 0;
196 virtual
void Freeze(
bool bFreeze = true ) noexcept = 0;
204 virtual
bool IsNull() const noexcept = 0;
213 virtual
bool Equals( const RoadwayTwist& toTwist,
Angle epsilon_angle = epsilon__angle ) const noexcept = 0;
233 virtual ~RoadwayTwist() = default;
234 RoadwayTwist( RoadwayTwist&& ) = delete;
235 RoadwayTwist& operator=( const RoadwayTwist& ) = delete;
236 RoadwayTwist& operator=( RoadwayTwist&& ) = delete;
238 RoadwayTwist() = default;
239 RoadwayTwist( const RoadwayTwist& ) = default;
253 Angle epsilon_angle = epsilon__angle ) noexcept;
268 static dclspc std::unique_ptr<ConstantTwist>
Make() noexcept;
283 virtual const Data& GetData() const noexcept = 0;
285 virtual
void Create( const Data& data ) noexcept = 0;
296 static dclspc std::unique_ptr<LinearTwist>
Make(
const RoadwayTwist& fromTwist )
noexcept;
324 virtual const
Data& GetData() const noexcept = 0;
326 virtual
void Create( const
Data& data ) noexcept = 0;
338 static dclspc std::unique_ptr<PiecewiseTwist>
Make(
TwistType type,
const RoadwayTwist& fromTwist )
noexcept;
340 using SegmentValueType = std::pair<Length, Angle>;
341 using Data = std::vector<SegmentValueType>;
348 virtual void Add(
const std::pair<Length,Angle>& pair ) = 0;
357 virtual std::pair<Length,Angle>
Twist(
int idx )
const = 0;
359 virtual void Create(
const Data& data ) = 0;
361 virtual const Data& GetData() const noexcept = 0;
363 using RoadwayTwist::
Twist;
378 static dclspc std::unique_ptr<DirectionalTwist>
Make(
const RoadwayTwist& fromTwist )
noexcept;
405 virtual const Data& GetData() const noexcept = 0;
411 virtual
void Create( const Data& data ) = 0;
422 static dclspc std::unique_ptr<PiecewiseDirectionalTwist>
Make() noexcept;
449 virtual
void Create( const Data& data ) = 0;
455 virtual const Data& GetData() const noexcept = 0;
457 using RoadwayTwist::
Twist;
471 static dclspc std::unique_ptr<CombinedTwist>
Make() noexcept;
483 virtual RoadwayTwist& Twist1() const noexcept = 0;
485 virtual
std::unique_ptr<RoadwayTwist> DetachTwist1() = 0;
494 virtual RoadwayTwist& Twist2() const noexcept = 0;
496 virtual
std::unique_ptr<RoadwayTwist> DetachTwist2() = 0;
507 const
TwistType* FindTwist( const RoadwayTwist& twist ) noexcept{
508 if(
const auto* pTwist =
dynamic_cast<const TwistType*
>(&twist) )
511 if(
const auto* pCombinedTwist =
dynamic_cast<const CombinedTwist*
>(&twist) ){
512 if(
const auto* pTwist2 = FindTwist<const TwistType>(pCombinedTwist->Twist2()) )
514 else if(
const auto* pTwist1 = FindTwist<const TwistType>(pCombinedTwist->Twist1()) )
521 template<
class TwistType>
523 if(
auto pTwist =
dynamic_cast<TwistType*
>(&twist) )
526 if(
auto pCombinedTwist =
dynamic_cast<const CombinedTwist*
>(&twist) ){
527 if(
auto pTwist2 = FindTwist<TwistType>(pCombinedTwist->Twist2()) )
529 else if(
auto pTwist1 = FindTwist<TwistType>(pCombinedTwist->Twist1()) )
538 extern template dclspc
const ConstantTwist* FindTwist<ConstantTwist>(
const RoadwayTwist& twist )
noexcept;
539 extern template dclspc
const LinearTwist* FindTwist<LinearTwist>(
const RoadwayTwist& twist )
noexcept;
540 extern template dclspc
const PiecewiseTwist* FindTwist<PiecewiseTwist>(
const RoadwayTwist& twist )
noexcept;
541 extern template dclspc
const DirectionalTwist* FindTwist<DirectionalTwist>(
const RoadwayTwist& twist )
noexcept;
542 extern template dclspc
const CombinedTwist* FindTwist<CombinedTwist>(
const RoadwayTwist& twist )
noexcept;
544 extern template dclspc ConstantTwist* FindTwist<ConstantTwist>( RoadwayTwist& twist )
noexcept;
545 extern template dclspc LinearTwist* FindTwist<LinearTwist>( RoadwayTwist& twist )
noexcept;
546 extern template dclspc PiecewiseTwist* FindTwist<PiecewiseTwist>( RoadwayTwist& twist )
noexcept;
547 extern template dclspc DirectionalTwist* FindTwist<DirectionalTwist>( RoadwayTwist& twist )
noexcept;
548 extern template dclspc CombinedTwist* FindTwist<CombinedTwist>( RoadwayTwist& twist )
noexcept;
constexpr bool Equals(T a, T b, T epsilon) noexcept
Tests equality in the sense |a-b| < epsilon.
Definition Helpers.h:66
Value< Dimension< 0, 0, 0 > > One
Dimensionless value.
Definition DimensionedValues.h:319
Value< Dimension< 1, 0, 0 > > Length
Length.
Definition DimensionedValues.h:324
Value< Dimension<-1, 0, 0 > > AnglePerLength
Angle per length.
Definition DimensionedValues.h:321
constexpr Real _deg(Angle a) noexcept
Dimensionated Values conversion functions.
Definition DimensionedValues.h:1194
Value< Dimension< 0, 0, 0 > > Angle
Angle in radians.
Definition DimensionedValues.h:320
The namespace provides classes and methods for spatial computations.
Definition Box.h:32
Namespace of all the trax track libraries classes and methods.
Definition Collection.h:17
dclspc const char * TypeToName(Curve::CurveType ct)
Gets the type name of a curve from its type enumerator.
constexpr spat::Vector< One > Up
Vector pointing in the up direction with respect to gravity.
Definition Units.h:144
dclspc RoadwayTwist::TwistType TwistNameToType(const std::string &name) noexcept
Gets the type enumerator of a twist from its type name.
An interval describes the area between two numbers. It is understood to contain the near one and exlu...
Definition Interval.h:42
Implements a 3D - vector in cartesian coordinates.
Definition Vector.h:48
Combines the effect of two twists by adding them.
Definition RoadwayTwist.h:468
virtual void AttachTwist1(std::unique_ptr< RoadwayTwist > pTwist)=0
Populates the first slot.
virtual void AttachTwist2(std::unique_ptr< RoadwayTwist > pTwist)=0
Populates the second slot.
static dclspc std::unique_ptr< CombinedTwist > Make() noexcept
Makes a CombinedTwist object.
A twist that stays constant over the whole track range.
Definition RoadwayTwist.h:265
virtual void TwistValue(Angle twist) noexcept=0
Set twist value.
static dclspc std::unique_ptr< ConstantTwist > Make() noexcept
Makes a ConstantTwist object.
Curves implement this interface that then can get attached to a track to define the tracks geometry.
Definition Curve.h:198
A twist that rotates the frame arount T in a way that B is nearest a certain direction.
Definition RoadwayTwist.h:372
virtual const spat::Vector< One > & Attractor() const noexcept=0
virtual void Create(const Data &data)=0
Creates the twist from the data.
virtual std::shared_ptr< const struct Curve > GetCurve() const noexcept=0
static dclspc std::unique_ptr< DirectionalTwist > Make(const RoadwayTwist &fromTwist) noexcept
Makes a DirectionalTwist object from another twist.
static dclspc std::unique_ptr< DirectionalTwist > Make(const spat::Vector< One > &attractor=Up) noexcept
Makes a DirectionalTwist object.
virtual void Attractor(const spat::Vector< One > &attractor)=0
Set the direction for the twist.
A twist that varies linearly between two values.
Definition RoadwayTwist.h:290
virtual void From(Angle twist) noexcept=0
Set starting twist value.
common::Interval< Angle > Data
Data describing the twist.
Definition RoadwayTwist.h:305
static dclspc std::unique_ptr< LinearTwist > Make(const RoadwayTwist &fromTwist) noexcept
Makes a LinearTwist object from another twist.
static dclspc std::unique_ptr< LinearTwist > Make(Angle from=0_deg, Angle to=0_deg) noexcept
Makes a LinearTwist object.
virtual Angle From() const noexcept=0
Get starting twist value.
virtual void To(Angle twist) noexcept=0
Set ending twist value.
A twist that works like a DirectionalTwist but interpolates (linearly) two neighbouring attractors ac...
Definition RoadwayTwist.h:419
virtual void Create(const Data &data)=0
Creates the twist from the data.
virtual int CntTwistValues() const =0
virtual std::pair< Length, spat::Vector< One > > Twist(int idx) const =0
static dclspc std::unique_ptr< PiecewiseDirectionalTwist > Make() noexcept
Makes a PiecewiseDirectionalTwist object.
A twist with values at control points and either none or linear interpolation for the points in betwe...
Definition RoadwayTwist.h:333
virtual std::pair< Length, Angle > Twist(int idx) const =0
static dclspc std::unique_ptr< PiecewiseTwist > Make(TwistType type=TwistType::Piecewise) noexcept
Makes a PiecewiseTwist object.
virtual void Add(Length s, const Angle &twist)=0
Add a control point to the Twist.
virtual void Add(const std::pair< Length, Angle > &pair)=0
Add a control point to the Twist.
virtual int CntTwistValues() const =0
static dclspc std::unique_ptr< PiecewiseTwist > Make(TwistType type, const RoadwayTwist &fromTwist) noexcept
Makes a PiecewiseTwist object from another twist.
A RoadwayTwist is used to define the actual rotating angle around the tangent at a curve to get the c...
Definition RoadwayTwist.h:81
virtual Angle DoTwist(Length) const =0
virtual AnglePerLength DoD1(Length) const =0
virtual bool IsNull() const noexcept=0
virtual void OnAttach(const TrackBuilder &track) noexcept=0
Called on attachment to a track.
virtual bool IsDynamic() const noexcept=0
A twist is dynamic if it relates to geometry global to the track.
TwistType
Definition RoadwayTwist.h:83
@ Linear
A twist that linearly interpolates the twist angle from front to end of a track.
Definition RoadwayTwist.h:88
@ PiecewiseCircular
A twist that interpolates the angles in a 2pi interval and uses the shortest angular distance.
Definition RoadwayTwist.h:91
@ Combined
A twist that combines two twists additively.
Definition RoadwayTwist.h:95
@ PiecewiseDirectional
A twist that interpolates directions (slerp) and uses the result as directional twist.
Definition RoadwayTwist.h:92
@ PiecewiseLinear
A twist that interpolates the angles linearly along the segments.
Definition RoadwayTwist.h:90
@ Directional
A twist that rotates the frame's B closest to some attractor vector.
Definition RoadwayTwist.h:93
@ Positional
A twist that rotates the frame's B to point closest to some point in space.
Definition RoadwayTwist.h:94
@ Constant
A twist that applies a constant twist angle at every point along a track.
Definition RoadwayTwist.h:87
@ Zero
A twist that always applies 0_rad as a twist angle.
Definition RoadwayTwist.h:86
@ Piecewise
A twist that applies different twist angles to segments long the track.
Definition RoadwayTwist.h:89
virtual void OnDetach() noexcept=0
Called on detachment from a track.
static dclspc std::unique_ptr< RoadwayTwist > Make(TwistType type, const RoadwayTwist &fromTwist) noexcept
Makes a RoadwayTwist object from another twist.
virtual bool IsFrozen() const noexcept=0
virtual bool ZeroFlip(bool bActive) noexcept=0
virtual const char * TypeName() const noexcept=0
Name for the object type that implements this interface.
static dclspc std::unique_ptr< RoadwayTwist > Make(TwistType type) noexcept
Makes a RoadwayTwist object.
virtual void Flip() noexcept=0
Flips the effect of the twist along the track. After calling this function, the Twist() and D1() meth...
virtual bool IsValid() const noexcept=0
virtual bool IsDirectionalConstant() const noexcept=0
Find wether the twist is directional only offsetted by a constant.
virtual void Mirror() noexcept=0
Multiplies all twist angle by -1.
virtual bool IsConstant() const noexcept=0
virtual Angle Twist(Length s) const =0
virtual bool Offset(Angle offset) noexcept=0
Adds a global offset angle to the Twist.
virtual bool Equals(const RoadwayTwist &toTwist, Angle epsilon_angle=epsilon__angle) const noexcept=0
Comparison.
virtual AnglePerLength D1(Length s) const =0
virtual void Freeze(bool bFreeze=true) noexcept=0
Freezes the twist, so that dynamic twists like DirectionalTwist don't update anymore.
virtual std::unique_ptr< RoadwayTwist > Clone() const =0
Make a clone from this object.
Interface for making and shaping tracks.
Definition Track.h:831