42 template<
typename,const
unsigned short,const
unsigned short>
class Matrix;
50 template<
typename Valtype,
typename ValtypeT = Valtype>
74 constexpr Frame() noexcept = default;
75 constexpr
Frame( Valtype px, Valtype py, Valtype pz,
76 ValtypeT tx, ValtypeT ty, ValtypeT tz,
77 ValtypeT nx, ValtypeT ny, ValtypeT nz,
78 ValtypeT bx, ValtypeT by, ValtypeT bz ) noexcept;
83 const
Vector<ValtypeT>& tan,
84 const
Vector<ValtypeT>& nor,
85 const
Vector<ValtypeT>& bin ) noexcept;
87 const
Rotation<ValtypeT>& rot ) noexcept;
89 template<typename Valtype2>
91 template<typename Valtype2>
92 explicit
Frame( const Valtype2* pVal ) noexcept;
107 template<typename Valtype2>
108 Frame& operator=( const
Matrix<Valtype2,4,4>& trans ) noexcept;
110 template<typename Valtype2>
111 Frame& operator=( const Valtype2* pVal ) noexcept;
120 operator
VectorBundle<Valtype,ValtypeT>() const noexcept;
129 const Valtype*
ptr() const noexcept;
166 Frame& LookAt( const
Vector<ValtypeT>& reference, const
Vector<ValtypeT>& dir ) noexcept;
168 Frame& LookTAt( const
Vector<ValtypeT>& dir ) noexcept;
170 Frame& LookTAt( const
Vector<ValtypeT>& dir, const
Vector<ValtypeT>& up ) noexcept;
172 Frame& LookNAt( const
Vector<ValtypeT>& dir ) noexcept;
174 Frame& LookBAt( const
Vector<ValtypeT>& dir ) noexcept;
192 Frame& AircraftPrincipalAxes( ValtypeT yaw, ValtypeT pitch, ValtypeT roll );
194 Frame& AircraftPrincipalAxes( const
Position<ValtypeT>& angles );
196 Position<ValtypeT> AircraftPrincipalAxes( ValtypeT epsilon =
std::numeric_limits<ValtypeT>::epsilon() ) const;
212 bool IsOrthoNormal( ValtypeT epsilon_length = 2*
std::numeric_limits<ValtypeT>::epsilon(), ValtypeT epsilon_angle = 2*
std::numeric_limits<ValtypeT>::epsilon() ) const noexcept;
222 template<typename Valtype2>
225 template<typename Valtype2>
226 Vector<Valtype2>& ToParent(
Vector<Valtype2>& v ) const noexcept;
228 template<typename Valtype2>
229 Vector<Valtype2>& NormalToParent(
Vector<Valtype2>& normal ) const noexcept;
231 template<typename Valtype2,typename ValtypeT2>
234 template<typename Valtype2,typename ValtypeT2>
237 template<typename Valtype2,typename ValtypeT2>
238 Frame<Valtype2,ValtypeT2>& ToParent(
Frame<Valtype2,ValtypeT2>& frame ) const noexcept;
240 template<typename Valtype2>
241 Box<Valtype2>& ToParent(
Box<Valtype2>& box ) const noexcept;
243 template<typename Valtype2>
244 Sphere<Valtype2>& ToParent(
Sphere<Valtype2>& sphere ) const noexcept;
256 template<typename Valtype2>
259 template<typename Valtype2>
260 Vector<Valtype2>& FromParent(
Vector<Valtype2>& v ) const noexcept;
262 template<typename Valtype2,typename ValtypeT2>
265 template<typename Valtype2,typename ValtypeT2>
268 template<typename Valtype2,typename ValtypeT2>
269 Frame<Valtype2,ValtypeT2>& FromParent(
Frame<Valtype2,ValtypeT2>& frame ) const noexcept;
327 template<typename Valtype2>
335 template<typename Valtype2>
370 Valtype epsilon_length =
std::numeric_limits<Valtype>::epsilon(),
371 ValtypeT epsilon_lengthT =
std::numeric_limits<ValtypeT>::epsilon() ) const noexcept;
379 template<typename Valtype,typename ValtypeT = Valtype>
384 template<typename Valtype,typename ValtypeT=Valtype>
388 template<
typename Valtype,
typename ValtypeT=Valtype,
typename Valtype2=Valtype,
typename ValtypeT2=Valtype>
392 template<
typename Valtype,
typename ValtypeT=Valtype,
typename Valtype2=Valtype,
typename ValtypeT2=Valtype>
397 template<
typename Valtype,
typename ValtypeT=Valtype>
constexpr
398 bool operator==(
const Frame<Valtype,ValtypeT>& frame1,
const Frame<Valtype,ValtypeT>& frame2 )
noexcept;
403 template<
typename Valtype,
typename ValtypeT=Valtype>
constexpr
404 bool operator!=(
const Frame<Valtype,ValtypeT>& frame1,
const Frame<Valtype,ValtypeT>& frame2 )
noexcept;
419 template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2>
422 template<
typename Valtype1,
typename ValtypeT1,
typename ValtypeT2>
425 template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
428 template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
431 template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
434 template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2>
437 template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
444 template<
typename Valtype,
typename ValtypeT>
445 Frame<Valtype,ValtypeT>&
operator*=( Frame<Valtype,ValtypeT>& frame, ValtypeT param )
noexcept;
450 template<
typename Valtype,
typename ValtypeT>
451 auto Normalize(
const Frame<Valtype,ValtypeT>& f )
noexcept -> std::pair<Vector<ValtypeT>,
Frame<Valtype,
decltype(ValtypeT{}/ValtypeT{})>>;
454template<
typename Valtype,
typename ValtypeT>
constexpr
456 Valtype px, Valtype py, Valtype pz,
457 ValtypeT tx, ValtypeT ty, ValtypeT tz,
458 ValtypeT nx, ValtypeT ny, ValtypeT nz,
459 ValtypeT bx, ValtypeT by, ValtypeT bz ) noexcept
466template<
typename Valtype,
typename ValtypeT>
constexpr
474template<
typename Valtype,
typename ValtypeT>
481template<
typename Valtype,
typename ValtypeT>
constexpr
489template<
typename Valtype,
typename ValtypeT>
constexpr
500template<
typename Valtype,
typename ValtypeT>
509template<
typename Valtype,
typename ValtypeT>
515template<
typename Valtype,
typename ValtypeT>
516template<
typename Valtype2>
521template<
typename Valtype,
typename ValtypeT>
522template<
typename Valtype2>
531template<
typename Valtype,
typename ValtypeT>
540template<
typename Valtype,
typename ValtypeT>
556template<
typename Valtype,
typename ValtypeT>
557template<
typename Valtype2>
559 T.dx = ValtypeT{trans(0,0)};
560 T.dy = ValtypeT{trans(0,1)};
561 T.dz = ValtypeT{trans(0,2)};
563 N.dx = ValtypeT{trans(1,0)};
564 N.dy = ValtypeT{trans(1,1)};
565 N.dz = ValtypeT{trans(1,2)};
567 B.dx = ValtypeT{trans(2,0)};
568 B.dy = ValtypeT{trans(2,1)};
569 B.dz = ValtypeT{trans(2,2)};
571 P.x = Valtype{trans(3,0)};
572 P.y = Valtype{trans(3,1)};
573 P.z = Valtype{trans(3,2)};
578template<
typename Valtype,
typename ValtypeT>
579template<
typename Valtype2>
588template<
typename Valtype,
typename ValtypeT>
590 return VectorBundle2<Valtype,ValtypeT>{ *
this };
593template<
typename Valtype,
typename ValtypeT>
595 return VectorBundle<Valtype,ValtypeT>{ *
this };
598template<
typename Valtype,
typename ValtypeT>
600 static_assert(
sizeof(Valtype) ==
sizeof(ValtypeT),
"Can not access a VectorBundle via pointer if the two types have different memory sizes.");
604template<
typename Valtype,
typename ValtypeT>
606 static_assert(
sizeof(Valtype) ==
sizeof(ValtypeT),
"Can not access a VectorBundle via pointer if the two types have different memory sizes.");
610template<
typename Valtype,
typename ValtypeT>
619template<
typename Valtype,
typename ValtypeT>
628template<
typename Valtype,
typename ValtypeT>
638template<
typename Valtype,
typename ValtypeT>
647template<
typename Valtype,
typename ValtypeT>
656 const ValtypeT pi__{3.141592654f};
657 Vector<ValtypeT> D = dir;
659 Vector<ValtypeT> R = reference;
663 Vector<ValtypeT> rotation = R % D;
664 if( ValtypeT sin = rotation.Normalize() ){
665 sin = std::clamp( sin, ValtypeT{-1}, ValtypeT{1} );
666 if( R*D <
decltype(ValtypeT{}*ValtypeT{}){0} )
667 rotation *= pi__ -
asin( sin );
669 rotation *=
asin( sin );
674 rotation =
B.OrthogonalProjection( R );
675 if( !rotation.Normalize() ){
676 rotation =
N.OrthogonalProjection( R );
677 if( !rotation.Normalize() ){
678 assert( !
"impossible" );
694template<
typename Valtype,
typename ValtypeT>
696 return LookAt( Ex<ValtypeT>, dir );
699template<
typename Valtype,
typename ValtypeT>
701 return LookAt( Ex<ValtypeT>, dir ).RotateTan( up );
704template<
typename Valtype,
typename ValtypeT>
706 return LookAt( Ey<ValtypeT>, dir );
709template<
typename Valtype,
typename ValtypeT>
711 return LookAt( Ez<ValtypeT>, dir );
714template<
typename Valtype,
typename ValtypeT>
724template<
typename Valtype,
typename ValtypeT>
727 return AircraftPrincipalAxes( angles.x, angles.y, angles.z );
730template<
typename Valtype,
typename ValtypeT>
733 const ValtypeT pi__{3.141592654f};
736 if( Parallel(
T, Ez<ValtypeT>, _epsilon ) ){
737 if(
T * Ez<ValtypeT> > ValtypeT{0} )
738 return { ValtypeT{0}, -pi__/2,
atan2(
N * -Ex<ValtypeT>,
N * Ey<ValtypeT> ) };
740 return { ValtypeT{0}, pi__/2,
atan2(
N * Ex<ValtypeT>,
N * Ey<ValtypeT> ) };
743 Position<ValtypeT> retval{
750 ref.RotateBin( retval.x ).RotateNor( retval.y );
752 retval.z =
atan2(
N * ref.B,
N * ref.N );
756template<
typename Valtype,
typename ValtypeT>
764template<
typename Valtype,
typename ValtypeT>
781 N = Ey<ValtypeT> - (Ey<ValtypeT> *
T) *
T;
783 N = Ex<ValtypeT> - (Ex<ValtypeT> *
T) *
T;
798template<
typename Valtype,
typename ValtypeT>
800 return T.IsNormal( _epsilon_length ) &&
801 N.IsNormal( _epsilon_length ) &&
802 B.IsNormal( _epsilon_length ) &&
803 abs(
T*
N) <= ValtypeT{1} * _epsilon_angle &&
804 abs(
T*
B) <= ValtypeT{1} * _epsilon_angle &&
805 abs(
N*
B) <= ValtypeT{1} * _epsilon_angle;
808template<
typename Valtype,
typename ValtypeT>
809template<
typename Valtype2>
815template<
typename Valtype,
typename ValtypeT>
816template<
typename Valtype2>
817inline Vector<Valtype2>& Frame<Valtype,ValtypeT>::ToParent( Vector<Valtype2>& v )
const noexcept{
822template<
typename Valtype,
typename ValtypeT>
823template<
typename Valtype2>
830template<
typename Valtype,
typename ValtypeT>
831template<
typename Valtype2,
typename ValtypeT2>
838template<
typename Valtype,
typename ValtypeT>
839template<
typename Valtype2,
typename ValtypeT2>
847template<
typename Valtype,
typename ValtypeT>
848template<
typename Valtype2,
typename ValtypeT2>
857template<
typename Valtype,
typename ValtypeT>
858template<
typename Valtype2>
865template<
typename Valtype,
typename ValtypeT>
866template<
typename Valtype2>
867inline Sphere<Valtype2>& spat::Frame<Valtype,ValtypeT>::ToParent( Sphere<Valtype2>& sphere )
const noexcept
869 ToParent( sphere.c );
873template<
typename Valtype,
typename ValtypeT>
874template<
typename Valtype2>
884template<
typename Valtype,
typename ValtypeT>
885template<
typename Valtype2>
887 const Vector<Valtype2> vtemp{ v };
894template<
typename Valtype,
typename ValtypeT>
895template<
typename Valtype2,
typename ValtypeT2>
902template<
typename Valtype,
typename ValtypeT>
903template<
typename Valtype2,
typename ValtypeT2>
911template<
typename Valtype,
typename ValtypeT>
912template<
typename Valtype2,
typename ValtypeT2>
914 FromParent( frame.P );
915 FromParent( frame.T );
916 FromParent( frame.N );
917 FromParent( frame.B );
921template<
typename Valtype,
typename ValtypeT>
927template<
typename Valtype,
typename ValtypeT>
929 P += p.x *
T + p.y *
N + p.z *
B;
933template<
typename Valtype,
typename ValtypeT>
939template<
typename Valtype,
typename ValtypeT>
945template<
typename Valtype,
typename ValtypeT>
951template<
typename Valtype,
typename ValtypeT>
957template<
typename Valtype,
typename ValtypeT>
964template<
typename Valtype,
typename ValtypeT>
971template<
typename Valtype,
typename ValtypeT>
978template<
typename Valtype,
typename ValtypeT>
980 T.Rotate( nr, angle );
981 N.Rotate( nr, angle );
982 B.Rotate( nr, angle );
986template<
typename Valtype,
typename ValtypeT>
991 T.Rotate( r, angle );
992 N.Rotate( r, angle );
993 B.Rotate( r, angle );
997template<
typename Valtype,
typename ValtypeT>
998template<
typename Valtype2>
1002 Valtype2 angle = r.T.Normalize();
1004 return Rotate( r, angle );
1007template<
typename Valtype,
typename ValtypeT>
1008template<
typename Valtype2>
1011 P.Rotate( axis, angle );
1012 T.Rotate( axis.T, angle );
1013 N.Rotate( axis.T, angle );
1014 B.Rotate( axis.T, angle );
1018template<
typename Valtype,
typename ValtypeT>
1020 N.Rotate(
T, angle );
1021 B.Rotate(
T, angle );
1025template<
typename Valtype,
typename ValtypeT>
1030template<
typename Valtype,
typename ValtypeT>
1032 T.Rotate(
N, angle );
1033 B.Rotate(
N, angle );
1037template<
typename Valtype,
typename ValtypeT>
1039 T.Rotate(
B, angle );
1040 N.Rotate(
B, angle );
1044template<
typename Valtype,
typename ValtypeT>
constexpr
1046 return P.Equals( frame.P, _epsilon_length ) &&
1047 T.Equals( frame.T, epsilon_lengthT ) &&
1048 N.Equals( frame.N, epsilon_lengthT ) &&
1049 B.Equals( frame.B, epsilon_lengthT );
1052template<
typename Valtype,
typename ValtypeT>
1061template<
typename Valtype,
typename ValtypeT,
typename Valtype2,
typename ValtypeT2>
1063 static_assert(
sizeof(Valtype) ==
sizeof(Valtype2),
"Can not spatial_cast with different memory layout" );
1064 static_assert(
sizeof(ValtypeT) ==
sizeof(ValtypeT2),
"Can not spatial_cast with different memory layout" );
1068template<
typename Valtype,
typename ValtypeT,
typename Valtype2,
typename ValtypeT2>
1070 static_assert(
sizeof(Valtype) ==
sizeof(Valtype2),
"Can not spatial_cast with different memory layout" );
1071 static_assert(
sizeof(ValtypeT) ==
sizeof(ValtypeT2),
"Can not spatial_cast with different memory layout" );
1075template<
typename Valtype,
typename ValtypeT>
constexpr
1077 return !(frame1 != frame2);
1080template<
typename Valtype,
typename ValtypeT>
constexpr
1082 return frame1.P != frame2.P ||
1083 frame1.T != frame2.T ||
1084 frame1.N != frame2.N ||
1085 frame1.B != frame2.B;
1088template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2>
1091 frame.ToParent( result );
1095template<
typename Valtype1,
typename ValtypeT1,
typename ValtypeT2>
1098 frame.ToParent( result );
1102template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
1105 frame.ToParent( result );
1109template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
1112 frame.ToParent( result );
1116template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
1119 frame.ToParent( result );
1123template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2>
1126 frame.ToParent( result );
1130template<
typename Valtype1,
typename ValtypeT1,
typename Valtype2,
typename ValtypeT2>
1132 return frame = frame * f;
1135template<
typename Valtype,
typename ValtypeT>
1143template<
typename Valtype,
typename ValtypeT>
1149 return std::make_pair(
1154 Frame<Valtype,
decltype(ValtypeT{}/ValtypeT{})>{
Matrix template for arbitrary dimensions and value type.
Definition Matrix.h:63
Rotation matrix.
Definition Matrix.h:607
constexpr Value< Dimension< L/2, M/2, T/2 > > sqrt(Value< Dimension< L, M, T > > a) noexcept
Dimensionated Values math function.
Definition DimensionedValues.h:670
constexpr Value< Dimension< 0, 0, 0 > > asin(Value< Dimension< 0, 0, 0 > > a) noexcept
Dimensionated Values math function.
Definition DimensionedValues.h:706
constexpr Value< Dimension< 0, 0, 0 > > atan2(Value< Dimension< L, M, T > > y, Value< Dimension< L, M, T > > x) noexcept
Dimensionated Values math function.
Definition DimensionedValues.h:719
The namespace provides classes and methods for spatial computations.
Definition Box.h:32
Position< Valtype2 > operator*(const Frame< Valtype1, ValtypeT1 > &frame, const Position< Valtype2 > &p) noexcept
Frame operator.
Definition Frame.h:1089
Frame< Valtype2, ValtypeT2 > & operator*=(Frame< Valtype1, ValtypeT1 > &frame, const Frame< Valtype2, ValtypeT2 > &f) noexcept
right side multiplication of f to frame.
Definition Frame.h:1131
Frame< Valtype, ValtypeT > & spatial_cast(Frame< Valtype2, ValtypeT2 > &from) noexcept
Cast to Frame with different underlying value types.
Definition Frame.h:1062
Frame< Valtype, ValtypeT > VectorBundle3
Different name for Frame.
Definition Frame.h:380
constexpr Frame< Valtype, ValtypeT > Identity
Identity frame.
Definition Frame.h:385
constexpr Position< Valtype > Origin3D
Origin of coordinate system.
Definition Position.h:143
Axis aligned box.
Definition Box.h:41
A Frame ("TNBFrame") describes a location in 3d space and an orientation using a right handed coordin...
Definition Frame.h:52
Frame & TransportTan(Valtype d) noexcept
Frame & FlipTan() noexcept
constexpr Frame() noexcept=default
Does not initialize the members.
Frame & TransportNor(Valtype d) noexcept
bool IsOrthoNormal(ValtypeT epsilon_length=2 *std::numeric_limits< ValtypeT >::epsilon(), ValtypeT epsilon_angle=2 *std::numeric_limits< ValtypeT >::epsilon()) const noexcept
Frame & TransportBy(const Vector< Valtype > &v) noexcept
Vector< ValtypeT > B
Definition Frame.h:56
Frame & Rotate(const Vector< ValtypeT > &nr, ValtypeT angle) noexcept
Frame & TransportTo(Valtype d) noexcept
Frame & OrthoNormalize() noexcept
Position< Valtype > P
Definition Frame.h:53
Frame & Round(int toDigit) noexcept
Frame & RotateBin(ValtypeT angle) noexcept
Frame & RotateTan(ValtypeT angle) noexcept
constexpr bool Equals(const Frame &frame, Valtype epsilon_length=std::numeric_limits< Valtype >::epsilon(), ValtypeT epsilon_lengthT=std::numeric_limits< ValtypeT >::epsilon()) const noexcept
Vector< ValtypeT > N
Definition Frame.h:55
Frame & FlipBin() noexcept
Frame & RotateNor(ValtypeT angle) noexcept
Frame & FlipNor() noexcept
Vector< ValtypeT > T
Definition Frame.h:54
Frame & Normalize() noexcept
Frame & TransportBin(Valtype d) noexcept
Implements a 3D - position in cartesian coordinates.
Definition Position.h:46
Sphere with center and radius.
Definition Sphere.h:39
Implements a tangential space bundle.
Definition VectorBundle2.h:43
Implements a Vector bundle.
Definition VectorBundle.h:42
Implements a 3D - vector in cartesian coordinates.
Definition Vector.h:48
@ ez
Unit vector in z-direction.
Definition Vector.h:61
@ null
Vector with all parameters zeroed.
Definition Vector.h:58
@ ex
Unit vector in x-direction.
Definition Vector.h:59
@ ey
Unit vector in y-direction.
Definition Vector.h:60
auto Normalize() noexcept -> decltype(Valtype{}/Valtype{})
Normalizes the vector to length 1.
Definition Vector.h:487