CiftiLib
A C++ library for CIFTI-2 and CIFTI-1 files
MathFunctions.h
1 #ifndef __MATHFUNCTIONS_H__
2 #define __MATHFUNCTIONS_H__
3 
4 /*LICENSE_START*/
5 /*
6  * Copyright (c) 2014, Washington University School of Medicine
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without modification,
10  * are permitted provided that the following conditions are met:
11  *
12  * 1. Redistributions of source code must retain the above copyright notice,
13  * this list of conditions and the following disclaimer.
14  *
15  * 2. Redistributions in binary form must reproduce the above copyright notice,
16  * this list of conditions and the following disclaimer in the documentation
17  * and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30 
31 #include <stdint.h>
32 
33 namespace cifti {
34 
38 //NOTE: in CiftiLib, we only reference matrixToQuatern and quaternToMatrix, both used only in NiftiHeader when using volume files, not cifti files
40 public:
41  static int64_t combinations(
42  const int64_t n,
43  const int64_t k);
44 
45  static int64_t permutations(
46  const int64_t n,
47  const int64_t k);
48 
49  static int64_t factorial(const int64_t n);
50 
51  static bool normalVector(
52  const float v1[3],
53  const float v2[3],
54  const float v3[3],
55  float normalVectorOut[3]);
56 
57  static bool normalVector(
58  const double v1[3],
59  const double v2[3],
60  const double v3[3],
61  double normalVectorOut[3]);
62 
63  static void normalVectorDirection(
64  const float v1[3],
65  const float v2[3],
66  const float v3[3],
67  float directionOut[3]);
68 
69  static void crossProduct(
70  const float v1[],
71  const float v2[],
72  float resultOut[]);
73 
74  static void crossProduct(
75  const double v1[],
76  const double v2[],
77  double resultOut[]);
78 
79  static void normalizedCrossProduct(
80  const float x1[],
81  const float x2[],
82  float resultOut[]);
83 
84  static float normalizeVector(
85  float vectorsAll[],
86  const int32_t offset);
87 
88  static float normalizeVector(float vectorInOut[3]);
89 
90  static double normalizeVector(double vectorInOut[3]);
91 
92  static float vectorLength(const float vector[3]);
93 
94  static float vectorLength(
95  const float vectorsAll[],
96  const int32_t offset);
97 
98  static double vectorLength(const double vector[3]);
99 
100  static float distanceSquared3D(
101  const float p1[3],
102  const float p2[3]);
103 
104  static float distanceSquared3D(
105  const float xyzAll[],
106  const int32_t offsetCoord1,
107  const int32_t offsetCoord2);
108 
109  static float distance3D(
110  const float p1[3],
111  const float p2[3]);
112 
113  static double distanceSquared3D(
114  const double p1[3],
115  const double p2[3]);
116 
117  static double distance3D(
118  const double p1[3],
119  const double p2[3]);
120 
121  static double distanceSquared2D(const double x1,
122  const double y1,
123  const double x2,
124  const double y2);
125 
126  static void subtractVectors(
127  const float v1[3],
128  const float v2[3],
129  float resultOut[3]);
130 
131  static void addVectors(
132  const float v1[3],
133  const float v2[3],
134  float resultOut[3]);
135 
136  static void createUnitVector(
137  const float startXYZ[3],
138  const float endXYZ[3],
139  float unitVectorOut[3]);
140 
141  static void createUnitVector(
142  const double startXYZ[3],
143  const double endXYZ[3],
144  double unitVectorOut[3]);
145 
146  static float dotProduct(
147  const float p1[3],
148  const float p2[3]);
149 
150  static double dotProduct(
151  const double p1[3],
152  const double p2[3]);
153 
154  static float triangleArea(
155  const float v1[3],
156  const float v2[3],
157  const float v3[3]);
158 
159  static float triangleArea(const double v1[3],
160  const double v2[3],
161  const double v3[3]);
162 
163  static float triangleArea(
164  const float xyzAll[],
165  const int32_t offsetCoord1,
166  const int32_t offsetCoord2,
167  const int32_t offsetCoord3);
168 
169  static float triangleAreaSigned2D(
170  const float p1[3],
171  const float p2[3],
172  const float p3[3]);
173 
174  static float triangleAreaSigned3D(
175  const float referenceNormal[3],
176  const float p1[3],
177  const float p2[3],
178  const float p3[3]);
179 
180  static bool lineIntersection2D(
181  const float p1[3],
182  const float p2[3],
183  const float q1[3],
184  const float q2[3],
185  const float tolerance,
186  float intersectionOut[3]);
187 
188  static bool rayIntersectPlane(
189  const float p1[3],
190  const float p2[3],
191  const float p3[3],
192  const float rayOrigin[3],
193  const float rayVector[3],
194  float intersectionXYZandDistance[3]);
195 
196  static void projectPoint(
197  const float pt[3],
198  const float origin[3],
199  const float normal[3],
200  float projectedPointOut[3]);
201 
202  static float signedDistanceFromPlane(
203  const float planeNormal[3],
204  const float pointInPlane[3],
205  const float queryPoint[3]);
206 
207  static int32_t limitRange(
208  const int32_t value,
209  const int32_t minimumValue,
210  const int32_t maximumValue);
211 
212  static float limitRange(
213  const float value,
214  const float minimumValue,
215  const float maximumValue);
216 
217  static double limitRange(
218  const double value,
219  const double minimumValue,
220  const double maximumValue);
221 
222  static float distanceToLine3D(
223  const float p1[3],
224  const float p2[3],
225  const float point[3]);
226 
227  static bool arraysEqual(
228  const float a[],
229  const float b[],
230  const int32_t numElements);
231 
232  static void averageOfThreeCoordinates(
233  const float c1[3],
234  const float c2[3],
235  const float c3[3],
236  float outputAverage[3]);
237 
238  static void averageOfThreeCoordinates(
239  const float xyzAll[],
240  const int32_t offsetCoord1,
241  const int32_t offsetCoord2,
242  const int32_t offsetCoord3,
243  float outputAverage[],
244  const int32_t outputOffset);
245 
246  static float angle(
247  const float p1[3],
248  const float p2[3],
249  const float p3[3]);
250 
251  static float signedAngle(
252  const float pi[3],
253  const float pj[3],
254  const float pk[3],
255  const float n[3]);
256 
257  static bool isOddNumber(const int32_t number);
258 
259  static bool isEvenNumber(const int32_t number);
260 
261  static bool isNaN(const float number);
262 
263  static bool isPosInf(const float number);
264 
265  static bool isNegInf(const float number);
266 
268  static bool isInf(const float number);
269 
271  static bool isNumeric(const float number);
272 
273  static bool compareArrays(
274  const float a1[],
275  const float a2[],
276  const int32_t numElements,
277  const float tolerance);
278 
279  static int32_t clamp(
280  const int32_t value,
281  const int32_t minimum,
282  const int32_t maximum);
283 
284  static float clamp(
285  const float value,
286  const float minimum,
287  const float maximum);
288 
290  static uint32_t gcd(uint32_t num1, uint32_t num2);
291 
293  static void quaternToMatrix(const float cijk[4], float matrix[3][3]);
294 
296  static void quaternToMatrix(const double cijk[4], double matrix[3][3]);
297 
299  static bool matrixToQuatern(const float matrix[3][3], float cijk[4]);
300 
302  static bool matrixToQuatern(const double matrix[3][3], double cijk[4]);
303 
304  static double remainder(const double numerator,
305  const double denominator);
306 
307  static double round(const double value);
308 
309 };
310 
311 } // namespace
312 
313 #endif // __MATHFUNCTIONS_H__
Definition: MathFunctions.h:39
static bool normalVector(const float v1[3], const float v2[3], const float v3[3], float normalVectorOut[3])
Definition: MathFunctions.cxx:132
static void subtractVectors(const float v1[3], const float v2[3], float resultOut[3])
Definition: MathFunctions.cxx:541
static float angle(const float p1[3], const float p2[3], const float p3[3])
Definition: MathFunctions.cxx:1162
static float vectorLength(const float vector[3])
Definition: MathFunctions.cxx:379
static int32_t clamp(const int32_t value, const int32_t minimum, const int32_t maximum)
Definition: MathFunctions.cxx:1298
static bool isNumeric(const float number)
true only if not NaN, inf, or -inf
Definition: MathFunctions.cxx:1381
static double round(const double value)
Definition: MathFunctions.cxx:1706
static int64_t permutations(const int64_t n, const int64_t k)
Definition: MathFunctions.cxx:88
static void createUnitVector(const float startXYZ[3], const float endXYZ[3], float unitVectorOut[3])
Definition: MathFunctions.cxx:568
static void averageOfThreeCoordinates(const float c1[3], const float c2[3], const float c3[3], float outputAverage[3])
Definition: MathFunctions.cxx:1113
static float triangleAreaSigned2D(const float p1[3], const float p2[3], const float p3[3])
Definition: MathFunctions.cxx:734
static float distance3D(const float p1[3], const float p2[3])
Definition: MathFunctions.cxx:477
static void normalizedCrossProduct(const float x1[], const float x2[], float resultOut[])
Definition: MathFunctions.cxx:294
static float normalizeVector(float vectorsAll[], const int32_t offset)
Definition: MathFunctions.cxx:319
static float signedAngle(const float pi[3], const float pj[3], const float pk[3], const float n[3])
Definition: MathFunctions.cxx:1207
static float triangleAreaSigned3D(const float referenceNormal[3], const float p1[3], const float p2[3], const float p3[3])
Definition: MathFunctions.cxx:756
static void projectPoint(const float pt[3], const float origin[3], const float normal[3], float projectedPointOut[3])
Definition: MathFunctions.cxx:917
static float triangleArea(const float v1[3], const float v2[3], const float v3[3])
Definition: MathFunctions.cxx:643
static bool arraysEqual(const float a[], const float b[], const int32_t numElements)
Definition: MathFunctions.cxx:1088
static float distanceToLine3D(const float p1[3], const float p2[3], const float point[3])
Definition: MathFunctions.cxx:1057
static float distanceSquared3D(const float p1[3], const float p2[3])
Definition: MathFunctions.cxx:435
static double remainder(const double numerator, const double denominator)
Definition: MathFunctions.cxx:1636
static bool rayIntersectPlane(const float p1[3], const float p2[3], const float p3[3], const float rayOrigin[3], const float rayVector[3], float intersectionXYZandDistance[3])
Definition: MathFunctions.cxx:862
static float dotProduct(const float p1[3], const float p2[3])
Definition: MathFunctions.cxx:610
static uint32_t gcd(uint32_t num1, uint32_t num2)
greatest common divisor
Definition: MathFunctions.cxx:1343
static bool matrixToQuatern(const float matrix[3][3], float cijk[4])
try to convert 3x3 matrix to quaternion (return false if not a rotation matrix)
Definition: MathFunctions.cxx:1439
static bool lineIntersection2D(const float p1[3], const float p2[3], const float q1[3], const float q2[3], const float tolerance, float intersectionOut[3])
Definition: MathFunctions.cxx:801
static double distanceSquared2D(const double x1, const double y1, const double x2, const double y2)
Definition: MathFunctions.cxx:1332
static float signedDistanceFromPlane(const float planeNormal[3], const float pointInPlane[3], const float queryPoint[3])
Definition: MathFunctions.cxx:950
static bool compareArrays(const float a1[], const float a2[], const int32_t numElements, const float tolerance)
Definition: MathFunctions.cxx:1272
static int64_t combinations(const int64_t n, const int64_t k)
Definition: MathFunctions.cxx:49
static void crossProduct(const float v1[], const float v2[], float resultOut[])
Definition: MathFunctions.cxx:256
static int32_t limitRange(const int32_t value, const int32_t minimumValue, const int32_t maximumValue)
Definition: MathFunctions.cxx:979
static bool isEvenNumber(const int32_t number)
Definition: MathFunctions.cxx:1256
static bool isInf(const float number)
true if either inf or -inf
Definition: MathFunctions.cxx:1366
static int64_t factorial(const int64_t n)
Definition: MathFunctions.cxx:109
static void normalVectorDirection(const float v1[3], const float v2[3], const float v3[3], float directionOut[3])
Definition: MathFunctions.cxx:226
static void quaternToMatrix(const float cijk[4], float matrix[3][3])
convert quaternion to rotation matrix
Definition: MathFunctions.cxx:1391
static bool isOddNumber(const int32_t number)
Definition: MathFunctions.cxx:1243
namespace for all CiftiLib functionality
Definition: CiftiBrainModelsMap.h:42