29#include "common/Helpers.h"
46 template<
typename Valtype>
49 typedef Valtype value_type;
73 constexpr Vector() noexcept = default;
78 template<typename Valtype2>
79 explicit
Vector( const Valtype2* pVal ) noexcept;
87 template<typename Valtype2>
88 Vector& operator=( const Valtype2* pVal ) noexcept;
90 template<typename Valtype2>
104 const Valtype& operator[](
size_t index ) const;
106 Valtype& operator[](
size_t index );
115 const Valtype*
ptr() const noexcept;
130 constexpr Valtype
Length() const noexcept;
133 using AngleType = decltype(Valtype{}/Valtype{});
145 Vector& AircraftPrincipalAxes( AngleType yaw, AngleType pitch );
147 Vector& AircraftPrincipalAxes(
const Position2D<AngleType>& angles );
149 Position2D<AngleType> AircraftPrincipalAxes( Valtype epsilon = std::numeric_limits<Valtype>::epsilon() )
const;
155 auto Normalize() noexcept -> decltype(Valtype{}/Valtype{});
159 constexpr inline bool IsNormal( Valtype epsilon_length = 2*std::numeric_limits<Valtype>::epsilon() ) const noexcept;
173 template<typename Valtype2> constexpr
180 template<typename Valtype2> constexpr
193 constexpr
bool Equals( const
Vector& v, Valtype epsilon = Valtype{0} )
const noexcept;
202 template<
typename Valtype>
205 template<
typename Valtype>
208 template<
typename Valtype>
211 template<
typename Valtype>
216 template<
typename Valtype,
typename Valtype2>
220 template<
typename Valtype,
typename Valtype2>
229 template<
typename Valtype>
constexpr
231 template<
typename Valtype>
233 template<
typename Valtype>
constexpr
235 template<
typename Valtype>
constexpr
237 template<
typename Valtype>
239 template<
typename Valtype>
constexpr
241 template<
typename Valtype,
typename Valtype2>
constexpr
243 template<
typename Valtype>
constexpr
245 template<
typename Valtype>
constexpr
247 template<
typename Valtype,
typename Valtype2>
constexpr
249 template<
typename Valtype,
typename Valtype2>
constexpr
251 template<
typename Valtype,
typename Valtype2>
253 template<
typename Valtype>
255 template<
typename Valtype,
typename Valtype2>
constexpr
257 template<
typename Valtype>
259 template<
typename Valtype,
typename Valtype2>
constexpr
261 template<
typename Valtype,
typename Valtype2>
constexpr
263 template<
typename Valtype,
typename Valtype2>
constexpr
265 template<
typename Valtype,
typename Valtype2>
267 template<
typename Valtype>
constexpr
269 template<
typename Valtype>
constexpr
281 template<
typename Valtype>
284 template<
typename Valtype>
299 template<
typename Valtype>
314 template<
typename Valtype>
constexpr
315 bool Parallel(
const Vector<Valtype>& V1,
const Vector<Valtype>& V2,
decltype(Valtype{}/Valtype{})
epsilon = std::numeric_limits<
decltype(Valtype{}/Valtype{})>::epsilon() )
noexcept;
317 template<
typename Valtype>
constexpr
318 bool OrthoParallel(
const Vector<Valtype>& V1,
const Vector<Valtype>& v2,
decltype(Valtype{}/Valtype{})
epsilon = std::numeric_limits<
decltype(Valtype{}/Valtype{})>::epsilon() )
noexcept;
320 template<
typename Valtype>
constexpr
321 bool AntiParallel(
const Vector<Valtype>& V1,
const Vector<Valtype>& V2,
decltype(Valtype{}/Valtype{})
epsilon = std::numeric_limits<
decltype(Valtype{}/Valtype{})>::epsilon() )
noexcept;
327 template<
typename Valtype>
337 template<
typename Valtype>
340 template<
typename Valtype>
343 template<
typename Valtype>
348 template<
typename Valtype>
354template<
typename Valtype>
356 :
dx{
dx}, dy{dy}, dz{dz}
359template<
typename Valtype>
362 dy{s == specials::ey ? Valtype{1} : Valtype{0}},
363 dz{s == specials::ez ? Valtype{1} : Valtype{0}}
366template<
typename Valtype>
368 :
dx{v2D.dx}, dy{v2D.dy}, dz{0}
371template<
typename Valtype>
372template<
typename Valtype2>
374 :
dx{Valtype{
static_cast<Valtype
>(pVal[0])}},
375 dy{Valtype{
static_cast<Valtype
>(pVal[1])}},
376 dz{Valtype{
static_cast<Valtype
>(pVal[2])}}
379template<
typename Valtype>
380template<
typename Valtype2>
381inline Vector<Valtype>& Vector<Valtype>::operator=(
const Valtype2* pVal )
noexcept{
382 dx = Valtype{pVal[0]};
383 dy = Valtype{pVal[1]};
384 dz = Valtype{pVal[2]};
388template<
typename Valtype>
389template<
typename Valtype2>
391 dx =
static_cast<Valtype
>(vector.dx);
392 dy =
static_cast<Valtype
>(vector.dy);
396template<
typename Valtype>
397inline const Valtype& Vector<Valtype>::operator[](
size_t index )
const{
401 throw std::out_of_range(
"invalid Vector subscript" );
404template<
typename Valtype>
405inline Valtype& Vector<Valtype>::operator[](
size_t index ){
409 throw std::out_of_range(
"invalid Vector subscript" );
412template<
typename Valtype>
417template<
typename Valtype>
422template<
typename Valtype>
430template<
typename Valtype>
434 return *
this == Null<Valtype>;
436 return *
this == Ex<Valtype>;
438 return *
this == Ey<Valtype>;
440 return *
this == Ez<Valtype>;
448template<
typename Valtype>
constexpr
453template<
typename Valtype>
454inline Vector<Valtype>& Vector<Valtype>::AircraftPrincipalAxes( AngleType yaw, AngleType pitch )
456 *
this = Length() * Ex<AngleType>;
458 N.
Rotate( Ez<AngleType>, yaw );
460 return Rotate( Ez<AngleType>, yaw ).
Rotate( N, pitch );
463template<
typename Valtype>
464inline Vector<Valtype>& Vector<Valtype>::AircraftPrincipalAxes(
const Position2D<AngleType>& angles )
466 return AircraftPrincipalAxes( angles.x, angles.y );
469template<
typename Valtype>
472 Valtype sqrtdxdxplusdydy =
sqrt( dx*dx + dy*dy );
474 const Vector<Valtype>::AngleType pi__{3.141592654f};
476 return { Vector<Valtype>::AngleType{0},
482 atan2( -dz, sqrtdxdxplusdydy )
486template<
typename Valtype>
488 decltype(Valtype{}/Valtype{}) L =
Length() / Valtype{1};
491 return decltype(Valtype{}/Valtype{}){0};
497template<
typename Valtype>
constexpr
499 return abs(
Length() - Valtype{1}) <= _epsilon_length;
502template<
typename Valtype>
504 if( angle == AngleType{ 0 } )
509 Valtype IrxvI = rxv.
Length();
510 if( IrxvI == Valtype{0} )
513 const Vector rvr = (r * v) * r;
514 const Vector vmrvr = v - rvr;
516 v = rvr + cos( angle ) * vmrvr + sin( angle ) * vmrvr.
Length()/IrxvI * rxv;
520template<
typename Valtype>
529template<
typename Valtype>
530template<
typename Valtype2>
constexpr
532 Valtype2 nl2 = normal * normal;
533 if( nl2 == Valtype2{0} )
534 return Null<Valtype>;
536 return (*
this * normal) / nl2 * normal;
539template<
typename Valtype>
540template<
typename Valtype2>
constexpr
545template<
typename Valtype>
548 return d*d <= epsilon_*epsilon_;
551template<
typename Valtype>
559template<
typename Valtype,
typename Valtype2>
561 static_assert(
sizeof(Valtype) ==
sizeof(Valtype2),
"Can not spatial_cast with different memory layout" );
565template<
typename Valtype,
typename Valtype2>
567 static_assert(
sizeof(Valtype) ==
sizeof(Valtype2),
"Can not spatial_cast with different memory layout" );
571template<
typename Valtype>
constexpr
573 return { v1.
dx + v2.dx,
578template<
typename Valtype>
586template<
typename Valtype>
constexpr
588 return { +v.dx, +v.dy, +v.dz };
591template<
typename Valtype>
constexpr
593 return { v1.
dx - v2.dx,
598template<
typename Valtype>
606template<
typename Valtype>
constexpr
608 return { -v.dx, -v.dy, -v.dz };
611template<
typename Valtype,
typename Valtype2>
constexpr
613 return v1.
dx*v2.dx + v1.
dy*v2.dy + v1.
dz*v2.dz;
616template<
typename Valtype>
constexpr
623template<
typename Valtype>
constexpr
628template<
typename Valtype,
typename Valtype2>
constexpr
630 static_assert( !std::is_integral<Valtype2>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
636template<
typename Valtype,
typename Valtype2>
constexpr
638 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
642template<
typename Valtype>
constexpr
644 return {
static_cast<int>(
static_cast<Valtype
>(v.dx) * f),
645 static_cast<int>(
static_cast<Valtype
>(v.dy) * f),
646 static_cast<int>(
static_cast<Valtype
>(v.dz) * f) };
649template<
typename Valtype>
constexpr
654template<
typename Valtype,
typename Valtype2>
656 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
663template<
typename Valtype>
664inline Vector<int>&
operator*=( Vector<int>& v, Valtype f )
noexcept{
665 v.dx =
static_cast<int>(
static_cast<Valtype
>(v.dx) * f);
666 v.dy =
static_cast<int>(
static_cast<Valtype
>(v.dy) * f);
667 v.dz =
static_cast<int>(
static_cast<Valtype
>(v.dz) * f);
671template<
typename Valtype,
typename Valtype2>
constexpr
673 return { v1.
dy * v2.dz - v1.
dz * v2.dy,
674 v1.
dz * v2.dx - v1.
dx * v2.dz,
675 v1.
dx * v2.dy - v1.
dy * v2.dx };
678template<
typename Valtype>
684template<
typename Valtype,
typename Valtype2>
constexpr
686 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
692template<
typename Valtype>
constexpr
694 return {
static_cast<int>(
static_cast<Valtype
>(v.dx) / f),
695 static_cast<int>(
static_cast<Valtype
>(v.dy) / f),
696 static_cast<int>(
static_cast<Valtype
>(v.dz) / f) };
699template<
typename Valtype,
typename Valtype2>
701 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
708template<
typename Valtype>
709inline Vector<int>& operator/=( Vector<int>& v, Valtype f )
noexcept{
710 v.dx =
static_cast<int>(
static_cast<Valtype
>(v.dx) / f);
711 v.dy =
static_cast<int>(
static_cast<Valtype
>(v.dy) / f);
712 v.dz =
static_cast<int>(
static_cast<Valtype
>(v.dz) / f);
716template<
typename Valtype>
constexpr
718 return v1.
dx == v2.dx && v1.
dy == v2.dy && v1.
dz == v2.dz;
721template<
typename Valtype>
constexpr
726template<
typename Valtype>
727void Rotate( Vector<Valtype>* pVec,
unsigned int nVec,
const Vector<Valtype>& rot )
noexcept{
728 Vector<Valtype> r{rot};
731 for(
size_t idx = 0; idx < nVec; ++idx )
732 pVec[idx].Rotate( r, angle );
735template<
typename Valtype>
740 for(
auto iter = vec.begin(); iter != vec.end(); ++iter )
741 (*iter).Rotate( nr, angle );
744template<
typename Valtype>
746 return v1.
Equals( v2, epsilon );
749template<
typename Valtype>
constexpr
750inline bool Parallel(
const Vector<Valtype>& V1,
const Vector<Valtype>& V2,
decltype(Valtype{}/Valtype{})
epsilon )
noexcept{
753 if( v1 == Valtype{0} || v2 == Valtype{0} )
756 if( (V1 % V2).
Length() / v1 / v2 > epsilon )
762template<
typename Valtype>
constexpr
764 if( !Parallel( V1, V2, epsilon ) )
767 return V1 * V2 >=
decltype(Valtype{}*Valtype{}){0};
770template<
typename Valtype>
constexpr
772 if( !Parallel( V1, V2, epsilon ) )
775 return V1 * V2 <
decltype(Valtype{}*Valtype{}){0};
778template<
typename Valtype>
780 Vector<
decltype(Valtype{}/Valtype{})> V{ v.dx / Valtype{1},
784 return std::make_pair( L, V );
787template<
typename Valtype>
797 const Valtype angle = t*
asin( r.Normalize() );
799 return ((1-t)*a + t*b) * (
cos(angle) * na +
sin(angle) * (r % na));
802template<
typename Valtype>
808 const Valtype angle = t*
asin( r.Normalize() );
810 return cos(angle) * na +
sin(angle) * (r % na);
813template<
typename Valtype>
822 const Valtype angle =
asin( r.Normalize() );
824 return {
cos(t*angle) * na +
sin(t*angle) * (r % na), angle*(-
sin(t*angle) * na +
cos(t*angle) * (r % na)) };
constexpr auto Sign(T val) noexcept -> decltype(T{}/T{})
Definition Helpers.h:72
T Round(T value, int toDigit) noexcept
Rounding of floating point number to a certain digit aftzer the point.
Definition Helpers.h:140
constexpr const T & Clamp(const T &v, const T &lo, const T &hi) noexcept
Clips a val to a specified range.
Definition Helpers.h:105
constexpr bool Equals(T a, T b, T epsilon) noexcept
Tests equality in the sense |a-b| < epsilon.
Definition Helpers.h:66
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 > > cos(Value< Dimension< 0, 0, 0 > > a) noexcept
Dimensionated Values math function.
Definition DimensionedValues.h:698
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
Value< Dimension< 1, 0, 0 > > Length
Length.
Definition DimensionedValues.h:324
constexpr Value< Dimension< 0, 0, 0 > > sin(Value< Dimension< 0, 0, 0 > > a) noexcept
Dimensionated Values math function.
Definition DimensionedValues.h:694
constexpr Real epsilon
Marginal difference in calculations.
Definition DimensionedValues.h:344
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
Position< Valtype > & operator%=(const Position< Valtype > &, const Position< Valtype > &)=delete
Position operator.
Position< Valtype > & operator+=(Position< Valtype > &, const Position< Valtype > &)=delete
Position operator.
constexpr Position< Valtype > operator%(const Position< Valtype > &, const Position< Valtype > &)=delete
Position operator.
Position< Valtype > & operator-=(Position< Valtype > &, const Position< Valtype > &)=delete
Position operator.
auto Normalize(const Frame< Valtype, ValtypeT > &f) noexcept -> std::pair< Vector< ValtypeT >, Frame< Valtype, decltype(ValtypeT{}/ValtypeT{})> >
Outer normalizing.
Definition Frame.h:1144
constexpr bool Equals(const Vector< Valtype > &v1, const Vector< Valtype > &v2, Valtype epsilon=Valtype{0}) noexcept
Comparison within some range.
Definition Vector.h:745
bool Slerp(Transformation< Valtype > &out, const Transformation< Valtype > &inA, const Transformation< Valtype > &inB, Valtype t)
Spherical interpolates two matrices weighting them by t.
Definition Matrix.h:1722
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
constexpr Valtype operator/(const Position< Valtype > &, const Position< Valtype > &)=delete
Position operator.
Implements a 2D - position in cartesian coordinates.
Definition Position2D.h:45
Implements a 3D - position in cartesian coordinates.
Definition Position.h:46
Implements a 2D - vector in cartesian coordinates.
Definition Vector2D.h:46
Implements a 3D - vector in cartesian coordinates.
Definition Vector.h:48
constexpr bool Is(specials s) const noexcept
constexpr Vector< One > OrthogonalProjection(const Vector< Valtype2 > &normal) const noexcept
Vector & Init(specials s=specials::ex) noexcept
constexpr One Length() const noexcept
constexpr bool Equals(const Vector &v, One epsilon=One{0}) const noexcept
Vector & Round(int toDigit) noexcept
Rounds the vectors values to a certain digit after the point.
Definition Vector.h:552
Vector & Rotate(const Vector< AngleType > &r, AngleType angle) noexcept
specials
Identifiers for special vectors.
Definition Vector.h:57
@ 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
One dy
Definition Vector.h:52
One dx
Definition Vector.h:51
constexpr Vector< One > ParallelProjection(const Vector< Valtype2 > &normal) const noexcept
constexpr bool IsNormal(Valtype epsilon_length=2 *std::numeric_limits< Valtype >::epsilon()) const noexcept
Definition Vector.h:498
One dz
Definition Vector.h:53
constexpr Vector() noexcept=default
Does not initialize the members.
auto Normalize() noexcept -> decltype(Valtype{}/Valtype{})
Normalizes the vector to length 1.
Definition Vector.h:487