1 /*
2  * Medical Image Registration ToolKit (MIRTK)
3  *
4  * Copyright 2008-2015 Imperial College London
5  *
6  * Licensed under the Apache License, Version 2.0 (the "License");
7  * you may not use this file except in compliance with the License.
8  * You may obtain a copy of the License at
9  *
10  *     http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS,
14  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  * See the License for the specific language governing permissions and
16  * limitations under the License.
17  */
18 
19 
20 #include "mirtk/Math.h"
21 #include "mirtk/Arith.h"
22 
23 using namespace std;
24 
25 
26 namespace mirtk {
27 
28 
29 //----------------------------------------------------------------------------
IAbs(int iValue)30 int IAbs(int iValue)
31 {
32   return ( iValue >= 0 ? iValue : -iValue );
33 }
34 
35 //----------------------------------------------------------------------------
ICeil(float fValue)36 int ICeil(float fValue)
37 {
38   return int(ceil(fValue));
39 }
40 
41 //----------------------------------------------------------------------------
IFloor(float fValue)42 int IFloor(float fValue)
43 {
44   return int(floor(fValue));
45 }
46 
47 //----------------------------------------------------------------------------
ISign(int iValue)48 int ISign(int iValue)
49 {
50   return ( iValue > 0 ? +1 : ( iValue < 0 ? -1 : 0 ) );
51 }
52 
53 //----------------------------------------------------------------------------
Abs(double fValue)54 double Abs(double fValue)
55 {
56   return double(fabs(fValue));
57 }
58 
59 //----------------------------------------------------------------------------
ACos(double fValue)60 double ACos(double fValue)
61 {
62   if ( -1.0 < fValue ) {
63     if ( fValue < 1.0 )
64       return double(acos(fValue));
65     else
66       return 0.0;
67   } else {
68     return pi;
69   }
70 }
71 
72 //----------------------------------------------------------------------------
ASin(double fValue)73 double ASin(double fValue)
74 {
75   if ( -1.0 < fValue ) {
76     if ( fValue < 1.0 )
77       return double(asin(fValue));
78     else
79       return -pi_half;
80   } else {
81     return pi_half;
82   }
83 }
84 
85 //----------------------------------------------------------------------------
ATan(double fValue)86 double ATan (double fValue)
87 {
88   return double(atan(fValue));
89 }
90 
91 //----------------------------------------------------------------------------
ATan2(double fY,double fX)92 double ATan2(double fY, double fX)
93 {
94   return double(atan2(fY,fX));
95 }
96 
97 //----------------------------------------------------------------------------
Ceil(double fValue)98 double Ceil(double fValue)
99 {
100   return double(ceil(fValue));
101 }
102 
103 //----------------------------------------------------------------------------
Cos(double fValue)104 double Cos(double fValue)
105 {
106   return double(cos(fValue));
107 }
108 
109 //----------------------------------------------------------------------------
Exp(double fValue)110 double Exp(double fValue)
111 {
112   return double(exp(fValue));
113 }
114 
115 //----------------------------------------------------------------------------
Floor(double fValue)116 double Floor(double fValue)
117 {
118   return double(floor(fValue));
119 }
120 
121 //----------------------------------------------------------------------------
Log(double fValue)122 double Log(double fValue)
123 {
124   return double(log(fValue));
125 }
126 
127 //----------------------------------------------------------------------------
Pow(double fBase,double fExponent)128 double Pow(double fBase, double fExponent)
129 {
130   return double(pow(fBase, fExponent));
131 }
132 
133 //----------------------------------------------------------------------------
Sign(double fValue)134 double Sign(double fValue)
135 {
136   if ( fValue > 0.0 )
137     return 1.0;
138 
139   if ( fValue < 0.0 )
140     return -1.0;
141 
142   return 0.0;
143 }
144 
145 //----------------------------------------------------------------------------
Sin(double fValue)146 double Sin(double fValue)
147 {
148   return double(sin(fValue));
149 }
150 
151 //----------------------------------------------------------------------------
Sqr(double fValue)152 double Sqr(double fValue)
153 {
154   return fValue*fValue;
155 }
156 
157 //----------------------------------------------------------------------------
Sqrt(double fValue)158 double Sqrt(double fValue)
159 {
160   return double(sqrt(fValue));
161 }
162 
163 //----------------------------------------------------------------------------
UnitRandom()164 double UnitRandom()
165 {
166   return double(rand())/double(RAND_MAX);
167 }
168 
169 //----------------------------------------------------------------------------
SymmetricRandom()170 double SymmetricRandom()
171 {
172   return 2.0*double(rand())/double(RAND_MAX) - 1.0;
173 }
174 
175 
176 } // namespace mirtk
177