Added DiscreteAgle
This commit is contained in:
		
						commit
						69e7ee1ab9
					
				
							
								
								
									
										26
									
								
								DiscreteAngle.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								DiscreteAngle.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | // This Source Code Form is subject to the terms of the Mozilla Public
 | ||||||
|  | // License, v. 2.0.If a copy of the MPL was not distributed with this
 | ||||||
|  | // file, You can obtain one at https ://mozilla.org/MPL/2.0/.
 | ||||||
|  | 
 | ||||||
|  | #include "DiscreteAngle.h" | ||||||
|  | 
 | ||||||
|  | #include <math.h> | ||||||
|  | 
 | ||||||
|  | DiscreteAngle16::DiscreteAngle16(float angle) : Range16() { | ||||||
|  |   if (!isfinite(angle)) { | ||||||
|  |     range = 0; | ||||||
|  |     return; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   // clamp the float range to -1..1
 | ||||||
|  |   while (angle <= -180.0F) | ||||||
|  |     angle += 360.0F; | ||||||
|  |   while (angle > 180.0F) | ||||||
|  |     angle -= 360.0F; | ||||||
|  | 
 | ||||||
|  |   // map (-180..180] to 1..65535
 | ||||||
|  |   // This means that range value 0 is not used
 | ||||||
|  |   this->range = (unsigned short)((angle + 180.0F) * 65535.0F); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | DiscreteAngle16 &DiscreteAngle16::operator-() { -this->range; } | ||||||
							
								
								
									
										14
									
								
								DiscreteAngle.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								DiscreteAngle.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | |||||||
|  | #ifndef DISCRETEANGLE_H | ||||||
|  | #define DISCRETEANGLE_H | ||||||
|  | 
 | ||||||
|  | #include "Range.h" | ||||||
|  | 
 | ||||||
|  | // A fixed point 16-bit signed angle between (-180..180]
 | ||||||
|  | class DiscreteAngle16 : public Range16 { | ||||||
|  | public: | ||||||
|  |   DiscreteAngle16(float angle); | ||||||
|  | 
 | ||||||
|  |   inline DiscreteAngle16 &operator-() override; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
							
								
								
									
										39
									
								
								Range.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								Range.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | |||||||
|  | #include "Range.h" | ||||||
|  | 
 | ||||||
|  | Range16::Range16() { this->range = 0; } | ||||||
|  | 
 | ||||||
|  | Range16::Range16(float f) { | ||||||
|  |   // clamp the float range to -1..1
 | ||||||
|  |   if (f < -1.0F) | ||||||
|  |     f = -1.0F; | ||||||
|  |   else if (f > 1.0F) | ||||||
|  |     f = 1.0F; | ||||||
|  | 
 | ||||||
|  |   // map -1..1 to 0..65535
 | ||||||
|  |   this->range = (unsigned short)((f + 1.0F) * 65535.0F); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Range16::Range16(short s) { | ||||||
|  |   // clamp the range to -32767..32767
 | ||||||
|  |   // This is needed because the representation can support +/-32768 (like 2s
 | ||||||
|  |   // complement)
 | ||||||
|  |   if (s < -32767) | ||||||
|  |     s = -32767; | ||||||
|  |   else if (s > 32767) | ||||||
|  |     s = 32767; | ||||||
|  | 
 | ||||||
|  |   this->range = (unsigned short)(s + 32767); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Range16 Range16::operator-(Range16 a) { this->range - a.range; }; | ||||||
|  | Range16 Range16::operator+(Range16 a) { this->range + a.range; }; | ||||||
|  | 
 | ||||||
|  | Range16 &Range16::operator-() { -this->range; } | ||||||
|  | 
 | ||||||
|  | bool Range16::operator==(Range16 a) { this->range == a.range; } | ||||||
|  | bool Range16::operator!=(Range16 a) { return (this->range != a.range); } | ||||||
|  | 
 | ||||||
|  | bool Range16::operator<(Range16 a) { return (this->range < a.range); } | ||||||
|  | bool Range16::operator>(Range16 a) { return (this->range > a.range); } | ||||||
|  | bool Range16::operator<=(Range16 a) { return (this->range <= a.range); } | ||||||
|  | bool Range16::operator>=(Range16 a) { return (this->range >= a.range); } | ||||||
							
								
								
									
										29
									
								
								Range.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								Range.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | |||||||
|  | #ifndef RANGE_H | ||||||
|  | #define RANGE_H | ||||||
|  | 
 | ||||||
|  | /// @brief Signed range. May be renamed to SignedRange later
 | ||||||
|  | class Range16 { | ||||||
|  | public: | ||||||
|  |   Range16(); | ||||||
|  |   Range16(float range); // range -1..1
 | ||||||
|  |   Range16(short range); // range -32768..32767
 | ||||||
|  | 
 | ||||||
|  |   inline Range16 operator-(Range16 a); | ||||||
|  |   inline Range16 operator+(Range16 a); | ||||||
|  |   inline virtual Range16 &operator-(); | ||||||
|  | 
 | ||||||
|  |   inline bool operator==(Range16 a); | ||||||
|  |   inline bool operator!=(Range16 a); | ||||||
|  | 
 | ||||||
|  |   inline bool operator<(Range16 a); | ||||||
|  |   inline bool operator>(Range16 a); | ||||||
|  |   inline bool operator<=(Range16 a); | ||||||
|  |   inline bool operator>=(Range16 a); | ||||||
|  | 
 | ||||||
|  | protected: | ||||||
|  |   // How do we make sure we have 16 bit range on every platform?
 | ||||||
|  |   // uint16_t range; // 16-bit range
 | ||||||
|  |   unsigned short range; // 16-bit range
 | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Pascal Serrarens
						Pascal Serrarens