nomlib
Loading...
Searching...
No Matches
math_helpers.hpp
1/******************************************************************************
2
3 nomlib - C++11 cross-platform game engine
4
5Copyright (c) 2013, 2014 Jeffrey Carpenter <i8degrees@gmail.com>
6All rights reserved.
7
8Redistribution and use in source and binary forms, with or without
9modification, are permitted provided that the following conditions are met:
10
111. Redistributions of source code must retain the above copyright notice, this
12 list of conditions and the following disclaimer.
132. Redistributions in binary form must reproduce the above copyright notice,
14 this list of conditions and the following disclaimer in the documentation
15 and/or other materials provided with the distribution.
16
17THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
21ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28******************************************************************************/
29#ifndef NOMLIB_MATH_HELPERS_HPP
30#define NOMLIB_MATH_HELPERS_HPP
31
32#include <random>
33#include <cmath>
34
35#include "nomlib/config.hpp"
36#include "nomlib/math/Point2.hpp"
37#include "nomlib/math/Size2.hpp"
38
39namespace nom {
40
41const double PI = 4.0 * atan ( 1.0 );
42
43namespace priv {
44
45extern std::random_device rd;
46extern std::default_random_engine rd_generator;
47
48} // namespace priv
49
61void init_rand(uint32 seed_seq);
62
68template <typename T>
69inline T uniform_int_rand(T start_range, T end_range)
70{
71 std::uniform_int_distribution<T> distribution(start_range, end_range);
72
73 return distribution(priv::rd_generator);
74}
75
81template <typename T>
82inline T uniform_real_rand(T start_range, T end_range)
83{
84 std::uniform_real_distribution<T> distribution(start_range, end_range);
85
86 return distribution(priv::rd_generator);
87}
88
91const Point2d rotate_points ( float angle, float x, float y, float pivot_x, float pivot_y );
92
101template <typename T>
102inline T round_float(real32 number)
103{
104 real32 ret = number < 0.0f ? ceilf(number - 0.5f) : floorf(number + 0.5f);
105 return NOM_SCAST(T, ret);
106}
107
113template <typename T>
114inline T round_float_down(real32 number)
115{
116 real32 ret = floorf(number);
117 return NOM_SCAST(T, ret);
118}
119
125template <typename T>
126inline T round_float_up(real32 number)
127{
128 real32 ret = ceilf(number);
129 return NOM_SCAST(T, ret);
130}
131
140template <typename T>
141inline T round_double(real64 number)
142{
143 real64 ret = number < 0.0f ? ceil(number - 0.5f) : floor(number + 0.5f);
144 return NOM_SCAST(T, ret);
145}
146
147// TODO(jeff): Rename to truncate_real32
148template <typename T>
149inline T truncate_float(real32 number)
150{
151 T ret = NOM_SCAST(T, number);
152 return(ret);
153}
154
155// FIXME(jeff): We should provide two separate functions here, absolute_real32
156// and absolute_real64. See also: man 3 fabs
157inline real32 absolute_real32(real32 number)
158{
159 real32 result = fabsf(number);
160
161 return result;
162}
163
164inline real64 absolute_real64(real64 number)
165{
166 real64 result = fabs(number);
167
168 return result;
169}
170
171inline int absolute_int(int number)
172{
173 int result = std::abs(number);
174
175 return result;
176}
177
181template <typename T>
182inline T minimum(const T& a, const T& b)
183{
184 T result = (b < a) ? b : a;
185 return result;
186}
187
191template <typename T>
192inline T maximum(const T& a, const T& b)
193{
194 T result = (a < b) ? b : a;
195 return result;
196}
197
199template <typename T>
200inline T clamp_min(const T& a, const T& b)
201{
202 auto result = nom::minimum<T>(a, b);
203 return result;
204}
205
207template <typename T>
208inline T clamp_max(const T& a, const T& b)
209{
210 auto result = nom::maximum<T>(a, b);
211 return result;
212}
213
214} // namespace nom
215
216#endif // include guard defined