/*
* Copyright (c), Zeriph Enterprises
* All rights reserved.
*
* Contributor(s):
* Zechariah Perez, omni (at) zeriph (dot) com
*
* THIS SOFTWARE IS PROVIDED BY ZERIPH AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ZERIPH AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#if !defined(OMNI_MATH_HPP)
#define OMNI_MATH_HPP 1
#include <omni/defs/global.hpp>
#if !defined(OMNI_PI_F) // float
#if defined (OMNI_USE_M_PI) && defined(M_PI)
#define OMNI_PI_F static_cast<float>(M_PI)
#else
#define OMNI_PI_F 3.1415926F
#endif
#define OMNI_PI_F_180 0.0174533F
#define OMNI_180_PI_F 57.2957805F
#endif
#if !defined(OMNI_PI) // double
#if defined (OMNI_USE_M_PI) && defined(M_PI)
#define OMNI_PI M_PI
#else
#define OMNI_PI 3.14159265358979323846
#endif
#define OMNI_PI_180 0.01745329251994329577
#define OMNI_180_PI 57.29577951308232087684
#endif
#if !defined(OMNI_PI_L) // long double
#if defined (OMNI_USE_M_PI_L) && defined(M_PIl)
#define OMNI_PI_L M_PIl
#else
#define OMNI_PI_L 3.141592653589793238462643383279502884L
#endif
#define OMNI_PI_L_180 0.017453292519943295769236907684886127L
#define OMNI_180_PI_L 57.295779513082320876798154814105170336L
#endif
namespace omni {
namespace math {
#if !defined(OMNI_NO_EXTERN_CONSTS)
extern const double PI;
extern const long double PI_L;
extern const float PI_F;
extern const double PI_180;
extern const long double PI_L_180;
extern const float PI_F_180;
extern const double RADS[
361];
extern const double RADS_SIN[
361];
extern const double RADS_COS[
361];
#else
const double PI =
OMNI_PI;
const long double PI_L =
OMNI_PI_L;
const float PI_F =
OMNI_PI_F;
const double PI_180 =
OMNI_PI_180;
const long double PI_L_180 =
OMNI_PI_L_180;
const float PI_F_180 =
OMNI_PI_F_180;
const double RADS[] = {
0.
0,
// 0 degs
0.
0174532925199433,
// 1 degs
0.
0349065850398866,
// 2 degs
0.
0523598775598299,
// 3 degs
0.
0698131700797732,
// 4 degs
0.
0872664625997165,
// 5 degs
0.
10471975511966,
// 6 degs
0.
122173047639603,
// 7 degs
0.
139626340159546,
// 8 degs
0.
15707963267949,
// 9 degs
0.
174532925199433,
// 10 degs
0.
191986217719376,
// 11 degs
0.
20943951023932,
// 12 degs
0.
226892802759263,
// 13 degs
0.
244346095279206,
// 14 degs
0.
261799387799149,
// 15 degs
0.
279252680319093,
// 16 degs
0.
296705972839036,
// 17 degs
0.
314159265358979,
// 18 degs
0.
331612557878923,
// 19 degs
0.
349065850398866,
// 20 degs
0.
366519142918809,
// 21 degs
0.
383972435438752,
// 22 degs
0.
401425727958696,
// 23 degs
0.
418879020478639,
// 24 degs
0.
436332312998582,
// 25 degs
0.
453785605518526,
// 26 degs
0.
471238898038469,
// 27 degs
0.
488692190558412,
// 28 degs
0.
506145483078356,
// 29 degs
0.
523598775598299,
// 30 degs
0.
541052068118242,
// 31 degs
0.
558505360638185,
// 32 degs
0.
575958653158129,
// 33 degs
0.
593411945678072,
// 34 degs
0.
610865238198015,
// 35 degs
0.
628318530717959,
// 36 degs
0.
645771823237902,
// 37 degs
0.
663225115757845,
// 38 degs
0.
680678408277788,
// 39 degs
0.
698131700797732,
// 40 degs
0.
715584993317675,
// 41 degs
0.
733038285837618,
// 42 degs
0.
750491578357562,
// 43 degs
0.
767944870877505,
// 44 degs
0.
785398163397448,
// 45 degs
0.
802851455917392,
// 46 degs
0.
820304748437335,
// 47 degs
0.
837758040957278,
// 48 degs
0.
855211333477221,
// 49 degs
0.
872664625997165,
// 50 degs
0.
890117918517108,
// 51 degs
0.
907571211037051,
// 52 degs
0.
925024503556995,
// 53 degs
0.
942477796076938,
// 54 degs
0.
959931088596881,
// 55 degs
0.
977384381116825,
// 56 degs
0.
994837673636768,
// 57 degs
1.
01229096615671,
// 58 degs
1.
02974425867665,
// 59 degs
1.
0471975511966,
// 60 degs
1.
06465084371654,
// 61 degs
1.
08210413623648,
// 62 degs
1.
09955742875643,
// 63 degs
1.
11701072127637,
// 64 degs
1.
13446401379631,
// 65 degs
1.
15191730631626,
// 66 degs
1.
1693705988362,
// 67 degs
1.
18682389135614,
// 68 degs
1.
20427718387609,
// 69 degs
1.
22173047639603,
// 70 degs
1.
23918376891597,
// 71 degs
1.
25663706143592,
// 72 degs
1.
27409035395586,
// 73 degs
1.
2915436464758,
// 74 degs
1.
30899693899575,
// 75 degs
1.
32645023151569,
// 76 degs
1.
34390352403563,
// 77 degs
1.
36135681655558,
// 78 degs
1.
37881010907552,
// 79 degs
1.
39626340159546,
// 80 degs
1.
41371669411541,
// 81 degs
1.
43116998663535,
// 82 degs
1.
44862327915529,
// 83 degs
1.
46607657167524,
// 84 degs
1.
48352986419518,
// 85 degs
1.
50098315671512,
// 86 degs
1.
51843644923507,
// 87 degs
1.
53588974175501,
// 88 degs
1.
55334303427495,
// 89 degs
1.
5707963267949,
// 90 degs
1.
58824961931484,
// 91 degs
1.
60570291183478,
// 92 degs
1.
62315620435473,
// 93 degs
1.
64060949687467,
// 94 degs
1.
65806278939461,
// 95 degs
1.
67551608191456,
// 96 degs
1.
6929693744345,
// 97 degs
1.
71042266695444,
// 98 degs
1.
72787595947439,
// 99 degs
1.
74532925199433,
// 100 degs
1.
76278254451427,
// 101 degs
1.
78023583703422,
// 102 degs
1.
79768912955416,
// 103 degs
1.
8151424220741,
// 104 degs
1.
83259571459405,
// 105 degs
1.
85004900711399,
// 106 degs
1.
86750229963393,
// 107 degs
1.
88495559215388,
// 108 degs
1.
90240888467382,
// 109 degs
1.
91986217719376,
// 110 degs
1.
93731546971371,
// 111 degs
1.
95476876223365,
// 112 degs
1.
97222205475359,
// 113 degs
1.
98967534727354,
// 114 degs
2.
00712863979348,
// 115 degs
2.
02458193231342,
// 116 degs
2.
04203522483337,
// 117 degs
2.
05948851735331,
// 118 degs
2.
07694180987325,
// 119 degs
2.
0943951023932,
// 120 degs
2.
11184839491314,
// 121 degs
2.
12930168743308,
// 122 degs
2.
14675497995303,
// 123 degs
2.
16420827247297,
// 124 degs
2.
18166156499291,
// 125 degs
2.
19911485751286,
// 126 degs
2.
2165681500328,
// 127 degs
2.
23402144255274,
// 128 degs
2.
25147473507268,
// 129 degs
2.
26892802759263,
// 130 degs
2.
28638132011257,
// 131 degs
2.
30383461263252,
// 132 degs
2.
32128790515246,
// 133 degs
2.
3387411976724,
// 134 degs
2.
35619449019234,
// 135 degs
2.
37364778271229,
// 136 degs
2.
39110107523223,
// 137 degs
2.
40855436775217,
// 138 degs
2.
42600766027212,
// 139 degs
2.
44346095279206,
// 140 degs
2.
460914245312,
// 141 degs
2.
47836753783195,
// 142 degs
2.
49582083035189,
// 143 degs
2.
51327412287183,
// 144 degs
2.
53072741539178,
// 145 degs
2.
54818070791172,
// 146 degs
2.
56563400043166,
// 147 degs
2.
58308729295161,
// 148 degs
2.
60054058547155,
// 149 degs
2.
61799387799149,
// 150 degs
2.
63544717051144,
// 151 degs
2.
65290046303138,
// 152 degs
2.
67035375555132,
// 153 degs
2.
68780704807127,
// 154 degs
2.
70526034059121,
// 155 degs
2.
72271363311115,
// 156 degs
2.
7401669256311,
// 157 degs
2.
75762021815104,
// 158 degs
2.
77507351067098,
// 159 degs
2.
79252680319093,
// 160 degs
2.
80998009571087,
// 161 degs
2.
82743338823081,
// 162 degs
2.
84488668075076,
// 163 degs
2.
8623399732707,
// 164 degs
2.
87979326579064,
// 165 degs
2.
89724655831059,
// 166 degs
2.
91469985083053,
// 167 degs
2.
93215314335047,
// 168 degs
2.
94960643587042,
// 169 degs
2.
96705972839036,
// 170 degs
2.
9845130209103,
// 171 degs
3.
00196631343025,
// 172 degs
3.
01941960595019,
// 173 degs
3.
03687289847013,
// 174 degs
3.
05432619099008,
// 175 degs
3.
07177948351002,
// 176 degs
3.
08923277602996,
// 177 degs
3.
10668606854991,
// 178 degs
3.
12413936106985,
// 179 degs
3.
14159265358979,
// 180 degs
3.
15904594610974,
// 181 degs
3.
17649923862968,
// 182 degs
3.
19395253114962,
// 183 degs
3.
21140582366957,
// 184 degs
3.
22885911618951,
// 185 degs
3.
24631240870945,
// 186 degs
3.
2637657012294,
// 187 degs
3.
28121899374934,
// 188 degs
3.
29867228626928,
// 189 degs
3.
31612557878923,
// 190 degs
3.
33357887130917,
// 191 degs
3.
35103216382911,
// 192 degs
3.
36848545634906,
// 193 degs
3.
385938748869,
// 194 degs
3.
40339204138894,
// 195 degs
3.
42084533390889,
// 196 degs
3.
43829862642883,
// 197 degs
3.
45575191894877,
// 198 degs
3.
47320521146872,
// 199 degs
3.
49065850398866,
// 200 degs
3.
5081117965086,
// 201 degs
3.
52556508902855,
// 202 degs
3.
54301838154849,
// 203 degs
3.
56047167406843,
// 204 degs
3.
57792496658838,
// 205 degs
3.
59537825910832,
// 206 degs
3.
61283155162826,
// 207 degs
3.
63028484414821,
// 208 degs
3.
64773813666815,
// 209 degs
3.
66519142918809,
// 210 degs
3.
68264472170804,
// 211 degs
3.
70009801422798,
// 212 degs
3.
71755130674792,
// 213 degs
3.
73500459926787,
// 214 degs
3.
75245789178781,
// 215 degs
3.
76991118430775,
// 216 degs
3.
7873644768277,
// 217 degs
3.
80481776934764,
// 218 degs
3.
82227106186758,
// 219 degs
3.
83972435438753,
// 220 degs
3.
85717764690747,
// 221 degs
3.
87463093942741,
// 222 degs
3.
89208423194735,
// 223 degs
3.
9095375244673,
// 224 degs
3.
92699081698724,
// 225 degs
3.
94444410950718,
// 226 degs
3.
96189740202713,
// 227 degs
3.
97935069454707,
// 228 degs
3.
99680398706701,
// 229 degs
4.
01425727958696,
// 230 degs
4.
0317105721069,
// 231 degs
4.
04916386462684,
// 232 degs
4.
06661715714679,
// 233 degs
4.
08407044966673,
// 234 degs
4.
10152374218667,
// 235 degs
4.
11897703470662,
// 236 degs
4.
13643032722656,
// 237 degs
4.
1538836197465,
// 238 degs
4.
17133691226645,
// 239 degs
4.
18879020478639,
// 240 degs
4.
20624349730633,
// 241 degs
4.
22369678982628,
// 242 degs
4.
24115008234622,
// 243 degs
4.
25860337486616,
// 244 degs
4.
27605666738611,
// 245 degs
4.
29350995990605,
// 246 degs
4.
31096325242599,
// 247 degs
4.
32841654494594,
// 248 degs
4.
34586983746588,
// 249 degs
4.
36332312998582,
// 250 degs
4.
38077642250577,
// 251 degs
4.
39822971502571,
// 252 degs
4.
41568300754565,
// 253 degs
4.
4331363000656,
// 254 degs
4.
45058959258554,
// 255 degs
4.
46804288510548,
// 256 degs
4.
48549617762543,
// 257 degs
4.
50294947014537,
// 258 degs
4.
52040276266531,
// 259 degs
4.
53785605518526,
// 260 degs
4.
5553093477052,
// 261 degs
4.
57276264022514,
// 262 degs
4.
59021593274509,
// 263 degs
4.
60766922526503,
// 264 degs
4.
62512251778497,
// 265 degs
4.
64257581030492,
// 266 degs
4.
66002910282486,
// 267 degs
4.
6774823953448,
// 268 degs
4.
69493568786475,
// 269 degs
4.
71238898038469,
// 270 degs
4.
72984227290463,
// 271 degs
4.
74729556542458,
// 272 degs
4.
76474885794452,
// 273 degs
4.
78220215046446,
// 274 degs
4.
79965544298441,
// 275 degs
4.
81710873550435,
// 276 degs
4.
83456202802429,
// 277 degs
4.
85201532054424,
// 278 degs
4.
86946861306418,
// 279 degs
4.
88692190558412,
// 280 degs
4.
90437519810407,
// 281 degs
4.
92182849062401,
// 282 degs
4.
93928178314395,
// 283 degs
4.
9567350756639,
// 284 degs
4.
97418836818384,
// 285 degs
4.
99164166070378,
// 286 degs
5.
00909495322373,
// 287 degs
5.
02654824574367,
// 288 degs
5.
04400153826361,
// 289 degs
5.
06145483078356,
// 290 degs
5.
0789081233035,
// 291 degs
5.
09636141582344,
// 292 degs
5.
11381470834339,
// 293 degs
5.
13126800086333,
// 294 degs
5.
14872129338327,
// 295 degs
5.
16617458590322,
// 296 degs
5.
18362787842316,
// 297 degs
5.
2010811709431,
// 298 degs
5.
21853446346305,
// 299 degs
5.
23598775598299,
// 300 degs
5.
25344104850293,
// 301 degs
5.
27089434102288,
// 302 degs
5.
28834763354282,
// 303 degs
5.
30580092606276,
// 304 degs
5.
32325421858271,
// 305 degs
5.
34070751110265,
// 306 degs
5.
35816080362259,
// 307 degs
5.
37561409614254,
// 308 degs
5.
39306738866248,
// 309 degs
5.
41052068118242,
// 310 degs
5.
42797397370236,
// 311 degs
5.
44542726622231,
// 312 degs
5.
46288055874225,
// 313 degs
5.
48033385126219,
// 314 degs
5.
49778714378214,
// 315 degs
5.
51524043630208,
// 316 degs
5.
53269372882203,
// 317 degs
5.
55014702134197,
// 318 degs
5.
56760031386191,
// 319 degs
5.
58505360638185,
// 320 degs
5.
6025068989018,
// 321 degs
5.
61996019142174,
// 322 degs
5.
63741348394168,
// 323 degs
5.
65486677646163,
// 324 degs
5.
67232006898157,
// 325 degs
5.
68977336150151,
// 326 degs
5.
70722665402146,
// 327 degs
5.
7246799465414,
// 328 degs
5.
74213323906134,
// 329 degs
5.
75958653158129,
// 330 degs
5.
77703982410123,
// 331 degs
5.
79449311662117,
// 332 degs
5.
81194640914112,
// 333 degs
5.
82939970166106,
// 334 degs
5.
846852994181,
// 335 degs
5.
86430628670095,
// 336 degs
5.
88175957922089,
// 337 degs
5.
89921287174083,
// 338 degs
5.
91666616426078,
// 339 degs
5.
93411945678072,
// 340 degs
5.
95157274930066,
// 341 degs
5.
96902604182061,
// 342 degs
5.
98647933434055,
// 343 degs
6.
00393262686049,
// 344 degs
6.
02138591938044,
// 345 degs
6.
03883921190038,
// 346 degs
6.
05629250442032,
// 347 degs
6.
07374579694027,
// 348 degs
6.
09119908946021,
// 349 degs
6.
10865238198015,
// 350 degs
6.
1261056745001,
// 351 degs
6.
14355896702004,
// 352 degs
6.
16101225953998,
// 353 degs
6.
17846555205993,
// 354 degs
6.
19591884457987,
// 355 degs
6.
21337213709981,
// 356 degs
6.
23082542961976,
// 357 degs
6.
2482787221397,
// 358 degs
6.
26573201465964,
// 359 degs
6.
28318530717959 // 360 degs
};
const double RADS_SIN[] = {
0,
// sin(0 - 0 degs)
0.
0174524064372835,
// sin(0.0174532925199433 - 1 degs)
0.
034899496702501,
// sin(0.0349065850398866 - 2 degs)
0.
0523359562429438,
// sin(0.0523598775598299 - 3 degs)
0.
0697564737441253,
// sin(0.0698131700797732 - 4 degs)
0.
0871557427476582,
// sin(0.0872664625997165 - 5 degs)
0.
104528463267654,
// sin(0.10471975511966 - 6 degs)
0.
121869343405147,
// sin(0.122173047639603 - 7 degs)
0.
139173100960065,
// sin(0.139626340159546 - 8 degs)
0.
156434465040231,
// sin(0.15707963267949 - 9 degs)
0.
17364817766693,
// sin(0.174532925199433 - 10 degs)
0.
190808995376545,
// sin(0.191986217719376 - 11 degs)
0.
20791169081776,
// sin(0.20943951023932 - 12 degs)
0.
224951054343865,
// sin(0.226892802759263 - 13 degs)
0.
241921895599668,
// sin(0.244346095279206 - 14 degs)
0.
25881904510252,
// sin(0.261799387799149 - 15 degs)
0.
275637355816999,
// sin(0.279252680319093 - 16 degs)
0.
292371704722737,
// sin(0.296705972839036 - 17 degs)
0.
309016994374947,
// sin(0.314159265358979 - 18 degs)
0.
325568154457157,
// sin(0.331612557878923 - 19 degs)
0.
342020143325669,
// sin(0.349065850398866 - 20 degs)
0.
3583679495453,
// sin(0.366519142918809 - 21 degs)
0.
374606593415912,
// sin(0.383972435438752 - 22 degs)
0.
390731128489274,
// sin(0.401425727958696 - 23 degs)
0.
4067366430758,
// sin(0.418879020478639 - 24 degs)
0.
422618261740699,
// sin(0.436332312998582 - 25 degs)
0.
438371146789078,
// sin(0.453785605518526 - 26 degs)
0.
453990499739547,
// sin(0.471238898038469 - 27 degs)
0.
469471562785891,
// sin(0.488692190558412 - 28 degs)
0.
484809620246337,
// sin(0.506145483078356 - 29 degs)
0.
5,
// sin(0.523598775598299 - 30 degs)
0.
515038074910054,
// sin(0.541052068118242 - 31 degs)
0.
529919264233205,
// sin(0.558505360638185 - 32 degs)
0.
544639035015027,
// sin(0.575958653158129 - 33 degs)
0.
559192903470747,
// sin(0.593411945678072 - 34 degs)
0.
573576436351046,
// sin(0.610865238198015 - 35 degs)
0.
587785252292473,
// sin(0.628318530717959 - 36 degs)
0.
601815023152048,
// sin(0.645771823237902 - 37 degs)
0.
615661475325658,
// sin(0.663225115757845 - 38 degs)
0.
629320391049837,
// sin(0.680678408277788 - 39 degs)
0.
642787609686539,
// sin(0.698131700797732 - 40 degs)
0.
656059028990507,
// sin(0.715584993317675 - 41 degs)
0.
669130606358858,
// sin(0.733038285837618 - 42 degs)
0.
681998360062499,
// sin(0.750491578357562 - 43 degs)
0.
694658370458997,
// sin(0.767944870877505 - 44 degs)
0.
707106781186547,
// sin(0.785398163397448 - 45 degs)
0.
719339800338651,
// sin(0.802851455917392 - 46 degs)
0.
731353701619171,
// sin(0.820304748437335 - 47 degs)
0.
743144825477394,
// sin(0.837758040957278 - 48 degs)
0.
754709580222772,
// sin(0.855211333477221 - 49 degs)
0.
766044443118978,
// sin(0.872664625997165 - 50 degs)
0.
777145961456971,
// sin(0.890117918517108 - 51 degs)
0.
788010753606722,
// sin(0.907571211037051 - 52 degs)
0.
798635510047293,
// sin(0.925024503556995 - 53 degs)
0.
809016994374947,
// sin(0.942477796076938 - 54 degs)
0.
819152044288992,
// sin(0.959931088596881 - 55 degs)
0.
829037572555042,
// sin(0.977384381116825 - 56 degs)
0.
838670567945424,
// sin(0.994837673636768 - 57 degs)
0.
848048096156425,
// sin(1.01229096615671 - 58 degs)
0.
85716730070211,
// sin(1.02974425867665 - 59 degs)
0.
86602540378444,
// sin(1.0471975511966 - 60 degs)
0.
874619707139395,
// sin(1.06465084371654 - 61 degs)
0.
882947592858925,
// sin(1.08210413623648 - 62 degs)
0.
891006524188369,
// sin(1.09955742875643 - 63 degs)
0.
898794046299167,
// sin(1.11701072127637 - 64 degs)
0.
906307787036648,
// sin(1.13446401379631 - 65 degs)
0.
913545457642602,
// sin(1.15191730631626 - 66 degs)
0.
92050485345244,
// sin(1.1693705988362 - 67 degs)
0.
927183854566786,
// sin(1.18682389135614 - 68 degs)
0.
933580426497203,
// sin(1.20427718387609 - 69 degs)
0.
939692620785908,
// sin(1.22173047639603 - 70 degs)
0.
945518575599316,
// sin(1.23918376891597 - 71 degs)
0.
951056516295154,
// sin(1.25663706143592 - 72 degs)
0.
956304755963035,
// sin(1.27409035395586 - 73 degs)
0.
961261695938318,
// sin(1.2915436464758 - 74 degs)
0.
965925826289069,
// sin(1.30899693899575 - 75 degs)
0.
970295726275996,
// sin(1.32645023151569 - 76 degs)
0.
974370064785234,
// sin(1.34390352403563 - 77 degs)
0.
978147600733806,
// sin(1.36135681655558 - 78 degs)
0.
981627183447664,
// sin(1.37881010907552 - 79 degs)
0.
984807753012207,
// sin(1.39626340159546 - 80 degs)
0.
987688340595138,
// sin(1.41371669411541 - 81 degs)
0.
99026806874157,
// sin(1.43116998663535 - 82 degs)
0.
992546151641322,
// sin(1.44862327915529 - 83 degs)
0.
994521895368274,
// sin(1.46607657167524 - 84 degs)
0.
996194698091746,
// sin(1.48352986419518 - 85 degs)
0.
997564050259824,
// sin(1.50098315671512 - 86 degs)
0.
998629534754574,
// sin(1.51843644923507 - 87 degs)
0.
999390827019096,
// sin(1.53588974175501 - 88 degs)
0.
999847695156391,
// sin(1.55334303427495 - 89 degs)
1,
// sin(1.5707963267949 - 90 degs)
0.
999847695156391,
// sin(1.58824961931484 - 91 degs)
0.
999390827019096,
// sin(1.60570291183478 - 92 degs)
0.
998629534754574,
// sin(1.62315620435473 - 93 degs)
0.
997564050259824,
// sin(1.64060949687467 - 94 degs)
0.
996194698091746,
// sin(1.65806278939461 - 95 degs)
0.
994521895368273,
// sin(1.67551608191456 - 96 degs)
0.
992546151641322,
// sin(1.6929693744345 - 97 degs)
0.
990268068741571,
// sin(1.71042266695444 - 98 degs)
0.
987688340595137,
// sin(1.72787595947439 - 99 degs)
0.
984807753012208,
// sin(1.74532925199433 - 100 degs)
0.
981627183447665,
// sin(1.76278254451427 - 101 degs)
0.
978147600733805,
// sin(1.78023583703422 - 102 degs)
0.
974370064785235,
// sin(1.79768912955416 - 103 degs)
0.
970295726275997,
// sin(1.8151424220741 - 104 degs)
0.
965925826289067,
// sin(1.83259571459405 - 105 degs)
0.
961261695938319,
// sin(1.85004900711399 - 106 degs)
0.
956304755963036,
// sin(1.86750229963393 - 107 degs)
0.
951056516295152,
// sin(1.88495559215388 - 108 degs)
0.
945518575599317,
// sin(1.90240888467382 - 109 degs)
0.
939692620785909,
// sin(1.91986217719376 - 110 degs)
0.
9335804264972,
// sin(1.93731546971371 - 111 degs)
0.
927183854566787,
// sin(1.95476876223365 - 112 degs)
0.
920504853452441,
// sin(1.97222205475359 - 113 degs)
0.
913545457642599,
// sin(1.98967534727354 - 114 degs)
0.
906307787036649,
// sin(2.00712863979348 - 115 degs)
0.
898794046299168,
// sin(2.02458193231342 - 116 degs)
0.
891006524188366,
// sin(2.04203522483337 - 117 degs)
0.
882947592858926,
// sin(2.05948851735331 - 118 degs)
0.
874619707139397,
// sin(2.07694180987325 - 119 degs)
0.
866025403784436,
// sin(2.0943951023932 - 120 degs)
0.
857167300702112,
// sin(2.11184839491314 - 121 degs)
0.
848048096156427,
// sin(2.12930168743308 - 122 degs)
0.
838670567945422,
// sin(2.14675497995303 - 123 degs)
0.
829037572555041,
// sin(2.16420827247297 - 124 degs)
0.
819152044288993,
// sin(2.18166156499291 - 125 degs)
0.
809016994374945,
// sin(2.19911485751286 - 126 degs)
0.
798635510047292,
// sin(2.2165681500328 - 127 degs)
0.
788010753606723,
// sin(2.23402144255274 - 128 degs)
0.
777145961456974,
// sin(2.25147473507268 - 129 degs)
0.
766044443118977,
// sin(2.26892802759263 - 130 degs)
0.
754709580222773,
// sin(2.28638132011257 - 131 degs)
0.
743144825477391,
// sin(2.30383461263252 - 132 degs)
0.
731353701619169,
// sin(2.32128790515246 - 133 degs)
0.
719339800338652,
// sin(2.3387411976724 - 134 degs)
0.
707106781186551,
// sin(2.35619449019234 - 135 degs)
0.
694658370458996,
// sin(2.37364778271229 - 136 degs)
0.
681998360062499,
// sin(2.39110107523223 - 137 degs)
0.
669130606358862,
// sin(2.40855436775217 - 138 degs)
0.
656059028990506,
// sin(2.42600766027212 - 139 degs)
0.
64278760968654,
// sin(2.44346095279206 - 140 degs)
0.
629320391049841,
// sin(2.460914245312 - 141 degs)
0.
615661475325657,
// sin(2.47836753783195 - 142 degs)
0.
601815023152049,
// sin(2.49582083035189 - 143 degs)
0.
587785252292477,
// sin(2.51327412287183 - 144 degs)
0.
573576436351044,
// sin(2.53072741539178 - 145 degs)
0.
559192903470748,
// sin(2.54818070791172 - 146 degs)
0.
544639035015031,
// sin(2.56563400043166 - 147 degs)
0.
529919264233203,
// sin(2.58308729295161 - 148 degs)
0.
515038074910055,
// sin(2.60054058547155 - 149 degs)
0.
500000000000004,
// sin(2.61799387799149 - 150 degs)
0.
484809620246335,
// sin(2.63544717051144 - 151 degs)
0.
469471562785891,
// sin(2.65290046303138 - 152 degs)
0.
45399049973955,
// sin(2.67035375555132 - 153 degs)
0.
438371146789075,
// sin(2.68780704807127 - 154 degs)
0.
4226182617407,
// sin(2.70526034059121 - 155 degs)
0.
406736643075804,
// sin(2.72271363311115 - 156 degs)
0.
390731128489271,
// sin(2.7401669256311 - 157 degs)
0.
374606593415913,
// sin(2.75762021815104 - 158 degs)
0.
358367949545304,
// sin(2.77507351067098 - 159 degs)
0.
342020143325666,
// sin(2.79252680319093 - 160 degs)
0.
325568154457157,
// sin(2.80998009571087 - 161 degs)
0.
309016994374951,
// sin(2.82743338823081 - 162 degs)
0.
292371704722734,
// sin(2.84488668075076 - 163 degs)
0.
275637355817,
// sin(2.8623399732707 - 164 degs)
0.
258819045102524,
// sin(2.87979326579064 - 165 degs)
0.
241921895599665,
// sin(2.89724655831059 - 166 degs)
0.
224951054343865,
// sin(2.91469985083053 - 167 degs)
0.
207911690817763,
// sin(2.93215314335047 - 168 degs)
0.
190808995376542,
// sin(2.94960643587042 - 169 degs)
0.
173648177666931,
// sin(2.96705972839036 - 170 degs)
0.
156434465040234,
// sin(2.9845130209103 - 171 degs)
0.
139173100960062,
// sin(3.00196631343025 - 172 degs)
0.
121869343405148,
// sin(3.01941960595019 - 173 degs)
0.
104528463267657,
// sin(3.03687289847013 - 174 degs)
0.
0871557427476551,
// sin(3.05432619099008 - 175 degs)
0.
0697564737441255,
// sin(3.07177948351002 - 176 degs)
0.
0523359562429474,
// sin(3.08923277602996 - 177 degs)
0.
0348994967024976,
// sin(3.10668606854991 - 178 degs)
0.
0174524064372834,
// sin(3.12413936106985 - 179 degs)
3.23108914886517e-
15,
// sin(3.14159265358979 - 180 degs)
-
0.
0174524064372872,
// sin(3.15904594610974 - 181 degs)
-
0.
0348994967025013,
// sin(3.17649923862968 - 182 degs)
-
0.
0523359562429409,
// sin(3.19395253114962 - 183 degs)
-
0.
0697564737441288,
// sin(3.21140582366957 - 184 degs)
-
0.
0871557427476584,
// sin(3.22885911618951 - 185 degs)
-
0.
10452846326765,
// sin(3.24631240870945 - 186 degs)
-
0.
121869343405151,
// sin(3.2637657012294 - 187 degs)
-
0.
139173100960066,
// sin(3.28121899374934 - 188 degs)
-
0.
156434465040228,
// sin(3.29867228626928 - 189 degs)
-
0.
173648177666934,
// sin(3.31612557878923 - 190 degs)
-
0.
190808995376545,
// sin(3.33357887130917 - 191 degs)
-
0.
207911690817756,
// sin(3.35103216382911 - 192 degs)
-
0.
224951054343869,
// sin(3.36848545634906 - 193 degs)
-
0.
241921895599668,
// sin(3.385938748869 - 194 degs)
-
0.
258819045102518,
// sin(3.40339204138894 - 195 degs)
-
0.
275637355817003,
// sin(3.42084533390889 - 196 degs)
-
0.
292371704722738,
// sin(3.43829862642883 - 197 degs)
-
0.
309016994374945,
// sin(3.45575191894877 - 198 degs)
-
0.
325568154457161,
// sin(3.47320521146872 - 199 degs)
-
0.
342020143325669,
// sin(3.49065850398866 - 200 degs)
-
0.
358367949545298,
// sin(3.5081117965086 - 201 degs)
-
0.
374606593415916,
// sin(3.52556508902855 - 202 degs)
-
0.
390731128489275,
// sin(3.54301838154849 - 203 degs)
-
0.
406736643075798,
// sin(3.56047167406843 - 204 degs)
-
0.
422618261740703,
// sin(3.57792496658838 - 205 degs)
-
0.
438371146789078,
// sin(3.59537825910832 - 206 degs)
-
0.
453990499739545,
// sin(3.61283155162826 - 207 degs)
-
0.
469471562785895,
// sin(3.63028484414821 - 208 degs)
-
0.
484809620246338,
// sin(3.64773813666815 - 209 degs)
-
0.
499999999999998,
// sin(3.66519142918809 - 210 degs)
-
0.
515038074910058,
// sin(3.68264472170804 - 211 degs)
-
0.
529919264233206,
// sin(3.70009801422798 - 212 degs)
-
0.
544639035015025,
// sin(3.71755130674792 - 213 degs)
-
0.
559192903470751,
// sin(3.73500459926787 - 214 degs)
-
0.
573576436351047,
// sin(3.75245789178781 - 215 degs)
-
0.
587785252292472,
// sin(3.76991118430775 - 216 degs)
-
0.
601815023152052,
// sin(3.7873644768277 - 217 degs)
-
0.
61566147532566,
// sin(3.80481776934764 - 218 degs)
-
0.
629320391049836,
// sin(3.82227106186758 - 219 degs)
-
0.
642787609686543,
// sin(3.83972435438753 - 220 degs)
-
0.
656059028990508,
// sin(3.85717764690747 - 221 degs)
-
0.
669130606358857,
// sin(3.87463093942741 - 222 degs)
-
0.
681998360062495,
// sin(3.89208423194735 - 223 degs)
-
0.
694658370458999,
// sin(3.9095375244673 - 224 degs)
-
0.
707106781186546,
// sin(3.92699081698724 - 225 degs)
-
0.
719339800338648,
// sin(3.94444410950718 - 226 degs)
-
0.
731353701619172,
// sin(3.96189740202713 - 227 degs)
-
0.
743144825477393,
// sin(3.97935069454707 - 228 degs)
-
0.
754709580222769,
// sin(3.99680398706701 - 229 degs)
-
0.
76604444311898,
// sin(4.01425727958696 - 230 degs)
-
0.
77714596145697,
// sin(4.0317105721069 - 231 degs)
-
0.
788010753606719,
// sin(4.04916386462684 - 232 degs)
-
0.
798635510047294,
// sin(4.06661715714679 - 233 degs)
-
0.
809016994374947,
// sin(4.08407044966673 - 234 degs)
-
0.
819152044288989,
// sin(4.10152374218667 - 235 degs)
-
0.
829037572555043,
// sin(4.11897703470662 - 236 degs)
-
0.
838670567945424,
// sin(4.13643032722656 - 237 degs)
-
0.
848048096156424,
// sin(4.1538836197465 - 238 degs)
-
0.
857167300702113,
// sin(4.17133691226645 - 239 degs)
-
0.
866025403784438,
// sin(4.18879020478639 - 240 degs)
-
0.
874619707139394,
// sin(4.20624349730633 - 241 degs)
-
0.
882947592858928,
// sin(4.22369678982628 - 242 degs)
-
0.
891006524188367,
// sin(4.24115008234622 - 243 degs)
-
0.
898794046299165,
// sin(4.25860337486616 - 244 degs)
-
0.
906307787036651,
// sin(4.27605666738611 - 245 degs)
-
0.
913545457642601,
// sin(4.29350995990605 - 246 degs)
-
0.
920504853452439,
// sin(4.31096325242599 - 247 degs)
-
0.
927183854566788,
// sin(4.32841654494594 - 248 degs)
-
0.
933580426497202,
// sin(4.34586983746588 - 249 degs)
-
0.
939692620785907,
// sin(4.36332312998582 - 250 degs)
-
0.
945518575599318,
// sin(4.38077642250577 - 251 degs)
-
0.
951056516295154,
// sin(4.39822971502571 - 252 degs)
-
0.
956304755963034,
// sin(4.41568300754565 - 253 degs)
-
0.
96126169593832,
// sin(4.4331363000656 - 254 degs)
-
0.
965925826289068,
// sin(4.45058959258554 - 255 degs)
-
0.
970295726275996,
// sin(4.46804288510548 - 256 degs)
-
0.
974370064785236,
// sin(4.48549617762543 - 257 degs)
-
0.
978147600733806,
// sin(4.50294947014537 - 258 degs)
-
0.
981627183447663,
// sin(4.52040276266531 - 259 degs)
-
0.
984807753012209,
// sin(4.53785605518526 - 260 degs)
-
0.
987688340595138,
// sin(4.5553093477052 - 261 degs)
-
0.
99026806874157,
// sin(4.57276264022514 - 262 degs)
-
0.
992546151641322,
// sin(4.59021593274509 - 263 degs)
-
0.
994521895368273,
// sin(4.60766922526503 - 264 degs)
-
0.
996194698091745,
// sin(4.62512251778497 - 265 degs)
-
0.
997564050259825,
// sin(4.64257581030492 - 266 degs)
-
0.
998629534754574,
// sin(4.66002910282486 - 267 degs)
-
0.
999390827019096,
// sin(4.6774823953448 - 268 degs)
-
0.
999847695156391,
// sin(4.69493568786475 - 269 degs)
-
1,
// sin(4.71238898038469 - 270 degs)
-
0.
999847695156391,
// sin(4.72984227290463 - 271 degs)
-
0.
999390827019096,
// sin(4.74729556542458 - 272 degs)
-
0.
998629534754574,
// sin(4.76474885794452 - 273 degs)
-
0.
997564050259824,
// sin(4.78220215046446 - 274 degs)
-
0.
996194698091745,
// sin(4.79965544298441 - 275 degs)
-
0.
994521895368273,
// sin(4.81710873550435 - 276 degs)
-
0.
992546151641322,
// sin(4.83456202802429 - 277 degs)
-
0.
99026806874157,
// sin(4.85201532054424 - 278 degs)
-
0.
987688340595138,
// sin(4.86946861306418 - 279 degs)
-
0.
984807753012209,
// sin(4.88692190558412 - 280 degs)
-
0.
981627183447663,
// sin(4.90437519810407 - 281 degs)
-
0.
978147600733805,
// sin(4.92182849062401 - 282 degs)
-
0.
974370064785236,
// sin(4.93928178314395 - 283 degs)
-
0.
970295726275995,
// sin(4.9567350756639 - 284 degs)
-
0.
965925826289068,
// sin(4.97418836818384 - 285 degs)
-
0.
96126169593832,
// sin(4.99164166070378 - 286 degs)
-
0.
956304755963034,
// sin(5.00909495322373 - 287 degs)
-
0.
951056516295153,
// sin(5.02654824574367 - 288 degs)
-
0.
945518575599318,
// sin(5.04400153826361 - 289 degs)
-
0.
939692620785907,
// sin(5.06145483078356 - 290 degs)
-
0.
933580426497201,
// sin(5.0789081233035 - 291 degs)
-
0.
927183854566788,
// sin(5.09636141582344 - 292 degs)
-
0.
920504853452439,
// sin(5.11381470834339 - 293 degs)
-
0.
9135454576426,
// sin(5.13126800086333 - 294 degs)
-
0.
906307787036651,
// sin(5.14872129338327 - 295 degs)
-
0.
898794046299165,
// sin(5.16617458590322 - 296 degs)
-
0.
891006524188367,
// sin(5.18362787842316 - 297 degs)
-
0.
882947592858928,
// sin(5.2010811709431 - 298 degs)
-
0.
874619707139394,
// sin(5.21853446346305 - 299 degs)
-
0.
866025403784438,
// sin(5.23598775598299 - 300 degs)
-
0.
857167300702113,
// sin(5.25344104850293 - 301 degs)
-
0.
848048096156423,
// sin(5.27089434102288 - 302 degs)
-
0.
838670567945423,
// sin(5.28834763354282 - 303 degs)
-
0.
829037572555043,
// sin(5.30580092606276 - 304 degs)
-
0.
819152044288989,
// sin(5.32325421858271 - 305 degs)
-
0.
809016994374947,
// sin(5.34070751110265 - 306 degs)
-
0.
798635510047294,
// sin(5.35816080362259 - 307 degs)
-
0.
788010753606719,
// sin(5.37561409614254 - 308 degs)
-
0.
77714596145697,
// sin(5.39306738866248 - 309 degs)
-
0.
766044443118979,
// sin(5.41052068118242 - 310 degs)
-
0.
754709580222775,
// sin(5.42797397370236 - 311 degs)
-
0.
743144825477393,
// sin(5.44542726622231 - 312 degs)
-
0.
731353701619172,
// sin(5.46288055874225 - 313 degs)
-
0.
719339800338654,
// sin(5.48033385126219 - 314 degs)
-
0.
707106781186546,
// sin(5.49778714378214 - 315 degs)
-
0.
694658370458998,
// sin(5.51524043630208 - 316 degs)
-
0.
681998360062494,
// sin(5.53269372882203 - 317 degs)
-
0.
669130606358857,
// sin(5.55014702134197 - 318 degs)
-
0.
656059028990508,
// sin(5.56760031386191 - 319 degs)
-
0.
642787609686543,
// sin(5.58505360638185 - 320 degs)
-
0.
629320391049836,
// sin(5.6025068989018 - 321 degs)
-
0.
61566147532566,
// sin(5.61996019142174 - 322 degs)
-
0.
601815023152052,
// sin(5.63741348394168 - 323 degs)
-
0.
587785252292471,
// sin(5.65486677646163 - 324 degs)
-
0.
573576436351047,
// sin(5.67232006898157 - 325 degs)
-
0.
55919290347075,
// sin(5.68977336150151 - 326 degs)
-
0.
544639035015026,
// sin(5.70722665402146 - 327 degs)
-
0.
529919264233206,
// sin(5.7246799465414 - 328 degs)
-
0.
515038074910057,
// sin(5.74213323906134 - 329 degs)
-
0.
499999999999998,
// sin(5.75958653158129 - 330 degs)
-
0.
484809620246338,
// sin(5.77703982410123 - 331 degs)
-
0.
469471562785895,
// sin(5.79449311662117 - 332 degs)
-
0.
453990499739545,
// sin(5.81194640914112 - 333 degs)
-
0.
438371146789078,
// sin(5.82939970166106 - 334 degs)
-
0.
422618261740703,
// sin(5.846852994181 - 335 degs)
-
0.
406736643075798,
// sin(5.86430628670095 - 336 degs)
-
0.
390731128489275,
// sin(5.88175957922089 - 337 degs)
-
0.
374606593415916,
// sin(5.89921287174083 - 338 degs)
-
0.
358367949545297,
// sin(5.91666616426078 - 339 degs)
-
0.
342020143325669,
// sin(5.93411945678072 - 340 degs)
-
0.
32556815445716,
// sin(5.95157274930066 - 341 degs)
-
0.
309016994374945,
// sin(5.96902604182061 - 342 degs)
-
0.
292371704722737,
// sin(5.98647933434055 - 343 degs)
-
0.
275637355817003,
// sin(6.00393262686049 - 344 degs)
-
0.
258819045102518,
// sin(6.02138591938044 - 345 degs)
-
0.
241921895599668,
// sin(6.03883921190038 - 346 degs)
-
0.
224951054343869,
// sin(6.05629250442032 - 347 degs)
-
0.
207911690817756,
// sin(6.07374579694027 - 348 degs)
-
0.
190808995376545,
// sin(6.09119908946021 - 349 degs)
-
0.
173648177666934,
// sin(6.10865238198015 - 350 degs)
-
0.
156434465040228,
// sin(6.1261056745001 - 351 degs)
-
0.
139173100960066,
// sin(6.14355896702004 - 352 degs)
-
0.
121869343405151,
// sin(6.16101225953998 - 353 degs)
-
0.
10452846326765,
// sin(6.17846555205993 - 354 degs)
-
0.
0871557427476583,
// sin(6.19591884457987 - 355 degs)
-
0.
0697564737441283,
// sin(6.21337213709981 - 356 degs)
-
0.
0523359562429408,
// sin(6.23082542961976 - 357 degs)
-
0.
0348994967025008,
// sin(6.2482787221397 - 358 degs)
-
0.
0174524064372871,
// sin(6.26573201465964 - 359 degs)
3.30778431897103e-
15 // sin(6.28318530717959 - 360 degs)
};
const double RADS_COS[] = {
1,
// cos(0 - 0 degs)
0.
999847695156391,
// cos(0.0174532925199433 - 1 degs)
0.
999390827019096,
// cos(0.0349065850398866 - 2 degs)
0.
998629534754574,
// cos(0.0523598775598299 - 3 degs)
0.
997564050259824,
// cos(0.0698131700797732 - 4 degs)
0.
996194698091746,
// cos(0.0872664625997165 - 5 degs)
0.
994521895368273,
// cos(0.10471975511966 - 6 degs)
0.
992546151641322,
// cos(0.122173047639603 - 7 degs)
0.
99026806874157,
// cos(0.139626340159546 - 8 degs)
0.
987688340595138,
// cos(0.15707963267949 - 9 degs)
0.
984807753012208,
// cos(0.174532925199433 - 10 degs)
0.
981627183447664,
// cos(0.191986217719376 - 11 degs)
0.
978147600733806,
// cos(0.20943951023932 - 12 degs)
0.
974370064785235,
// cos(0.226892802759263 - 13 degs)
0.
970295726275996,
// cos(0.244346095279206 - 14 degs)
0.
965925826289068,
// cos(0.261799387799149 - 15 degs)
0.
961261695938319,
// cos(0.279252680319093 - 16 degs)
0.
956304755963036,
// cos(0.296705972839036 - 17 degs)
0.
951056516295154,
// cos(0.314159265358979 - 18 degs)
0.
945518575599317,
// cos(0.331612557878923 - 19 degs)
0.
939692620785908,
// cos(0.349065850398866 - 20 degs)
0.
933580426497202,
// cos(0.366519142918809 - 21 degs)
0.
927183854566788,
// cos(0.383972435438752 - 22 degs)
0.
92050485345244,
// cos(0.401425727958696 - 23 degs)
0.
913545457642601,
// cos(0.418879020478639 - 24 degs)
0.
90630778703665,
// cos(0.436332312998582 - 25 degs)
0.
898794046299167,
// cos(0.453785605518526 - 26 degs)
0.
891006524188368,
// cos(0.471238898038469 - 27 degs)
0.
882947592858927,
// cos(0.488692190558412 - 28 degs)
0.
874619707139396,
// cos(0.506145483078356 - 29 degs)
0.
866025403784439,
// cos(0.523598775598299 - 30 degs)
0.
857167300702112,
// cos(0.541052068118242 - 31 degs)
0.
848048096156426,
// cos(0.558505360638185 - 32 degs)
0.
838670567945424,
// cos(0.575958653158129 - 33 degs)
0.
829037572555042,
// cos(0.593411945678072 - 34 degs)
0.
819152044288992,
// cos(0.610865238198015 - 35 degs)
0.
809016994374947,
// cos(0.628318530717959 - 36 degs)
0.
798635510047293,
// cos(0.645771823237902 - 37 degs)
0.
788010753606722,
// cos(0.663225115757845 - 38 degs)
0.
777145961456971,
// cos(0.680678408277788 - 39 degs)
0.
766044443118978,
// cos(0.698131700797732 - 40 degs)
0.
754709580222772,
// cos(0.715584993317675 - 41 degs)
0.
743144825477394,
// cos(0.733038285837618 - 42 degs)
0.
73135370161917,
// cos(0.750491578357562 - 43 degs)
0.
719339800338651,
// cos(0.767944870877505 - 44 degs)
0.
707106781186548,
// cos(0.785398163397448 - 45 degs)
0.
694658370458997,
// cos(0.802851455917392 - 46 degs)
0.
681998360062498,
// cos(0.820304748437335 - 47 degs)
0.
669130606358858,
// cos(0.837758040957278 - 48 degs)
0.
656059028990508,
// cos(0.855211333477221 - 49 degs)
0.
642787609686539,
// cos(0.872664625997165 - 50 degs)
0.
629320391049838,
// cos(0.890117918517108 - 51 degs)
0.
615661475325659,
// cos(0.907571211037051 - 52 degs)
0.
601815023152048,
// cos(0.925024503556995 - 53 degs)
0.
587785252292473,
// cos(0.942477796076938 - 54 degs)
0.
573576436351046,
// cos(0.959931088596881 - 55 degs)
0.
559192903470746,
// cos(0.977384381116825 - 56 degs)
0.
544639035015027,
// cos(0.994837673636768 - 57 degs)
0.
529919264233206,
// cos(1.01229096615671 - 58 degs)
0.
515038074910058,
// cos(1.02974425867665 - 59 degs)
0.
499999999999998,
// cos(1.0471975511966 - 60 degs)
0.
484809620246338,
// cos(1.06465084371654 - 61 degs)
0.
469471562785895,
// cos(1.08210413623648 - 62 degs)
0.
453990499739545,
// cos(1.09955742875643 - 63 degs)
0.
438371146789078,
// cos(1.11701072127637 - 64 degs)
0.
422618261740703,
// cos(1.13446401379631 - 65 degs)
0.
406736643075798,
// cos(1.15191730631626 - 66 degs)
0.
390731128489274,
// cos(1.1693705988362 - 67 degs)
0.
374606593415916,
// cos(1.18682389135614 - 68 degs)
0.
358367949545298,
// cos(1.20427718387609 - 69 degs)
0.
342020143325669,
// cos(1.22173047639603 - 70 degs)
0.
325568154457161,
// cos(1.23918376891597 - 71 degs)
0.
309016994374945,
// cos(1.25663706143592 - 72 degs)
0.
292371704722737,
// cos(1.27409035395586 - 73 degs)
0.
275637355817003,
// cos(1.2915436464758 - 74 degs)
0.
258819045102518,
// cos(1.30899693899575 - 75 degs)
0.
241921895599668,
// cos(1.32645023151569 - 76 degs)
0.
224951054343869,
// cos(1.34390352403563 - 77 degs)
0.
207911690817756,
// cos(1.36135681655558 - 78 degs)
0.
190808995376545,
// cos(1.37881010907552 - 79 degs)
0.
173648177666934,
// cos(1.39626340159546 - 80 degs)
0.
156434465040228,
// cos(1.41371669411541 - 81 degs)
0.
139173100960066,
// cos(1.43116998663535 - 82 degs)
0.
121869343405151,
// cos(1.44862327915529 - 83 degs)
0.
10452846326765,
// cos(1.46607657167524 - 84 degs)
0.
0871557427476583,
// cos(1.48352986419518 - 85 degs)
0.
0697564737441288,
// cos(1.50098315671512 - 86 degs)
0.
0523359562429406,
// cos(1.51843644923507 - 87 degs)
0.
0348994967025011,
// cos(1.53588974175501 - 88 degs)
0.
0174524064372869,
// cos(1.55334303427495 - 89 degs)
-
3.49148133884313e-
15,
// cos(1.5707963267949 - 90 degs)
-
0.
0174524064372837,
// cos(1.58824961931484 - 91 degs)
-
0.
0348994967024979,
// cos(1.60570291183478 - 92 degs)
-
0.
0523359562429474,
// cos(1.62315620435473 - 93 degs)
-
0.
0697564737441256,
// cos(1.64060949687467 - 94 degs)
-
0.
0871557427476551,
// cos(1.65806278939461 - 95 degs)
-
0.
104528463267657,
// cos(1.67551608191456 - 96 degs)
-
0.
121869343405148,
// cos(1.6929693744345 - 97 degs)
-
0.
139173100960062,
// cos(1.71042266695444 - 98 degs)
-
0.
156434465040235,
// cos(1.72787595947439 - 99 degs)
-
0.
173648177666931,
// cos(1.74532925199433 - 100 degs)
-
0.
190808995376542,
// cos(1.76278254451427 - 101 degs)
-
0.
207911690817763,
// cos(1.78023583703422 - 102 degs)
-
0.
224951054343865,
// cos(1.79768912955416 - 103 degs)
-
0.
241921895599665,
// cos(1.8151424220741 - 104 degs)
-
0.
258819045102525,
// cos(1.83259571459405 - 105 degs)
-
0.
275637355817,
// cos(1.85004900711399 - 106 degs)
-
0.
292371704722734,
// cos(1.86750229963393 - 107 degs)
-
0.
309016994374951,
// cos(1.88495559215388 - 108 degs)
-
0.
325568154457157,
// cos(1.90240888467382 - 109 degs)
-
0.
342020143325666,
// cos(1.91986217719376 - 110 degs)
-
0.
358367949545304,
// cos(1.93731546971371 - 111 degs)
-
0.
374606593415913,
// cos(1.95476876223365 - 112 degs)
-
0.
390731128489272,
// cos(1.97222205475359 - 113 degs)
-
0.
406736643075804,
// cos(1.98967534727354 - 114 degs)
-
0.
422618261740701,
// cos(2.00712863979348 - 115 degs)
-
0.
438371146789076,
// cos(2.02458193231342 - 116 degs)
-
0.
453990499739551,
// cos(2.04203522483337 - 117 degs)
-
0.
469471562785892,
// cos(2.05948851735331 - 118 degs)
-
0.
484809620246335,
// cos(2.07694180987325 - 119 degs)
-
0.
500000000000004,
// cos(2.0943951023932 - 120 degs)
-
0.
515038074910055,
// cos(2.11184839491314 - 121 degs)
-
0.
529919264233203,
// cos(2.12930168743308 - 122 degs)
-
0.
544639035015031,
// cos(2.14675497995303 - 123 degs)
-
0.
559192903470748,
// cos(2.16420827247297 - 124 degs)
-
0.
573576436351044,
// cos(2.18166156499291 - 125 degs)
-
0.
587785252292477,
// cos(2.19911485751286 - 126 degs)
-
0.
601815023152049,
// cos(2.2165681500328 - 127 degs)
-
0.
615661475325657,
// cos(2.23402144255274 - 128 degs)
-
0.
629320391049833,
// cos(2.25147473507268 - 129 degs)
-
0.
64278760968654,
// cos(2.26892802759263 - 130 degs)
-
0.
656059028990506,
// cos(2.28638132011257 - 131 degs)
-
0.
669130606358862,
// cos(2.30383461263252 - 132 degs)
-
0.
6819983600625,
// cos(2.32128790515246 - 133 degs)
-
0.
694658370458996,
// cos(2.3387411976724 - 134 degs)
-
0.
707106781186544,
// cos(2.35619449019234 - 135 degs)
-
0.
719339800338652,
// cos(2.37364778271229 - 136 degs)
-
0.
73135370161917,
// cos(2.39110107523223 - 137 degs)
-
0.
743144825477391,
// cos(2.40855436775217 - 138 degs)
-
0.
754709580222773,
// cos(2.42600766027212 - 139 degs)
-
0.
766044443118977,
// cos(2.44346095279206 - 140 degs)
-
0.
777145961456968,
// cos(2.460914245312 - 141 degs)
-
0.
788010753606723,
// cos(2.47836753783195 - 142 degs)
-
0.
798635510047292,
// cos(2.49582083035189 - 143 degs)
-
0.
809016994374945,
// cos(2.51327412287183 - 144 degs)
-
0.
819152044288993,
// cos(2.53072741539178 - 145 degs)
-
0.
829037572555041,
// cos(2.54818070791172 - 146 degs)
-
0.
838670567945421,
// cos(2.56563400043166 - 147 degs)
-
0.
848048096156427,
// cos(2.58308729295161 - 148 degs)
-
0.
857167300702112,
// cos(2.60054058547155 - 149 degs)
-
0.
866025403784436,
// cos(2.61799387799149 - 150 degs)
-
0.
874619707139397,
// cos(2.63544717051144 - 151 degs)
-
0.
882947592858927,
// cos(2.65290046303138 - 152 degs)
-
0.
891006524188366,
// cos(2.67035375555132 - 153 degs)
-
0.
898794046299168,
// cos(2.68780704807127 - 154 degs)
-
0.
90630778703665,
// cos(2.70526034059121 - 155 degs)
-
0.
913545457642599,
// cos(2.72271363311115 - 156 degs)
-
0.
920504853452441,
// cos(2.7401669256311 - 157 degs)
-
0.
927183854566787,
// cos(2.75762021815104 - 158 degs)
-
0.
9335804264972,
// cos(2.77507351067098 - 159 degs)
-
0.
939692620785909,
// cos(2.79252680319093 - 160 degs)
-
0.
945518575599317,
// cos(2.80998009571087 - 161 degs)
-
0.
951056516295152,
// cos(2.82743338823081 - 162 degs)
-
0.
956304755963036,
// cos(2.84488668075076 - 163 degs)
-
0.
961261695938319,
// cos(2.8623399732707 - 164 degs)
-
0.
965925826289067,
// cos(2.87979326579064 - 165 degs)
-
0.
970295726275997,
// cos(2.89724655831059 - 166 degs)
-
0.
974370064785235,
// cos(2.91469985083053 - 167 degs)
-
0.
978147600733805,
// cos(2.93215314335047 - 168 degs)
-
0.
981627183447665,
// cos(2.94960643587042 - 169 degs)
-
0.
984807753012208,
// cos(2.96705972839036 - 170 degs)
-
0.
987688340595137,
// cos(2.9845130209103 - 171 degs)
-
0.
990268068741571,
// cos(3.00196631343025 - 172 degs)
-
0.
992546151641322,
// cos(3.01941960595019 - 173 degs)
-
0.
994521895368273,
// cos(3.03687289847013 - 174 degs)
-
0.
996194698091746,
// cos(3.05432619099008 - 175 degs)
-
0.
997564050259824,
// cos(3.07177948351002 - 176 degs)
-
0.
998629534754574,
// cos(3.08923277602996 - 177 degs)
-
0.
999390827019096,
// cos(3.10668606854991 - 178 degs)
-
0.
999847695156391,
// cos(3.12413936106985 - 179 degs)
-
1,
// cos(3.14159265358979 - 180 degs)
-
0.
999847695156391,
// cos(3.15904594610974 - 181 degs)
-
0.
999390827019096,
// cos(3.17649923862968 - 182 degs)
-
0.
998629534754574,
// cos(3.19395253114962 - 183 degs)
-
0.
997564050259824,
// cos(3.21140582366957 - 184 degs)
-
0.
996194698091746,
// cos(3.22885911618951 - 185 degs)
-
0.
994521895368274,
// cos(3.24631240870945 - 186 degs)
-
0.
992546151641322,
// cos(3.2637657012294 - 187 degs)
-
0.
99026806874157,
// cos(3.28121899374934 - 188 degs)
-
0.
987688340595138,
// cos(3.29867228626928 - 189 degs)
-
0.
984807753012207,
// cos(3.31612557878923 - 190 degs)
-
0.
981627183447664,
// cos(3.33357887130917 - 191 degs)
-
0.
978147600733806,
// cos(3.35103216382911 - 192 degs)
-
0.
974370064785234,
// cos(3.36848545634906 - 193 degs)
-
0.
970295726275996,
// cos(3.385938748869 - 194 degs)
-
0.
965925826289069,
// cos(3.40339204138894 - 195 degs)
-
0.
961261695938318,
// cos(3.42084533390889 - 196 degs)
-
0.
956304755963035,
// cos(3.43829862642883 - 197 degs)
-
0.
951056516295154,
// cos(3.45575191894877 - 198 degs)
-
0.
945518575599316,
// cos(3.47320521146872 - 199 degs)
-
0.
939692620785908,
// cos(3.49065850398866 - 200 degs)
-
0.
933580426497203,
// cos(3.5081117965086 - 201 degs)
-
0.
927183854566786,
// cos(3.52556508902855 - 202 degs)
-
0.
92050485345244,
// cos(3.54301838154849 - 203 degs)
-
0.
913545457642602,
// cos(3.56047167406843 - 204 degs)
-
0.
906307787036648,
// cos(3.57792496658838 - 205 degs)
-
0.
898794046299167,
// cos(3.59537825910832 - 206 degs)
-
0.
891006524188369,
// cos(3.61283155162826 - 207 degs)
-
0.
882947592858925,
// cos(3.63028484414821 - 208 degs)
-
0.
874619707139395,
// cos(3.64773813666815 - 209 degs)
-
0.
86602540378444,
// cos(3.66519142918809 - 210 degs)
-
0.
85716730070211,
// cos(3.68264472170804 - 211 degs)
-
0.
848048096156425,
// cos(3.70009801422798 - 212 degs)
-
0.
838670567945425,
// cos(3.71755130674792 - 213 degs)
-
0.
829037572555039,
// cos(3.73500459926787 - 214 degs)
-
0.
819152044288991,
// cos(3.75245789178781 - 215 degs)
-
0.
809016994374949,
// cos(3.76991118430775 - 216 degs)
-
0.
79863551004729,
// cos(3.7873644768277 - 217 degs)
-
0.
788010753606721,
// cos(3.80481776934764 - 218 degs)
-
0.
777145961456972,
// cos(3.82227106186758 - 219 degs)
-
0.
766044443118975,
// cos(3.83972435438753 - 220 degs)
-
0.
754709580222771,
// cos(3.85717764690747 - 221 degs)
-
0.
743144825477395,
// cos(3.87463093942741 - 222 degs)
-
0.
731353701619174,
// cos(3.89208423194735 - 223 degs)
-
0.
71933980033865,
// cos(3.9095375244673 - 224 degs)
-
0.
707106781186549,
// cos(3.92699081698724 - 225 degs)
-
0.
694658370459001,
// cos(3.94444410950718 - 226 degs)
-
0.
681998360062497,
// cos(3.96189740202713 - 227 degs)
-
0.
669130606358859,
// cos(3.97935069454707 - 228 degs)
-
0.
656059028990511,
// cos(3.99680398706701 - 229 degs)
-
0.
642787609686537,
// cos(4.01425727958696 - 230 degs)
-
0.
629320391049839,
// cos(4.0317105721069 - 231 degs)
-
0.
615661475325662,
// cos(4.04916386462684 - 232 degs)
-
0.
601815023152047,
// cos(4.06661715714679 - 233 degs)
-
0.
587785252292474,
// cos(4.08407044966673 - 234 degs)
-
0.
57357643635105,
// cos(4.10152374218667 - 235 degs)
-
0.
559192903470745,
// cos(4.11897703470662 - 236 degs)
-
0.
544639035015028,
// cos(4.13643032722656 - 237 degs)
-
0.
529919264233209,
// cos(4.1538836197465 - 238 degs)
-
0.
515038074910052,
// cos(4.17133691226645 - 239 degs)
-
0.
500000000000001,
// cos(4.18879020478639 - 240 degs)
-
0.
484809620246341,
// cos(4.20624349730633 - 241 degs)
-
0.
469471562785888,
// cos(4.22369678982628 - 242 degs)
-
0.
453990499739548,
// cos(4.24115008234622 - 243 degs)
-
0.
438371146789081,
// cos(4.25860337486616 - 244 degs)
-
0.
422618261740697,
// cos(4.27605666738611 - 245 degs)
-
0.
406736643075801,
// cos(4.29350995990605 - 246 degs)
-
0.
390731128489277,
// cos(4.31096325242599 - 247 degs)
-
0.
37460659341591,
// cos(4.32841654494594 - 248 degs)
-
0.
358367949545301,
// cos(4.34586983746588 - 249 degs)
-
0.
342020143325673,
// cos(4.36332312998582 - 250 degs)
-
0.
325568154457154,
// cos(4.38077642250577 - 251 degs)
-
0.
309016994374948,
// cos(4.39822971502571 - 252 degs)
-
0.
29237170472274,
// cos(4.41568300754565 - 253 degs)
-
0.
275637355816996,
// cos(4.4331363000656 - 254 degs)
-
0.
258819045102521,
// cos(4.45058959258554 - 255 degs)
-
0.
241921895599671,
// cos(4.46804288510548 - 256 degs)
-
0.
224951054343862,
// cos(4.48549617762543 - 257 degs)
-
0.
20791169081776,
// cos(4.50294947014537 - 258 degs)
-
0.
190808995376548,
// cos(4.52040276266531 - 259 degs)
-
0.
173648177666928,
// cos(4.53785605518526 - 260 degs)
-
0.
156434465040231,
// cos(4.5553093477052 - 261 degs)
-
0.
139173100960069,
// cos(4.57276264022514 - 262 degs)
-
0.
121869343405145,
// cos(4.59021593274509 - 263 degs)
-
0.
104528463267653,
// cos(4.60766922526503 - 264 degs)
-
0.
0871557427476618,
// cos(4.62512251778497 - 265 degs)
-
0.
069756473744122,
// cos(4.64257581030492 - 266 degs)
-
0.
0523359562429434,
// cos(4.66002910282486 - 267 degs)
-
0.
0348994967025043,
// cos(4.6774823953448 - 268 degs)
-
0.
0174524064372799,
// cos(4.69493568786475 - 269 degs)
-
1.83697019872103e-
16,
// cos(4.71238898038469 - 270 degs)
0.
0174524064372805,
// cos(4.72984227290463 - 271 degs)
0.
0348994967025048,
// cos(4.74729556542458 - 272 degs)
0.
0523359562429439,
// cos(4.76474885794452 - 273 degs)
0.
0697564737441226,
// cos(4.78220215046446 - 274 degs)
0.
0871557427476614,
// cos(4.79965544298441 - 275 degs)
0.
104528463267654,
// cos(4.81710873550435 - 276 degs)
0.
121869343405144,
// cos(4.83456202802429 - 277 degs)
0.
139173100960069,
// cos(4.85201532054424 - 278 degs)
0.
156434465040232,
// cos(4.86946861306418 - 279 degs)
0.
173648177666927,
// cos(4.88692190558412 - 280 degs)
0.
190808995376549,
// cos(4.90437519810407 - 281 degs)
0.
20791169081776,
// cos(4.92182849062401 - 282 degs)
0.
224951054343862,
// cos(4.93928178314395 - 283 degs)
0.
241921895599672,
// cos(4.9567350756639 - 284 degs)
0.
258819045102521,
// cos(4.97418836818384 - 285 degs)
0.
275637355816997,
// cos(4.99164166070378 - 286 degs)
0.
292371704722741,
// cos(5.00909495322373 - 287 degs)
0.
309016994374948,
// cos(5.02654824574367 - 288 degs)
0.
325568154457155,
// cos(5.04400153826361 - 289 degs)
0.
342020143325672,
// cos(5.06145483078356 - 290 degs)
0.
358367949545301,
// cos(5.0789081233035 - 291 degs)
0.
37460659341591,
// cos(5.09636141582344 - 292 degs)
0.
390731128489278,
// cos(5.11381470834339 - 293 degs)
0.
406736643075801,
// cos(5.13126800086333 - 294 degs)
0.
422618261740697,
// cos(5.14872129338327 - 295 degs)
0.
438371146789081,
// cos(5.16617458590322 - 296 degs)
0.
453990499739548,
// cos(5.18362787842316 - 297 degs)
0.
469471562785889,
// cos(5.2010811709431 - 298 degs)
0.
484809620246341,
// cos(5.21853446346305 - 299 degs)
0.
500000000000001,
// cos(5.23598775598299 - 300 degs)
0.
515038074910053,
// cos(5.25344104850293 - 301 degs)
0.
529919264233209,
// cos(5.27089434102288 - 302 degs)
0.
544639035015028,
// cos(5.28834763354282 - 303 degs)
0.
559192903470745,
// cos(5.30580092606276 - 304 degs)
0.
57357643635105,
// cos(5.32325421858271 - 305 degs)
0.
587785252292474,
// cos(5.34070751110265 - 306 degs)
0.
601815023152046,
// cos(5.35816080362259 - 307 degs)
0.
615661475325662,
// cos(5.37561409614254 - 308 degs)
0.
629320391049839,
// cos(5.39306738866248 - 309 degs)
0.
642787609686538,
// cos(5.41052068118242 - 310 degs)
0.
656059028990504,
// cos(5.42797397370236 - 311 degs)
0.
66913060635886,
// cos(5.44542726622231 - 312 degs)
0.
681998360062497,
// cos(5.46288055874225 - 313 degs)
0.
694658370458994,
// cos(5.48033385126219 - 314 degs)
0.
707106781186549,
// cos(5.49778714378214 - 315 degs)
0.
71933980033865,
// cos(5.51524043630208 - 316 degs)
0.
731353701619174,
// cos(5.53269372882203 - 317 degs)
0.
743144825477395,
// cos(5.55014702134197 - 318 degs)
0.
754709580222771,
// cos(5.56760031386191 - 319 degs)
0.
766044443118975,
// cos(5.58505360638185 - 320 degs)
0.
777145961456972,
// cos(5.6025068989018 - 321 degs)
0.
788010753606721,
// cos(5.61996019142174 - 322 degs)
0.
79863551004729,
// cos(5.63741348394168 - 323 degs)
0.
809016994374949,
// cos(5.65486677646163 - 324 degs)
0.
819152044288991,
// cos(5.67232006898157 - 325 degs)
0.
829037572555039,
// cos(5.68977336150151 - 326 degs)
0.
838670567945425,
// cos(5.70722665402146 - 327 degs)
0.
848048096156425,
// cos(5.7246799465414 - 328 degs)
0.
85716730070211,
// cos(5.74213323906134 - 329 degs)
0.
86602540378444,
// cos(5.75958653158129 - 330 degs)
0.
874619707139396,
// cos(5.77703982410123 - 331 degs)
0.
882947592858925,
// cos(5.79449311662117 - 332 degs)
0.
891006524188369,
// cos(5.81194640914112 - 333 degs)
0.
898794046299167,
// cos(5.82939970166106 - 334 degs)
0.
906307787036648,
// cos(5.846852994181 - 335 degs)
0.
913545457642602,
// cos(5.86430628670095 - 336 degs)
0.
92050485345244,
// cos(5.88175957922089 - 337 degs)
0.
927183854566786,
// cos(5.89921287174083 - 338 degs)
0.
933580426497203,
// cos(5.91666616426078 - 339 degs)
0.
939692620785908,
// cos(5.93411945678072 - 340 degs)
0.
945518575599316,
// cos(5.95157274930066 - 341 degs)
0.
951056516295154,
// cos(5.96902604182061 - 342 degs)
0.
956304755963035,
// cos(5.98647933434055 - 343 degs)
0.
961261695938318,
// cos(6.00393262686049 - 344 degs)
0.
965925826289069,
// cos(6.02138591938044 - 345 degs)
0.
970295726275996,
// cos(6.03883921190038 - 346 degs)
0.
974370064785234,
// cos(6.05629250442032 - 347 degs)
0.
978147600733806,
// cos(6.07374579694027 - 348 degs)
0.
981627183447664,
// cos(6.09119908946021 - 349 degs)
0.
984807753012207,
// cos(6.10865238198015 - 350 degs)
0.
987688340595138,
// cos(6.1261056745001 - 351 degs)
0.
99026806874157,
// cos(6.14355896702004 - 352 degs)
0.
992546151641322,
// cos(6.16101225953998 - 353 degs)
0.
994521895368274,
// cos(6.17846555205993 - 354 degs)
0.
996194698091746,
// cos(6.19591884457987 - 355 degs)
0.
997564050259824,
// cos(6.21337213709981 - 356 degs)
0.
998629534754574,
// cos(6.23082542961976 - 357 degs)
0.
999390827019096,
// cos(6.2482787221397 - 358 degs)
0.
999847695156391,
// cos(6.26573201465964 - 359 degs)
1 // cos(6.28318530717959 - 360 degs)
};
#endif
static inline double rad_to_deg(
double rad)
{
return rad *
OMNI_PI_180;
// degrees = radians * π / 180
}
static inline double deg_to_red(
double deg)
{
return deg *
OMNI_180_PI;
// radians = degrees * 180 / π
}
template <
typename T >
static inline T delta(
const T& a,
const T& b)
{
return a - b;
}
template <
typename T >
static inline T delta_squared(
const T& a,
const T& b)
{
return (a - b) * (a - b);
}
template <
typename T >
static inline double area_of_circle(T radius)
{
return OMNI_PI *
static_cast<
double>(radius) *
static_cast<
double>(radius);
}
template <
typename T >
static inline double area_circle_sector(T radius, T degrees)
{
return (
static_cast<
double>(degrees) /
360.
0) *
omni::math::area_of_circle(radius);
}
template <
typename T >
static inline double radius_from_area(T area)
{
return std::sqrt(
static_cast<
double>(area) /
OMNI_PI);
}
template <
typename T >
static inline double distance_between_2_points(T start_x, T start_y, T end_x, T end_y)
{
return std::sqrt(
omni::math::delta_squared(start_x, end_x) +
omni::math::delta_squared(start_y, end_y));
}
template <
typename T >
static inline double lerp_y(T x1, T y1, T x2, T y2, T x)
{
return ((
omni::math::delta(x, x1) *
omni::math::delta(y2, y1) /
omni::math::delta(x2, x1)) + y1);
}
template <
typename T >
static inline double lerp_x(T x1, T y1, T x2, T y2, T y)
{
return ((
omni::math::delta(y, y1) *
omni::math::delta(x2, x1) /
omni::math::delta(y2, y1)) + x1);
}
template <
typename T >
static inline bool are_equal(T x, T y, T epsilon)
{
return std::fabs(x - y) <= epsilon;
}
template <
typename T >
static inline bool are_equal(T x, T y)
{
return omni::math::are_equal(x, y,
std::numeric_limits<T>::epsilon());
}
}
}
#endif // OMNI_MATH_HPP