libMVRgdtf 40bc00a
A library for GDTF and MVR
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
BasicMath.X.h
Go to the documentation of this file.
1//
2// Copyright Nemetschek Vectorworks, Inc.
3// Use of this file is governed by the Nemetschek Vectorworks SDK License Agreement
4// http://developer.vectorworks.net/index.php?title=Vectorworks_SDK_License
5//
6//
7// Contains basic math stuff. See also MCFloat.h and .cpp
8//
9
10#ifndef _BASICMATH_X_H_
11#define _BASICMATH_X_H_ 1
12
13#pragma once
14
15#if _WINDOWS
16#include <Math.h>
17#endif
18
19#include "MCFloat.h"
20
21
23// Basic mathematical constants
24
25// these are currently defined in MCCoordTypes.cpp
26
27extern const double PI;
28extern const double kDegreesPerRadian;
29extern const double kRadiansPerDegree;
30extern const double kGradiansPerDegree;
31extern const double kDegreesPerGradian;
32const extern double kHalfPi;
33const extern double kThreePiOver2;
34const extern double kTwoPi;
35
36
37
39//inline Real64 Abs(Real64 x) { return (Real64)fabs(x); }
40inline double Abs(double x) { return (x >= 0) ? x : -x; } // six times faster than fabs on Windows (and maybe Intel Mac?) // [MAF 12/22/05]
41inline Sint32 Abs(Sint32 x) { return (Sint32)labs(x); }
42inline short Abs(short x) { return abs(x); }
43inline char Abs(char x) { return abs(x); }
44inline signed char Abs(signed char x) { return abs(x); }
45
46
47//---------------------------------------------------------------------------------------
48inline Real32 Truncate(const Real32 fromValue)
49//
50// Description:
51// Truncates specified float value.
52//
53// Parameters:
54// fromValue - input - value to truncate.
55//
56// Returns:
57// float - truncated value.
58//
59// Created by Victor Long on 04/09/2004.
60//
61{
62 Real32 toValue;
63#if GS_WIN
64 modf(fromValue, &toValue);
65#else
66 modff(fromValue, &toValue);
67#endif
68
69 return toValue;
70}
71
72//---------------------------------------------------------------------------------------
73inline Real64 Truncate(const Real64 fromValue)
74//
75// Description:
76// Truncates specified double value.
77//
78// Parameters:
79// fromValue - input - value to truncate.
80//
81// Returns:
82// double - truncated value.
83//
84// Created by Victor Long on 04/09/2004.
85//
86{
87 Real64 toValue;
88
89 modf(fromValue, &toValue);
90
91 return toValue;
92}
93
94//---------------------------------------------------------------------------------------
95inline Real32 Round(Real32 value)
96//
97// Description:
98// Rounds specified float value.
99//
100// Parameters:
101// value - input - value to round.
102//
103// Returns:
104// float - rounded value.
105//
106// Created by Victor Long on 04/09/2004.
107//
108{
109 return (floor(value + (float)0.5));
110}
111
112//---------------------------------------------------------------------------------------
113inline Real64 Round(Real64 value)
114//
115// Description:
116// Rounds specified double value.
117//
118// Parameters:
119// value - input - value to round.
120//
121// Returns:
122// double - rounded value.
123//
124// Created by Victor Long on 04/09/2004.
125//
126{
127 return (floor(value + 0.5));
128}
129
130//---------------------------------------------------------------------------------------
131inline long double Round(long double value)
132//
133// Description:
134// Rounds specified long double value.
135//
136// Parameters:
137// value - input - value to round.
138//
139// Returns:
140// long double - rounded value.
141//
142// Created by Victor Long on 04/09/2004.
143//
144{
145 return (floor(value + 0.5));
146}
147
148//---------------------------------------------------------------------------------------
150//
151// Description:
152// Rounds specified double value to 5 decimal places.
153//
154// Parameters:
155// value - input - value to round.
156//
157// Returns:
158// double - rounded value.
159//
160// Created by Hugues Tsafak on 02/12/2013.
161//
162{
163 return (floor(value*100000 + 0.5)/100000);
164}
165
166//---------------------------------------------------------------------------------------
167inline Real64 RoundDown(Real64 value, int decimal_places)
168//
169// Description:
170// Rounds down the specified double value to the specified number of decimal places.
171//
172// Parameters:
173// value - input - value to round.
174// decimal_places - input - number of decimal places
175//
176// Returns:
177// double - rounded value.
178//
179// Created by Hugues Tsafak on 02/12/2013.
180//
181{
182 return (floor(value* pow(10, decimal_places))/pow(10, decimal_places));
183}
184
185//---------------------------------------------------------------------------------------
186inline Real64 RoundUp(Real64 value, int decimal_places)
187//
188// Description:
189// Rounds up the specified double value to the specified number of decimal places.
190//
191// Parameters:
192// value - input - value to round.
193// decimal_places - input - number of decimal places
194//
195// Returns:
196// double - rounded value.
197//
198// Created by Hugues Tsafak on 02/12/2013.
199//
200{
201 return (ceil(value* pow(10, decimal_places))/pow(10, decimal_places));
202}
203
205// Min and Max, 2 to 6 parameter versions. JDW.
206
207template<class T> inline T Max(T a, T b) { return( a > b ? a : b ); }
208template<class T> inline T Min(T a, T b) { return( a < b ? a : b ); }
209template<class T> inline T Max(T a, T b, T c) { return Max(Max(a,b), c); }
210template<class T> inline T Min(T a, T b, T c) { return Min(Min(a,b), c); }
211template<class T> inline T Max(T a, T b, T c, T d) { return Max(Max(a,b), Max(c,d)); }
212template<class T> inline T Min(T a, T b, T c, T d) { return Min(Min(a,b), Min(c,d)); }
213template<class T> inline T Max(T a, T b, T c, T d, T e) { return Max(Max(a,b), Max(c,d,e)); }
214template<class T> inline T Min(T a, T b, T c, T d, T e) { return Min(Min(a,b), Min(c,d,e)); }
215template<class T> inline T Max(T a, T b, T c, T d, T e, T f) { return Max(Max(a,b), Max(c,d), Max(e,f)); }
216template<class T> inline T Min(T a, T b, T c, T d, T e, T f) { return Min(Min(a,b), Min(c,d), Min(e,f)); }
217
218
220
221#if 0
222 // These will always give the correct result, even on compilers
223 // that use logical shift for >>.
224 inline Sint32 Div2(Sint32 x) { return (x < 0 ? -((-x)>>1) : x >> 1); }
225 inline Sint32 Div4(Sint32 x) { return (x < 0 ? -((-x)>>2) : x >> 2); }
226 inline Sint32 ASR(Sint32 x, short shiftBy) { return (x < 0 ? -((-x)>>shiftBy) : x >> shiftBy); }
227
228#else
229 // Use these if the compiler uses arithmetic shift for >>.
230 inline Sint32 Div2(Sint32 x) { return x >> 1; }
231 inline Sint32 Div4(Sint32 x) { return x >> 2; }
232 inline Sint32 ASR(Sint32 x, short shiftBy) { return x >> shiftBy; }
233
234#endif
235
236
238inline double sqr(double x) { return x*x; }
239inline double xpwr2(double x) { return x*x; }
240inline double xpwr3(double x) { return x*x*x; }
241inline double xpwr4(double x) { return x*x*x*x; }
242
243inline double Sqrt(double x) { return sqrt(fastFabs(x)); }
244
246
247// Modf() moved to MCFloat.h and .cpp
248
249inline double FPRemainder(double_param num, double_param denom)
250{
251 #if _WINDOWS
252 return fmod(num, denom);
253 #else
254 return remainder(num, denom);
255 #endif
256}
257
258inline double NormalizeAngle(double a)
259{
260 if (a < 0.0) {
261 if (a < -360.0) {
262 a = -FPRemainder(-a, 360.0);
263 }
264 a += 360.0;
265 }
266 else if (a >= 360.0) {
267 a = FPRemainder(a, 360.0);
268 }
269
270 return a;
271}
272
273
275// Functions for returning whether two values of any type are approximately equal.
276
277template <class Type> inline bool
278ApproxEqual(Type x, Type y, Type fudgeFactor)
279{
280 return Abs(x-y) <= fudgeFactor;
281}
282
283template <class NumericType> inline bool
284NotApproxEqual(NumericType x, NumericType y, NumericType fudgeFactor)
285{
286 return !ApproxEqual(x,y,fudgeFactor);
287}
288
289
291
292template <class NumType> inline NumType
293IncModulo(NumType base, NumType modulo)
294{
295 return ( base == modulo-1 ? 0 : base+1 );
296}
297
298template <class NumType> inline NumType
299DecModulo(NumType base, NumType modulo)
300{
301 return ( base == 0 ? modulo-1 : base-1 );
302}
303
304
305#endif // _BASICMATH_X_H_
const double kRadiansPerDegree
const double kHalfPi
double NormalizeAngle(double a)
Definition BasicMath.X.h:258
double Sqrt(double x)
Definition BasicMath.X.h:243
NumType DecModulo(NumType base, NumType modulo)
Definition BasicMath.X.h:299
double xpwr4(double x)
Definition BasicMath.X.h:241
double sqr(double x)
Definition BasicMath.X.h:238
const double kDegreesPerGradian
double xpwr2(double x)
Definition BasicMath.X.h:239
Real32 Truncate(const Real32 fromValue)
Definition BasicMath.X.h:48
T Min(T a, T b)
Definition BasicMath.X.h:208
Real64 RoundDown(Real64 value, int decimal_places)
Definition BasicMath.X.h:167
Sint32 Div2(Sint32 x)
Definition BasicMath.X.h:230
double FPRemainder(double_param num, double_param denom)
Definition BasicMath.X.h:249
const double kTwoPi
double xpwr3(double x)
Definition BasicMath.X.h:240
const double PI
NumType IncModulo(NumType base, NumType modulo)
Definition BasicMath.X.h:293
Real64 Round5Digits(Real64 value)
Definition BasicMath.X.h:149
const double kGradiansPerDegree
double Abs(double x)
Definition BasicMath.X.h:40
const double kThreePiOver2
Real32 Round(Real32 value)
Definition BasicMath.X.h:95
bool NotApproxEqual(NumericType x, NumericType y, NumericType fudgeFactor)
Definition BasicMath.X.h:284
const double kDegreesPerRadian
bool ApproxEqual(Type x, Type y, Type fudgeFactor)
Definition BasicMath.X.h:278
Sint32 ASR(Sint32 x, short shiftBy)
Definition BasicMath.X.h:232
Sint32 Div4(Sint32 x)
Definition BasicMath.X.h:231
Real64 RoundUp(Real64 value, int decimal_places)
Definition BasicMath.X.h:186
T Max(T a, T b)
Definition BasicMath.X.h:207
int32_t Sint32
Definition GSTypes.h:36
float Real32
Definition GSTypes.h:65
double Real64
Definition GSTypes.h:66