Trax3 3.1.0
trax track library
Loading...
Searching...
No Matches
Position2D.h
1// trax track library
2// AD 2013
3//
4// "l'etat c'est moi"
5//
6// Louis Quatorze
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 <stdexcept>
30#include <type_traits>
31
32
33namespace spat{
34
35 template<typename> struct Vector2D;
36 template<typename> struct Position;
37
38
43 template<typename Valtype>
45 {
46 typedef Valtype value_type;
47
48 Valtype x;
49 Valtype y;
50
51
59 constexpr Position2D() noexcept = default;
60 constexpr Position2D( Valtype x, Valtype y ) noexcept;
61 explicit Position2D( const Vector2D<Valtype>& ) = delete;
62 explicit constexpr Position2D( const Position<Valtype>& pos ) noexcept;
63 template<typename Valtype2>
64 explicit Position2D( const Valtype2* pVal ) noexcept;
66
69 Position2D& operator=( const Position<Valtype>& p ) noexcept;
71
72
76 const Valtype& operator[]( size_t index ) const;
77
78 Valtype& operator[]( size_t index );
80
81
83 Position2D& Init() noexcept;
84
85
87 Position2D& Transport ( const Vector2D<Valtype>& v ) noexcept;
88
89
95 constexpr bool Equals( const Position2D& p, Valtype epsilon = 0 ) const noexcept;
96 };
97
98
100 template<typename Valtype>
101 constexpr Position2D<Valtype> Origin2D{Valtype{0},Valtype{0}};
102
103
115 template<typename Valtype> constexpr
116 Position2D<Valtype> operator+( const Position2D<Valtype>&, const Position2D<Valtype>& ) = delete;
117 template<typename Valtype> constexpr
118 Position2D<Valtype> operator+( const Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept;
119 template<typename Valtype> constexpr
120 Position2D<Valtype> operator+( const Vector2D<Valtype>&, const Position2D<Valtype>& ) = delete;
121 template<typename Valtype>
123 template<typename Valtype>
124 Position2D<Valtype>& operator+=( Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept;
125 template<typename Valtype>
126 Vector2D<Valtype>& operator+=( Vector2D<Valtype>&, const Position2D<Valtype>& ) = delete;
127 template<typename Valtype> constexpr
128 Position2D<Valtype> operator+( const Position2D<Valtype>& ) = delete;
129 template<typename Valtype> constexpr
130 Vector2D<Valtype> operator-( const Position2D<Valtype>& p1, const Position2D<Valtype>& p2 ) noexcept;
131 template<typename Valtype> constexpr
132 Position2D<Valtype> operator-( const Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept;
133 template<typename Valtype> constexpr
134 Position2D<Valtype> operator-( const Vector2D<Valtype>&, const Position2D<Valtype>& ) = delete;
135 template<typename Valtype>
137 template<typename Valtype>
138 Position2D<Valtype>& operator-=( Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept;
139 template<typename Valtype> constexpr
140 Position2D<Valtype> operator-( const Position2D<Valtype>& ) = delete;
141 template<typename Valtype> constexpr
143 template<typename Valtype,typename Valtype2> constexpr
144 auto operator*( const Position2D<Valtype>& p, Valtype2 f ) noexcept -> Position2D<decltype(Valtype{}*Valtype2{})>;
145 template<typename Valtype,typename Valtype2> constexpr
146 auto operator*( Valtype f, const Position2D<Valtype2>& p ) noexcept -> Position2D<decltype(Valtype{}*Valtype2{})>;
147 template<typename Valtype,typename Valtype2>
148 Position2D<Valtype>& operator*=( Position2D<Valtype>& p, const Valtype2& f ) noexcept;
149 template<typename Valtype,typename Valtype2>
150 Valtype2& operator*=( Valtype2&, const Position2D<Valtype>& ) = delete;
151 template<typename Valtype> constexpr
153 template<typename Valtype>
155 template<typename Valtype> constexpr
156 Valtype operator/( const Position2D<Valtype>& , const Position2D<Valtype>& ) = delete;
157 template<typename Valtype,typename Valtype2> constexpr
158 auto operator/( const Position2D<Valtype>& p, Valtype2 f ) noexcept -> Position2D<decltype(Valtype{}/Valtype2{})>;
159 template<typename Valtype> constexpr
160 Position2D<Valtype> operator/( Valtype f, const Position2D<Valtype>& p ) = delete;
161 template<typename Valtype,typename Valtype2>
162 Position2D<Valtype>& operator/=( Position2D<Valtype>& p, const Valtype2& f ) noexcept;
163 template<typename Valtype> constexpr
164 bool operator==( const Position2D<Valtype>& p1, const Position2D<Valtype>& p2 ) noexcept;
165 template<typename Valtype> constexpr
166 bool operator!=( const Position2D<Valtype>& p1, const Position2D<Valtype>& p2 ) noexcept;
168
169 template<typename Valtype>
170 constexpr size_t size( const Position2D<Valtype> ) noexcept {
171 return 2;
172 }
173
174template<typename Valtype>
175inline constexpr Position2D<Valtype>::Position2D( Valtype x, Valtype y ) noexcept
176 : x{x}, y{y}
177{}
178
179template<typename Valtype>
180inline constexpr Position2D<Valtype>::Position2D( const Position<Valtype>& pos ) noexcept
181 : x{pos.x}, y{pos.y}
182{}
183
184template<typename Valtype>
185template<typename Valtype2>
186inline Position2D<Valtype>::Position2D( const Valtype2* pVal ) noexcept
187 : x{Valtype{pVal[0]}},
188 y{Valtype{pVal[1]}}
189{}
190
191template<typename Valtype>
192inline Position2D<Valtype>& Position2D<Valtype>::operator=( const Position<Valtype>& p ) noexcept{
193 x = p.x;
194 y = p.y;
195 return *this;
196}
197
198template<typename Valtype>
199inline const Valtype& Position2D<Valtype>::operator[]( size_t index ) const{
200 if( index < 2 )
201 return (&x)[index];
202
203 throw std::out_of_range( "invalid Position2D subscript" );
204}
205
206template<typename Valtype>
207inline Valtype& Position2D<Valtype>::operator[]( size_t index ){
208 if( index < 2 )
209 return (&x)[index];
210
211 throw std::out_of_range( "invalid Position2D subscript" );
212}
213
214template<typename Valtype>
216 *this = Origin2D<Valtype>;
217 return *this;
218}
219
220template<typename Valtype>
222 x += v.dx;
223 y += v.dy;
224 return *this;
225}
226
227template<typename Valtype>
228inline constexpr bool Position2D<Valtype>::Equals( const Position2D<Valtype>& p, Valtype epsilon_ ) const noexcept{
229 Vector2D<Valtype> d{ *this - p };
230 return d*d <= epsilon_*epsilon_;
231}
232
233template<typename Valtype> constexpr
234inline Position2D<Valtype> operator+( const Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept{
235 return { p.x + v.dx,
236 p.y + v.dy };
237}
238
239template<typename Valtype>
240inline Position2D<Valtype>& operator+=( Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept{
241 p.Transport( v );
242 return p;
243}
244
245template<typename Valtype> constexpr
246inline Vector2D<Valtype> operator-( const Position2D<Valtype>& p1, const Position2D<Valtype>& p2 ) noexcept{
247 return { p1.x - p2.x,
248 p1.y - p2.y };
249}
250
251template<typename Valtype> constexpr
252inline Position2D<Valtype> operator-( const Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept{
253 return { p.x - v.dx,
254 p.y - v.dy };
255}
256
257template<typename Valtype>
258inline Position2D<Valtype>& operator-=( Position2D<Valtype>& p, const Vector2D<Valtype>& v ) noexcept{
259 p.x -= v.x;
260 p.y -= v.y;
261 return p;
262}
263
264template<typename Valtype,typename Valtype2> constexpr
265inline auto operator*( const Position2D<Valtype>& p, Valtype2 f ) noexcept -> Position2D<decltype(Valtype{}*Valtype2{})>{
266 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
267 return { p.x * f,
268 p.y * f };
269}
270
271template<typename Valtype> constexpr
272inline Position2D<int> operator*( const Position2D<int>& p, Valtype f ) noexcept{
273 return { static_cast<int>(static_cast<Valtype>(p.x) * f),
274 static_cast<int>(static_cast<Valtype>(p.y) * f) };
275}
276
277template<typename Valtype,typename Valtype2> constexpr
278inline auto operator*( Valtype f, const Position2D<Valtype2>& p ) noexcept -> Position2D<decltype(Valtype{}*Valtype2{})>{
279 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
280 return p * f;
281}
282
283template<typename Valtype> constexpr
284inline Position2D<int> operator*( Valtype f, const Position2D<int>& p ) noexcept{
285 return p * f;
286}
287
288template<typename Valtype,typename Valtype2>
289inline Position2D<Valtype>& operator*=( Position2D<Valtype>& p, const Valtype2& f ) noexcept{
290 p.x *= f;
291 p.y *= f;
292 return p;
293}
294
295template<typename Valtype>
296inline Position2D<int>& operator*=( Position2D<int>& p, Valtype f ) noexcept{
297 p.x = static_cast<int>(static_cast<Valtype>(p.x) * f);
298 p.y = static_cast<int>(static_cast<Valtype>(p.y) * f);
299 return p;
300}
301
302template<typename Valtype,typename Valtype2> constexpr
303inline auto operator/( const Position2D<Valtype>& p, Valtype2 f ) noexcept -> Position2D<decltype(Valtype{}/Valtype2{})>{
304 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
305 return { p.x / f,
306 p.y / f };
307}
308
309template<typename Valtype> constexpr
310inline Position2D<int> operator/( const Position2D<int>& p, Valtype f ) noexcept{
311 return { static_cast<int>(static_cast<Valtype>(p.x) / f),
312 static_cast<int>(static_cast<Valtype>(p.y) / f) };
313}
314
315template<typename Valtype,typename Valtype2> constexpr
316inline Position2D<Valtype>& operator/=( Position2D<Valtype>& p, Valtype2 f ) noexcept{
317 static_assert( !std::is_integral<Valtype>::value, "Possible data loss on integral values, proper implementation provided for int only!" );
318 p.x /= f;
319 p.y /= f;
320 return p;
321}
322
323template<typename Valtype>
324inline Position2D<int>& operator/=( Position2D<int>& p, Valtype f ) noexcept{
325 p.x = static_cast<int>(static_cast<Valtype>(p.x) / f);
326 p.y = static_cast<int>(static_cast<Valtype>(p.y) / f);
327 return p;
328}
329
330template<typename Valtype> constexpr
331inline bool operator==( const Position2D<Valtype>& p1, const Position2D<Valtype>& p2 ) noexcept{
332 return (p1.x == p2.x && p1.y == p2.y );
333}
334
335template<typename Valtype> constexpr
336inline bool operator!=( const Position2D<Valtype>& p1, const Position2D<Valtype>& p2 ) noexcept{
337 return !(p1 == p2);
338}
339
340} // namespace spat
constexpr bool operator!=(const Interval< Valtype > &i1, const Interval< Valtype > &i2) noexcept
Interval operator.
Definition Interval.h:701
constexpr bool operator==(const Interval< Valtype > &i1, const Interval< Valtype > &i2) noexcept
Interval operator.
Definition Interval.h:696
constexpr Interval< Valtype > & operator/=(Interval< Valtype > &i1, Valtype2 scalar) noexcept
Interval operator.
Definition Interval.h:650
constexpr Interval< Valtype > operator-(const Interval< Valtype > &i1, Valtype l) noexcept
Interval operator.
Definition Interval.h:613
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
constexpr Position2D< Valtype > Origin2D
Origin of coordinate system.
Definition Position2D.h:101
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
constexpr Valtype operator/(const Position< Valtype > &, const Position< Valtype > &)=delete
Position operator.
Implements a 2D - position in cartesian coordinates.
Definition Position2D.h:45
constexpr bool Equals(const Position2D &p, dim::Value< Dimension< 1, 0, 0 > > epsilon=0) const noexcept
Definition Position2D.h:228
constexpr Position2D() noexcept=default
Does not initialize the members.
Position2D & Init() noexcept
Definition Position2D.h:215
Valtype x
cartesian x coordinate
Definition Position2D.h:48
Valtype y
cartesian y coordinate
Definition Position2D.h:49
Position2D & Transport(const Vector2D< dim::Value< Dimension< 1, 0, 0 > > > &v) noexcept
Definition Position2D.h:221
Implements a 3D - position in cartesian coordinates.
Definition Position.h:46
Implements a 2D - vector in cartesian coordinates.
Definition Vector2D.h:46