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
33namespace cifti {
34
38//NOTE: in CiftiLib, we only reference matrixToQuatern and quaternToMatrix, both used only in NiftiHeader when using volume files, not cifti files
40public:
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