38 template<
typename>
struct Vector;
44 template<
typename Valtype>
47 typedef Valtype value_type;
73 template<typename Valtype2>
74 explicit
Vector2D( const Valtype2* pVal ) noexcept;
81 template<typename Valtype2>
89 const Valtype& operator[](
size_t index ) const;
91 Valtype& operator[](
size_t index );
106 constexpr Valtype
Length() const noexcept;
111 auto
Normalize() noexcept -> decltype(Valtype{}/Valtype{});
115 template<
typename Valtype2>
142 template<typename Valtype>
143 constexpr
Vector2D<Valtype> Null2D{Valtype{0},Valtype{0}};
145 template<
typename Valtype>
148 template<
typename Valtype>
154 template<
typename Valtype,
typename Valtype2>
158 template<
typename Valtype,
typename Valtype2>
166 template<
typename Valtype>
constexpr
168 template<
typename Valtype>
170 template<
typename Valtype>
constexpr
172 template<
typename Valtype>
constexpr
174 template<
typename Valtype>
176 template<
typename Valtype>
constexpr
178 template<
typename Valtype,
typename Valtype2>
constexpr
180 template<
typename Valtype,
typename Valtype2>
constexpr
182 template<
typename Valtype,
typename Valtype2>
constexpr
184 template<
typename Valtype,
typename Valtype2>
186 template<
typename Valtype>
188 template<
typename Valtype>
constexpr
190 template<
typename Valtype>
192 template<
typename Valtype,
typename Valtype2>
constexpr
194 template<
typename Valtype,
typename Valtype2>
constexpr
196 template<
typename Valtype,
typename Valtype2>
constexpr
198 template<
typename Valtype,
typename Valtype2>
200 template<
typename Valtype>
constexpr
202 template<
typename Valtype>
constexpr
208 template<
typename Valtype>
211 template<
typename Valtype>
216template<
typename Valtype>
constexpr
221template<
typename Valtype>
constexpr
227template<
typename Valtype>
constexpr
232template<
typename Valtype>
233template<
typename Valtype2>
235 :
dx{ Valtype{pVal[0]} },
236 dy{ Valtype{pVal[1]} }
239template<
typename Valtype>
240template<
typename Valtype2>
247template<
typename Valtype>
252 throw std::out_of_range(
"invalid Vector2D subscript" );
255template<
typename Valtype>
260 throw std::out_of_range(
"invalid Vector2D subscript" );
263template<
typename Valtype>
270template<
typename Valtype>
274 return *
this == Null2D<Valtype>;
276 return *
this == Ex2D<Valtype>;
278 return *
this == Ey2D<Valtype>;
286template<
typename Valtype>
constexpr
291template<
typename Valtype>
293 decltype(Valtype{}/Valtype{}) L =
Length() / Valtype{1};
296 return decltype(Valtype{}/Valtype{}){0};
302template<
typename Valtype>
303template<
typename Valtype2>
309template<
typename Valtype>
constexpr
311 Valtype nl2 = normal * normal;
313 return Null2D<Valtype>;
315 return (*
this * normal) / nl2 * normal;
318template<
typename Valtype>
constexpr
323template<
typename Valtype>
326 return d*d <= epsilon_*epsilon_;
329template<
typename Valtype,
typename Valtype2>
331 static_assert(
sizeof(Valtype) ==
sizeof(Valtype2),
"Can not spatial_cast with different memory layout" );
335template<
typename Valtype,
typename Valtype2>
337 static_assert(
sizeof(Valtype) ==
sizeof(Valtype2),
"Can not spatial_cast with different memory layout" );
341template<
typename Valtype>
constexpr
343 return { v1.dx + v2.dx,
347template<
typename Valtype>
354template<
typename Valtype>
constexpr
356 return { +v.dx, +v.dy };
359template<
typename Valtype>
constexpr
361 return { v1.dx - v2.dx,
365template<
typename Valtype>
372template<
typename Valtype>
constexpr
374 return { -v.dx, -v.dy };
377template<
typename Valtype,
typename Valtype2>
constexpr
379 return v1.dx*v2.dx + v1.dy*v2.dy;
382template<
typename Valtype,
typename Valtype2>
constexpr
384 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
389template<
typename Valtype>
constexpr
391 return {
static_cast<int>(
static_cast<Valtype
>(v.dx) * f),
392 static_cast<int>(
static_cast<Valtype
>(v.dy) * f) };
395template<
typename Valtype,
typename Valtype2>
constexpr
397 static_assert( !std::is_integral<Valtype2>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
401template<
typename Valtype>
constexpr
406template<
typename Valtype,
typename Valtype2>
408 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
414template<
typename Valtype>
416 v.dx =
static_cast<int>(
static_cast<Valtype
>(v.dx) * f);
417 v.dy =
static_cast<int>(
static_cast<Valtype
>(v.dy) * f);
421template<
typename Valtype>
constexpr
423 return v1.dx * v2.dy - v1.dy * v2.dx;
426template<
typename Valtype,
typename Valtype2>
constexpr
428 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
433template<
typename Valtype>
constexpr
435 return {
static_cast<int>(
static_cast<Valtype
>(v.dx) / f),
436 static_cast<int>(
static_cast<Valtype
>(v.dy) / f) };
439template<
typename Valtype,
typename Valtype2>
441 static_assert( !std::is_integral<Valtype>::value,
"Possible data loss on integral values, proper implementation provided for int only!" );
447template<
typename Valtype>
449 v.dx =
static_cast<int>(
static_cast<Valtype
>(v.dx) / f);
450 v.dy =
static_cast<int>(
static_cast<Valtype
>(v.dy) / f);
454template<
typename Valtype>
constexpr
456 return v1.dx == v2.dx && v1.dy == v2.dy;
459template<
typename Valtype>
constexpr
464template<
typename Valtype>
466 Vector2D<
decltype(Valtype{}/Valtype{})> V{ v.dx / Valtype{1},
468 return std::make_pair( V.Normalize() * Valtype{1}, V );
constexpr Interval< Valtype > operator+(const Interval< Valtype > &i1, const Interval< Valtype > &i2) noexcept
Interval operator.
Definition Interval.h:591
constexpr Interval< Valtype > operator-(const Interval< Valtype > &i1, Valtype l) noexcept
Interval operator.
Definition Interval.h:613
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 > > sin(Value< Dimension< 0, 0, 0 > > a) noexcept
Dimensionated Values math function.
Definition DimensionedValues.h:694
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.
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 2D - vector in cartesian coordinates.
Definition Vector2D.h:46
specials
Identifiers for special vectors.
Definition Vector2D.h:54
@ null
Vector with all parameters zeroed.
Definition Vector2D.h:55
@ ex
Unit vector in x-direction.
Definition Vector2D.h:56
@ ey
Unit vector in y-direction.
Definition Vector2D.h:57
constexpr Vector2D ParallelProjection(const Vector2D &normal) const noexcept
Part of this tVector wich is parallel to normal.
Definition Vector2D.h:310
constexpr Vector2D() noexcept=default
Does not initialize the members.
auto Normalize() noexcept -> decltype(dim::Value< Dimension< 1, 0, 0 > >{}/dim::Value< Dimension< 1, 0, 0 > >{})
Definition Vector2D.h:292
Valtype dy
cartesian y component.
Definition Vector2D.h:50
constexpr Vector2D OrthogonalProjection(const Vector2D &normal) const noexcept
Calculate part of this tVector wich is orthogonal to normal.
Definition Vector2D.h:319
constexpr bool Equals(const Vector2D &v, Valtype epsilon=0) const noexcept
Comparison within some range. The area within two vectors regarded as equal is a sphere with radius e...
Definition Vector2D.h:324
Vector2D & Rotate(Valtype2 angle) noexcept
Rotate this vector with angle in radiants.
Vector2D & Init(specials s=specials::ex) noexcept
Definition Vector2D.h:264
constexpr dim::Value< Dimension< 1, 0, 0 > > Length() const noexcept
Definition Vector2D.h:287
Valtype dx
cartesian x component.
Definition Vector2D.h:49
constexpr bool Is(specials s) const noexcept
Definition Vector2D.h:271
Implements a 3D - vector in cartesian coordinates.
Definition Vector.h:48