Trax3 3.1.0
trax track library
Loading...
Searching...
No Matches
Position.h
1// trax track library
2// AD 2013
3//
4// "I saw a werewolve with a chinese menue in his hand"
5//
6// Warren Zevon
7//
8// Copyright (c) 2025 Trend Redaktions- und Verlagsgesellschaft mbH
9// Copyright (c) 2019 Marc-Michael Horstmann
10//
11// Permission is hereby granted to any person obtaining a copy of this software
12// and associated source code (the "Software"), to use, view, and study the
13// Software for personal or internal business purposes, subject to the following
14// conditions:
15//
16// 1. Redistribution, modification, sublicensing, or commercial use of the
17// Software is NOT permitted without prior written consent from the copyright
18// holder.
19//
20// 2. The Software is provided "AS IS", without warranty of any kind, express
21// or implied.
22//
23// 3. All copies of the Software must retain this license notice.
24//
25// For further information, please contact: horstmann.marc@trendverlag.de
26
27#pragma once
28
29#include "common/Helpers.h"
30
31
32namespace spat{
33
34 template<typename> struct Vector;
35 template<typename> struct PositionH;
36 template<typename> struct Position2D;
37 template<typename,typename> struct VectorBundle;
38
39
44 template<typename Valtype>
45 struct Position
46 {
47 typedef Valtype value_type;
48
49 Valtype x;
50 Valtype y;
51 Valtype z;
52
53
63 constexpr Position() noexcept = default;
64 constexpr Position( Valtype x, Valtype y, Valtype z ) noexcept;
65 explicit Position( const Vector<Valtype>& v ) = delete;
66 template<typename Valtype2>
67 explicit constexpr Position( const VectorBundle<Valtype,Valtype2>& b ) noexcept;
68 explicit constexpr Position( const Position2D<Valtype>& p ) noexcept;
69 template<typename Valtype2>
70 explicit constexpr Position( const PositionH<Valtype2>& pos ) noexcept;
71 template<typename Valtype2>
72 explicit Position( const Valtype2* pVal ) noexcept;
74
75
81 Position& operator=( const Position2D<Valtype>& p2d ) noexcept;
82
83 template<typename Valtype2>
84 Position& operator=( const Valtype2* pVal ) noexcept;
86
87
91 const Valtype& operator[]( size_t index ) const;
92
93 Valtype& operator[]( size_t index );
95
96
98 Valtype* ptr() noexcept;
99
100
102 const Valtype* ptr() const noexcept;
103
104
106 Position& Init() noexcept;
107
108
110 Position& Transport( const Vector<Valtype>& v ) noexcept;
111
112
116 template<typename Valtype2>
117 Position& Rotate( const VectorBundle<Valtype,Valtype2>& axis ) noexcept;
118
119
124 template<typename Valtype2>
125 Position& Rotate( const VectorBundle<Valtype,Valtype2>& axis, Valtype2 angle ) noexcept;
126
127
133 constexpr bool Equals( const Position& p, Valtype epsilon = Valtype{0} ) const noexcept;
134
135
137 Position& Round( int toDigit ) noexcept;
138 };
139
140
142 template<typename Valtype>
143 constexpr Position<Valtype> Origin3D{Valtype{0},Valtype{0},Valtype{0}};
144
146 template<typename Valtype,typename Valtype2>
147 Position<Valtype>& spatial_cast( Position<Valtype2>& from ) noexcept;
148
150 template<typename Valtype,typename Valtype2>
151 const Position<Valtype>& spatial_cast( const Position<Valtype2>& from ) noexcept;
152
153
166
168 template<typename Valtype> constexpr
169 Position<Valtype> operator+( const Position<Valtype>&, const Position<Valtype>& ) = delete;
170 template<typename Valtype> constexpr
171 Position<Valtype> operator+( const Position<Valtype>& p, const Vector<Valtype>& v ) noexcept;
172 template<typename Valtype> constexpr
173 Position<Valtype> operator+( const Vector<Valtype>&, const Position<Valtype>& ) = delete;
174 template<typename Valtype>
176 template<typename Valtype>
178 template<typename Valtype>
180 template<typename Valtype> constexpr
181 Position<Valtype> operator+( const Position<Valtype>& ) = delete;
182 template<typename Valtype> constexpr
183 Vector<Valtype> operator-( const Position<Valtype>& p1, const Position<Valtype>& p2 ) noexcept;
184 template<typename Valtype> constexpr
185 Position<Valtype> operator-( const Position<Valtype>& p, const Vector<Valtype>& v ) noexcept;
186 template<typename Valtype> constexpr
187 Position<Valtype> operator-( const Vector<Valtype>&, const Position<Valtype>& ) = delete;
188 template<typename Valtype>
190 template<typename Valtype>
192 template<typename Valtype> constexpr
193 Position<Valtype> operator-( const Position<Valtype>& ) = delete;
194 template<typename Valtype> constexpr
196 template<typename Valtype> constexpr
197 auto operator*( Valtype f, const Position<Valtype>& p ) noexcept -> Position<decltype(Valtype{}*Valtype{})>;
198 template<typename Valtype> constexpr
199 auto operator*( const Position<Valtype>& p, Valtype f ) noexcept -> Position<decltype(Valtype{}*Valtype{})>;
200 template<typename Valtype,typename Valtype2> constexpr
201 auto operator*( Valtype f, const Position<Valtype2>& p ) noexcept -> Position<decltype(Valtype{}*Valtype2{})>;
202 template<typename Valtype,typename Valtype2> constexpr
203 auto operator*( const Position<Valtype>& p, Valtype2 f ) noexcept -> Position<decltype(Valtype{}*Valtype2{})>;
204 template<typename Valtype,typename Valtype2>
205 Position<Valtype>& operator*=( Position<Valtype>& p, Valtype2 f ) noexcept;
206 template<typename Valtype>
207 Valtype& operator*=( Valtype&, const Position<Valtype>& ) = delete;
208 template<typename Valtype> constexpr
210 template<typename Valtype>
212 template<typename Valtype> constexpr
213 Valtype operator/( const Position<Valtype>& , const Position<Valtype>& ) = delete;
214 template<typename Valtype,typename Valtype2> constexpr
215 auto operator/( const Position<Valtype>& p, Valtype2 f ) noexcept -> Position<decltype(Valtype{}/Valtype2{})>;
216 template<typename Valtype> constexpr
217 Position<Valtype> operator/( Valtype f, const Position<Valtype>& p ) = delete;
218 template<typename Valtype,typename Valtype2>
219 Position<Valtype>& operator/=( Position<Valtype>& p, Valtype2 f ) noexcept;
220 template<typename Valtype> constexpr
221 bool operator==( const Position<Valtype>& p1, const Position<Valtype>& p2 ) noexcept;
222 template<typename Valtype> constexpr
223 bool operator!=( const Position<Valtype>& p1, const Position<Valtype>& p2 ) noexcept;
225
226
227 template<typename Valtype>
228 constexpr size_t size( const Position<Valtype> ) noexcept {
229 return 3;
230 }
231
232
233template<typename Valtype>
234inline constexpr Position<Valtype>::Position( Valtype x, Valtype y, Valtype z ) noexcept
235 : x{x}, y{y}, z{z}
236{}
237
238template<typename Valtype>
239template<typename Valtype2>
241 : x{b.P.x}, y{b.P.y}, z{b.P.z}
242{}
243
244template<typename Valtype>
245inline constexpr Position<Valtype>::Position( const Position2D<Valtype>& p ) noexcept
246 : x{p.x}, y{p.y}, z{0}
247{}
248
249template<typename Valtype>
250template<typename Valtype2>
251inline constexpr Position<Valtype>::Position( const PositionH<Valtype2>& p ) noexcept
252 : x{p.x/p.w}, y{p.y/p.w}, z{p.z/p.w}
253{}
254
255template<typename Valtype>
256template<typename Valtype2>
257inline Position<Valtype>::Position( const Valtype2* pVal ) noexcept
258 : x{Valtype{static_cast<Valtype>(pVal[0])}},
259 y{Valtype{static_cast<Valtype>(pVal[1])}},
260 z{Valtype{static_cast<Valtype>(pVal[2])}}
261{}
262
263template<typename Valtype>
264inline Position<Valtype>& Position<Valtype>::operator=( const Position2D<Valtype>& p2d ) noexcept{
265 x = p2d.x; y = p2d.y;
266 return *this;
267}
268
269template<typename Valtype>
270template<typename Valtype2>
271inline Position<Valtype>& Position<Valtype>::operator=( const Valtype2* pVal ) noexcept{
272 x = Valtype{pVal[0]};
273 y = Valtype{pVal[1]};
274 z = Valtype{pVal[2]};
275 return *this;
276}
277
278template<typename Valtype>
279template<typename Valtype2>
281{
283 Valtype2 angle = r.T.Normalize();
284
285 return Rotate( r, angle );
286}
287
288template<typename Valtype>
289template<typename Valtype2>
290inline Position<Valtype>& Position<Valtype>::Rotate( const VectorBundle<Valtype,Valtype2>& axis, Valtype2 angle ) noexcept
291{
292 Vector<Valtype> D = (*this - axis.P);
293 Vector<Valtype> Dp = D * axis.T * axis.T;
294 Vector<Valtype> Do = D - Dp;
295 *this = axis.P + Dp + cos(angle) * Do + axis.T % Do * sin(angle);
296 return *this;
297}
298
299template<typename Valtype>
300inline const Valtype& Position<Valtype>::operator[]( size_t index ) const{
301 if( index < 3 )
302 return (&x)[index];
303
304 throw std::out_of_range( "invalid Position subscript" );
305}
306
307template<typename Valtype>
308inline Valtype& Position<Valtype>::operator[]( size_t index ){
309 if( index < 3 )
310 return (&x)[index];
311
312 throw std::out_of_range( "invalid Position subscript" );
313}
314
315template<typename Valtype>
316inline Valtype* Position<Valtype>::ptr() noexcept{
317 return &x;
318}
319
320template<typename Valtype>
321inline const Valtype* Position<Valtype>::ptr() const noexcept{
322 return &x;
323}
324
325template<typename Valtype>
327 *this = Origin3D<Valtype>;
328 return *this;
329}
330
331template<typename Valtype>
333 x += v.dx;
334 y += v.dy;
335 z += v.dz;
336 return *this;
337}
338
339template<typename Valtype>
340inline constexpr bool Position<Valtype>::Equals( const Position<Valtype>& p, Valtype epsilon_ ) const noexcept{
341 const Vector<Valtype> d{ *this - p };
342 return d*d <= epsilon_*epsilon_;
343}
344
345template<typename Valtype>
346inline Position<Valtype>& Position<Valtype>::Round( int toDigit ) noexcept{
347 x = common::Round(x,toDigit);
348 y = common::Round(y,toDigit);
349 z = common::Round(z,toDigit);
350 return *this;
351}
352
353template<typename Valtype,typename Valtype2>
355 static_assert( sizeof(Valtype) == sizeof(Valtype2), "Can not spatial_cast with different memory layout" );
356 return reinterpret_cast<Position<Valtype>&>(from);
357}
358
359template<typename Valtype,typename Valtype2>
360inline const Position<Valtype>& spatial_cast( const Position<Valtype2>& from ) noexcept{
361 static_assert( sizeof(Valtype) == sizeof(Valtype2), "Can not spatial_cast with different memory layout" );
362 return reinterpret_cast<const Position<Valtype>&>(from);
363}
364
365template<typename Valtype> constexpr
366inline Position<Valtype> operator+( const Position<Valtype>& p, const Vector<Valtype>& v ) noexcept{
367 return { p.x + v.dx,
368 p.y + v.dy,
369 p.z + v.dz };
370}
371
372template<typename Valtype>
374 p.Transport( v );
375 return p;
376}
377
378template<typename Valtype> constexpr
379inline Vector<Valtype> operator-( const Position<Valtype>& p1, const Position<Valtype>& p2 ) noexcept{
380 return { p1.x - p2.x,
381 p1.y - p2.y,
382 p1.z - p2.z };
383}
384
385template<typename Valtype> constexpr
386inline Position<Valtype> operator-( const Position<Valtype>& p, const Vector<Valtype>& v ) noexcept{
387 return { p.x - v.dx,
388 p.y - v.dy,
389 p.z - v.dz };
390}
391
392template<typename Valtype>
394 p.x -= v.dx;
395 p.y -= v.dy;
396 p.z -= v.dz;
397 return p;
398}
399
400template<typename Valtype> constexpr
401inline auto operator*( Valtype f, const Position<Valtype>& p ) noexcept -> Position<decltype(Valtype{}*Valtype{})>{
402 return { p.x * f,
403 p.y * f,
404 p.z * f };
405}
406template<typename Valtype> constexpr
407inline auto operator*( const Position<Valtype>& p, Valtype f ) noexcept -> Position<decltype(Valtype{}*Valtype{})>{
408 return f * p;
409}
410
411template<typename Valtype,typename Valtype2> constexpr
412inline auto operator*( Valtype f, const Position<Valtype2>& p ) noexcept -> Position<decltype(Valtype{}*Valtype2{})>{
413 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
414 return { p.x * f,
415 p.y * f,
416 p.z * f };
417}
418
419template<typename Valtype,typename Valtype2> constexpr
420inline auto operator*( const Position<Valtype>& p, Valtype2 f ) noexcept -> Position<decltype(Valtype{}*Valtype2{})>{
421 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
422 return f * p;
423}
424
425template<typename Valtype> constexpr
426inline Position<int> operator*( const Position<int>& p, Valtype f ) noexcept{
427 return { static_cast<int>(static_cast<Valtype>(p.x) * f),
428 static_cast<int>(static_cast<Valtype>(p.y) * f),
429 static_cast<int>(static_cast<Valtype>(p.z) * f) };
430}
431
432template<typename Valtype> constexpr
433inline Position<int> operator*( Valtype f, const Position<int>& p ) noexcept{
434 return p * f;
435}
436
437template<typename Valtype,typename Valtype2>
438inline Position<Valtype>& operator*=( Position<Valtype>& p, Valtype2 f ) noexcept{
439 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
440 p.x *= f;
441 p.y *= f;
442 p.z *= f;
443 return p;
444}
445
446template<typename Valtype>
447inline Position<int>& operator*=( Position<int>& p, Valtype f ) noexcept{
448 p.x = static_cast<int>(static_cast<Valtype>(p.x) * f);
449 p.y = static_cast<int>(static_cast<Valtype>(p.y) * f);
450 p.z = static_cast<int>(static_cast<Valtype>(p.z) * f);
451 return p;
452}
453
454template<typename Valtype,typename Valtype2> constexpr
455inline auto operator/( const Position<Valtype>& p, Valtype2 f ) noexcept -> Position<decltype(Valtype{}/Valtype2{})>{
456 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
457 return { p.x / f,
458 p.y / f,
459 p.z / f };
460}
461
462template<typename Valtype> constexpr
463inline Position<int> operator/( const Position<int>& p, Valtype f ) noexcept{
464 return { static_cast<int>(static_cast<Valtype>(p.x) / f),
465 static_cast<int>(static_cast<Valtype>(p.y) / f),
466 static_cast<int>(static_cast<Valtype>(p.z) / f) };
467}
468
469template<typename Valtype,typename Valtype2>
470inline Position<Valtype>& operator/=( Position<Valtype>& p, Valtype2 f ) noexcept{
471 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
472 p.x /= f;
473 p.y /= f;
474 p.z /= f;
475 return p;
476}
477
478template<typename Valtype> constexpr
479inline Position<int>& operator/=( Position<int>& p, Valtype f ) noexcept{
480 p.x = static_cast<int>(static_cast<Valtype>(p.x) / f);
481 p.y = static_cast<int>(static_cast<Valtype>(p.y) / f);
482 p.z = static_cast<int>(static_cast<Valtype>(p.z) / f);
483 return p;
484}
485
486template<typename Valtype> constexpr
487inline bool operator==( const Position<Valtype>& p1, const Position<Valtype>& p2 ) noexcept{
488 return (p1.x == p2.x && p1.y == p2.y && p1.z == p2.z);
489}
490
491template<typename Valtype> constexpr
492inline bool operator!=( const Position<Valtype>& p1, const Position<Valtype>& p2 ) noexcept{
493 return !(p1 == p2);
494}
495
496} // namespace spat
T Round(T value, int toDigit) noexcept
Rounding of floating point number to a certain digit aftzer the point.
Definition Helpers.h:140
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 Position< Valtype > Origin3D
Origin of coordinate system.
Definition Position.h:143
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 4D - position in homogenous coordinates.
Definition PositionH.h:41
Implements a 3D - position in cartesian coordinates.
Definition Position.h:46
Position & Round(int toDigit) noexcept
Rounds the positions values to a certain digit after the point.
Definition Position.h:346
Position & Init() noexcept
Definition Position.h:326
Valtype y
cartesian y coordinate.
Definition Position.h:50
Valtype z
cartesian z coordinate.
Definition Position.h:51
Position & Rotate(const VectorBundle< Valtype, Valtype2 > &axis) noexcept
Rotates a position by axis (length of axis.T make angle in radints).
constexpr Position() noexcept=default
Does not initialize the members.
dim::Value< Dimension< 1, 0, 0 > > * ptr() noexcept
Definition Position.h:316
constexpr bool Equals(const Position &p, dim::Value< Dimension< 1, 0, 0 > > epsilon=dim::Value< Dimension< 1, 0, 0 > >{0}) const noexcept
Definition Position.h:340
Valtype x
cartesian x coordinate.
Definition Position.h:49
Position & Transport(const Vector< dim::Value< Dimension< 1, 0, 0 > > > &v) noexcept
Definition Position.h:332
Implements a Vector bundle.
Definition VectorBundle.h:42
Implements a 3D - vector in cartesian coordinates.
Definition Vector.h:48