VTK  9.1.0
vtkMath.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkMath.h
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14=========================================================================
15 Copyright 2011 Sandia Corporation.
16 Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
17 license for use of this work by or on behalf of the
18 U.S. Government. Redistribution and use in source and binary forms, with
19 or without modification, are permitted provided that this Notice and any
20 statement of authorship are reproduced on all copies.
21
22 Contact: pppebay@sandia.gov,dcthomp@sandia.gov
23
24=========================================================================*/
48#ifndef vtkMath_h
49#define vtkMath_h
50
51#include "vtkCommonCoreModule.h" // For export macro
52#include "vtkMathPrivate.hxx" // For Matrix meta-class helpers
53#include "vtkMatrixUtilities.h" // For Matrix wrapping / mapping
54#include "vtkObject.h"
55#include "vtkSmartPointer.h" // For vtkSmartPointer.
56#include "vtkTypeTraits.h" // For type traits
57
58#include "vtkMathConfigure.h" // For <cmath> and VTK_HAS_ISNAN etc.
59
60#include <algorithm> // for std::clamp
61#include <cassert> // assert() in inline implementations.
62
63#ifndef DBL_MIN
64#define VTK_DBL_MIN 2.2250738585072014e-308
65#else // DBL_MIN
66#define VTK_DBL_MIN DBL_MIN
67#endif // DBL_MIN
68
69#ifndef DBL_EPSILON
70#define VTK_DBL_EPSILON 2.2204460492503131e-16
71#else // DBL_EPSILON
72#define VTK_DBL_EPSILON DBL_EPSILON
73#endif // DBL_EPSILON
74
75#ifndef VTK_DBL_EPSILON
76#ifndef DBL_EPSILON
77#define VTK_DBL_EPSILON 2.2204460492503131e-16
78#else // DBL_EPSILON
79#define VTK_DBL_EPSILON DBL_EPSILON
80#endif // DBL_EPSILON
81#endif // VTK_DBL_EPSILON
82
83class vtkDataArray;
84class vtkPoints;
85class vtkMathInternal;
88
89namespace vtk_detail
90{
91// forward declaration
92template <typename OutT>
93void RoundDoubleToIntegralIfNecessary(double val, OutT* ret);
94} // end namespace vtk_detail
95
96class VTKCOMMONCORE_EXPORT vtkMath : public vtkObject
97{
98public:
99 static vtkMath* New();
100 vtkTypeMacro(vtkMath, vtkObject);
101 void PrintSelf(ostream& os, vtkIndent indent) override;
102
106 static constexpr double Pi() { return 3.141592653589793; }
107
109
112 static float RadiansFromDegrees(float degrees);
113 static double RadiansFromDegrees(double degrees);
115
117
120 static float DegreesFromRadians(float radians);
121 static double DegreesFromRadians(double radians);
123
127#if 1
128 static int Round(float f) { return static_cast<int>(f + (f >= 0.0 ? 0.5 : -0.5)); }
129 static int Round(double f) { return static_cast<int>(f + (f >= 0.0 ? 0.5 : -0.5)); }
130#endif
131
136 template <typename OutT>
137 static void RoundDoubleToIntegralIfNecessary(double val, OutT* ret)
138 {
139 // Can't specialize template methods in a template class, so we move the
140 // implementations to a external namespace.
142 }
143
149 static int Floor(double x);
150
156 static int Ceil(double x);
157
163 static int CeilLog2(vtkTypeUInt64 x);
164
169 template <class T>
170 static T Min(const T& a, const T& b);
171
176 template <class T>
177 static T Max(const T& a, const T& b);
178
182 static bool IsPowerOfTwo(vtkTypeUInt64 x);
183
189 static int NearestPowerOfTwo(int x);
190
195 static vtkTypeInt64 Factorial(int N);
196
202 static vtkTypeInt64 Binomial(int m, int n);
203
215 static int* BeginCombination(int m, int n);
216
227 static int NextCombination(int m, int n, int* combination);
228
232 static void FreeCombination(int* combination);
233
249 static void RandomSeed(int s);
250
262 static int GetSeed();
263
277 static double Random();
278
291 static double Random(double min, double max);
292
305 static double Gaussian();
306
319 static double Gaussian(double mean, double std);
320
325 template <class VectorT1, class VectorT2>
326 static void Assign(const VectorT1& a, VectorT2&& b)
327 {
328 b[0] = a[0];
329 b[1] = a[1];
330 b[2] = a[2];
331 }
332
336 static void Assign(const double a[3], double b[3]) { vtkMath::Assign<>(a, b); }
337
341 static void Add(const float a[3], const float b[3], float c[3])
342 {
343 for (int i = 0; i < 3; ++i)
344 {
345 c[i] = a[i] + b[i];
346 }
347 }
348
352 static void Add(const double a[3], const double b[3], double c[3])
353 {
354 for (int i = 0; i < 3; ++i)
355 {
356 c[i] = a[i] + b[i];
357 }
358 }
359
363 static void Subtract(const float a[3], const float b[3], float c[3])
364 {
365 for (int i = 0; i < 3; ++i)
366 {
367 c[i] = a[i] - b[i];
368 }
369 }
370
374 static void Subtract(const double a[3], const double b[3], double c[3])
375 {
376 for (int i = 0; i < 3; ++i)
377 {
378 c[i] = a[i] - b[i];
379 }
380 }
381
387 template <class VectorT1, class VectorT2, class VectorT3>
388 static void Subtract(const VectorT1& a, const VectorT2& b, VectorT3&& c)
389 {
390 c[0] = a[0] - b[0];
391 c[1] = a[1] - b[1];
392 c[2] = a[2] - b[2];
393 }
394
399 static void MultiplyScalar(float a[3], float s)
400 {
401 for (int i = 0; i < 3; ++i)
402 {
403 a[i] *= s;
404 }
405 }
406
411 static void MultiplyScalar2D(float a[2], float s)
412 {
413 for (int i = 0; i < 2; ++i)
414 {
415 a[i] *= s;
416 }
417 }
418
423 static void MultiplyScalar(double a[3], double s)
424 {
425 for (int i = 0; i < 3; ++i)
426 {
427 a[i] *= s;
428 }
429 }
430
435 static void MultiplyScalar2D(double a[2], double s)
436 {
437 for (int i = 0; i < 2; ++i)
438 {
439 a[i] *= s;
440 }
441 }
442
446 static float Dot(const float a[3], const float b[3])
447 {
448 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
449 }
450
454 static double Dot(const double a[3], const double b[3])
455 {
456 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
457 }
458
474 template <typename ReturnTypeT = double, typename TupleRangeT1, typename TupleRangeT2,
475 typename EnableT = typename std::conditional<!std::is_pointer<TupleRangeT1>::value &&
477 TupleRangeT1, TupleRangeT2>::type::value_type>
478 static ReturnTypeT Dot(const TupleRangeT1& a, const TupleRangeT2& b)
479 {
480 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
481 }
482
486 static void Outer(const float a[3], const float b[3], float c[3][3])
487 {
488 for (int i = 0; i < 3; ++i)
489 {
490 for (int j = 0; j < 3; ++j)
491 {
492 c[i][j] = a[i] * b[j];
493 }
494 }
495 }
496
500 static void Outer(const double a[3], const double b[3], double c[3][3])
501 {
502 for (int i = 0; i < 3; ++i)
503 {
504 for (int j = 0; j < 3; ++j)
505 {
506 c[i][j] = a[i] * b[j];
507 }
508 }
509 }
510
515 static void Cross(const float a[3], const float b[3], float c[3]);
516
521 static void Cross(const double a[3], const double b[3], double c[3]);
522
524
527 static float Norm(const float* x, int n);
528 static double Norm(const double* x, int n);
530
534 static float Norm(const float v[3]) { return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); }
535
539 static double Norm(const double v[3])
540 {
541 return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
542 }
543
553 template <typename ReturnTypeT = double, typename TupleRangeT>
554 static ReturnTypeT SquaredNorm(const TupleRangeT& v)
555 {
556 return v[0] * v[0] + v[1] * v[1] + v[2] * v[2];
557 }
558
563 static float Normalize(float v[3]);
564
569 static double Normalize(double v[3]);
570
572
579 static void Perpendiculars(const double v1[3], double v2[3], double v3[3], double theta);
580 static void Perpendiculars(const float v1[3], float v2[3], float v3[3], double theta);
582
584
589 static bool ProjectVector(const float a[3], const float b[3], float projection[3]);
590 static bool ProjectVector(const double a[3], const double b[3], double projection[3]);
592
594
600 static bool ProjectVector2D(const float a[2], const float b[2], float projection[2]);
601 static bool ProjectVector2D(const double a[2], const double b[2], double projection[2]);
603
619 template <typename ReturnTypeT = double, typename TupleRangeT1, typename TupleRangeT2,
620 typename EnableT = typename std::conditional<!std::is_pointer<TupleRangeT1>::value &&
622 TupleRangeT1, TupleRangeT2>::type::value_type>
623 static ReturnTypeT Distance2BetweenPoints(const TupleRangeT1& p1, const TupleRangeT2& p2);
624
629 static float Distance2BetweenPoints(const float p1[3], const float p2[3]);
630
635 static double Distance2BetweenPoints(const double p1[3], const double p2[3]);
636
640 static double AngleBetweenVectors(const double v1[3], const double v2[3]);
641
646 const double v1[3], const double v2[3], const double vn[3]);
647
652 static double GaussianAmplitude(const double variance, const double distanceFromMean);
653
658 static double GaussianAmplitude(const double mean, const double variance, const double position);
659
665 static double GaussianWeight(const double variance, const double distanceFromMean);
666
672 static double GaussianWeight(const double mean, const double variance, const double position);
673
677 static float Dot2D(const float x[2], const float y[2]) { return x[0] * y[0] + x[1] * y[1]; }
678
682 static double Dot2D(const double x[2], const double y[2]) { return x[0] * y[0] + x[1] * y[1]; }
683
687 static void Outer2D(const float x[2], const float y[2], float A[2][2])
688 {
689 for (int i = 0; i < 2; ++i)
690 {
691 for (int j = 0; j < 2; ++j)
692 {
693 A[i][j] = x[i] * y[j];
694 }
695 }
696 }
697
701 static void Outer2D(const double x[2], const double y[2], double A[2][2])
702 {
703 for (int i = 0; i < 2; ++i)
704 {
705 for (int j = 0; j < 2; ++j)
706 {
707 A[i][j] = x[i] * y[j];
708 }
709 }
710 }
711
716 static float Norm2D(const float x[2]) { return std::sqrt(x[0] * x[0] + x[1] * x[1]); }
717
722 static double Norm2D(const double x[2]) { return std::sqrt(x[0] * x[0] + x[1] * x[1]); }
723
728 static float Normalize2D(float v[2]);
729
734 static double Normalize2D(double v[2]);
735
739 static float Determinant2x2(const float c1[2], const float c2[2])
740 {
741 return c1[0] * c2[1] - c2[0] * c1[1];
742 }
743
745
748 static double Determinant2x2(double a, double b, double c, double d) { return a * d - b * c; }
749 static double Determinant2x2(const double c1[2], const double c2[2])
750 {
751 return c1[0] * c2[1] - c2[0] * c1[1];
752 }
754
756
759 static void LUFactor3x3(float A[3][3], int index[3]);
760 static void LUFactor3x3(double A[3][3], int index[3]);
762
764
767 static void LUSolve3x3(const float A[3][3], const int index[3], float x[3]);
768 static void LUSolve3x3(const double A[3][3], const int index[3], double x[3]);
770
772
776 static void LinearSolve3x3(const float A[3][3], const float x[3], float y[3]);
777 static void LinearSolve3x3(const double A[3][3], const double x[3], double y[3]);
779
781
784 static void Multiply3x3(const float A[3][3], const float v[3], float u[3]);
785 static void Multiply3x3(const double A[3][3], const double v[3], double u[3]);
787
789
792 static void Multiply3x3(const float A[3][3], const float B[3][3], float C[3][3]);
793 static void Multiply3x3(const double A[3][3], const double B[3][3], double C[3][3]);
795
819 template <int RowsT, int MidDimT, int ColsT,
820 class LayoutT1 = vtkMatrixUtilities::Layout::Identity,
821 class LayoutT2 = vtkMatrixUtilities::Layout::Identity, class MatrixT1, class MatrixT2,
822 class MatrixT3>
823 static void MultiplyMatrix(const MatrixT1& M1, const MatrixT2& M2, MatrixT3&& M3)
824 {
825 vtkMathPrivate::MultiplyMatrix<RowsT, MidDimT, ColsT, LayoutT1, LayoutT2>::Compute(M1, M2, M3);
826 }
827
848 template <int RowsT, int ColsT, class LayoutT = vtkMatrixUtilities::Layout::Identity,
849 class MatrixT, class VectorT1, class VectorT2>
850 static void MultiplyMatrixWithVector(const MatrixT& M, const VectorT1& X, VectorT2&& Y)
851 {
852 vtkMathPrivate::MultiplyMatrix<RowsT, ColsT, 1, LayoutT>::Compute(M, X, Y);
853 }
854
860 template <class ScalarT, int SizeT, class VectorT1, class VectorT2>
861 static ScalarT Dot(const VectorT1& x, const VectorT2& y)
862 {
863 return vtkMathPrivate::ContractRowWithCol<ScalarT, 1, SizeT, 1, 0, 0,
864 vtkMatrixUtilities::Layout::Identity, vtkMatrixUtilities::Layout::Transpose>::Compute(x, y);
865 }
866
883 template <int SizeT, class LayoutT = vtkMatrixUtilities::Layout::Identity, class MatrixT>
885 const MatrixT& M)
886 {
887 return vtkMathPrivate::Determinant<SizeT, LayoutT>::Compute(M);
888 }
889
905 template <int SizeT, class LayoutT = vtkMatrixUtilities::Layout::Identity, class MatrixT1,
906 class MatrixT2>
907 static void InvertMatrix(const MatrixT1& M1, MatrixT2&& M2)
908 {
909 vtkMathPrivate::InvertMatrix<SizeT, LayoutT>::Compute(M1, M2);
910 }
911
925 template <int RowsT, int ColsT, class LayoutT = vtkMatrixUtilities::Layout::Identity,
926 class MatrixT, class VectorT1, class VectorT2>
927 static void LinearSolve(const MatrixT& M, const VectorT1& x, VectorT2& y)
928 {
929 vtkMathPrivate::LinearSolve<RowsT, ColsT, LayoutT>::Compute(M, x, y);
930 }
931
946 template <class ScalarT, int SizeT, class LayoutT = vtkMatrixUtilities::Layout::Identity,
947 class VectorT1, class MatrixT, class VectorT2>
948 static ScalarT Dot(const VectorT1& x, const MatrixT& M, const VectorT2& y)
949 {
950 ScalarT tmp[SizeT];
951 vtkMathPrivate::MultiplyMatrix<SizeT, SizeT, 1, LayoutT>::Compute(M, y, tmp);
952 return vtkMathPrivate::ContractRowWithCol<ScalarT, 1, SizeT, 1, 0, 0,
953 vtkMatrixUtilities::Layout::Identity, vtkMatrixUtilities::Layout::Transpose>::Compute(x, tmp);
954 }
955
961 static void MultiplyMatrix(const double* const* A, const double* const* B, unsigned int rowA,
962 unsigned int colA, unsigned int rowB, unsigned int colB, double** C);
963
965
969 static void Transpose3x3(const float A[3][3], float AT[3][3]);
970 static void Transpose3x3(const double A[3][3], double AT[3][3]);
972
974
978 static void Invert3x3(const float A[3][3], float AI[3][3]);
979 static void Invert3x3(const double A[3][3], double AI[3][3]);
981
983
986 static void Identity3x3(float A[3][3]);
987 static void Identity3x3(double A[3][3]);
989
991
994 static double Determinant3x3(const float A[3][3]);
995 static double Determinant3x3(const double A[3][3]);
997
1001 static float Determinant3x3(const float c1[3], const float c2[3], const float c3[3]);
1002
1006 static double Determinant3x3(const double c1[3], const double c2[3], const double c3[3]);
1007
1014 static double Determinant3x3(double a1, double a2, double a3, double b1, double b2, double b3,
1015 double c1, double c2, double c3);
1016
1018
1025 static void QuaternionToMatrix3x3(const float quat[4], float A[3][3]);
1026 static void QuaternionToMatrix3x3(const double quat[4], double A[3][3]);
1027 template <class QuaternionT, class MatrixT,
1028 class EnableT = typename std::enable_if<!vtkMatrixUtilities::MatrixIs2DArray<MatrixT>()>::type>
1029 static void QuaternionToMatrix3x3(const QuaternionT& q, MatrixT&& A);
1031
1033
1042 static void Matrix3x3ToQuaternion(const float A[3][3], float quat[4]);
1043 static void Matrix3x3ToQuaternion(const double A[3][3], double quat[4]);
1044 template <class MatrixT, class QuaternionT,
1045 class EnableT = typename std::enable_if<!vtkMatrixUtilities::MatrixIs2DArray<MatrixT>()>::type>
1046 static void Matrix3x3ToQuaternion(const MatrixT& A, QuaternionT&& q);
1048
1050
1056 static void MultiplyQuaternion(const float q1[4], const float q2[4], float q[4]);
1057 static void MultiplyQuaternion(const double q1[4], const double q2[4], double q[4]);
1059
1061
1065 static void RotateVectorByNormalizedQuaternion(const float v[3], const float q[4], float r[3]);
1066 static void RotateVectorByNormalizedQuaternion(const double v[3], const double q[4], double r[3]);
1068
1070
1074 static void RotateVectorByWXYZ(const float v[3], const float q[4], float r[3]);
1075 static void RotateVectorByWXYZ(const double v[3], const double q[4], double r[3]);
1077
1079
1084 static void Orthogonalize3x3(const float A[3][3], float B[3][3]);
1085 static void Orthogonalize3x3(const double A[3][3], double B[3][3]);
1087
1089
1095 static void Diagonalize3x3(const float A[3][3], float w[3], float V[3][3]);
1096 static void Diagonalize3x3(const double A[3][3], double w[3], double V[3][3]);
1098
1100
1110 const float A[3][3], float U[3][3], float w[3], float VT[3][3]);
1112 const double A[3][3], double U[3][3], double w[3], double VT[3][3]);
1114
1123 double a00, double a01, double a10, double a11, double b0, double b1, double& x0, double& x1);
1124
1133 static vtkTypeBool SolveLinearSystem(double** A, double* x, int size);
1134
1141 static vtkTypeBool InvertMatrix(double** A, double** AI, int size);
1142
1149 double** A, double** AI, int size, int* tmp1Size, double* tmp2Size);
1150
1173 static vtkTypeBool LUFactorLinearSystem(double** A, int* index, int size);
1174
1180 static vtkTypeBool LUFactorLinearSystem(double** A, int* index, int size, double* tmpSize);
1181
1190 static void LUSolveLinearSystem(double** A, int* index, double* x, int size);
1191
1200 static double EstimateMatrixCondition(const double* const* A, int size);
1201
1203
1211 static vtkTypeBool Jacobi(float** a, float* w, float** v);
1212 static vtkTypeBool Jacobi(double** a, double* w, double** v);
1214
1216
1225 static vtkTypeBool JacobiN(float** a, int n, float* w, float** v);
1226 static vtkTypeBool JacobiN(double** a, int n, double* w, double** v);
1228
1243 int numberOfSamples, double** xt, int xOrder, double** mt);
1244
1259 static vtkTypeBool SolveLeastSquares(int numberOfSamples, double** xt, int xOrder, double** yt,
1260 int yOrder, double** mt, int checkHomogeneous = 1);
1261
1263
1270 static void RGBToHSV(const float rgb[3], float hsv[3])
1271 {
1272 RGBToHSV(rgb[0], rgb[1], rgb[2], hsv, hsv + 1, hsv + 2);
1273 }
1274 static void RGBToHSV(float r, float g, float b, float* h, float* s, float* v);
1275 static void RGBToHSV(const double rgb[3], double hsv[3])
1276 {
1277 RGBToHSV(rgb[0], rgb[1], rgb[2], hsv, hsv + 1, hsv + 2);
1278 }
1279 static void RGBToHSV(double r, double g, double b, double* h, double* s, double* v);
1281
1283
1290 static void HSVToRGB(const float hsv[3], float rgb[3])
1291 {
1292 HSVToRGB(hsv[0], hsv[1], hsv[2], rgb, rgb + 1, rgb + 2);
1293 }
1294 static void HSVToRGB(float h, float s, float v, float* r, float* g, float* b);
1295 static void HSVToRGB(const double hsv[3], double rgb[3])
1296 {
1297 HSVToRGB(hsv[0], hsv[1], hsv[2], rgb, rgb + 1, rgb + 2);
1298 }
1299 static void HSVToRGB(double h, double s, double v, double* r, double* g, double* b);
1301
1303
1306 static void LabToXYZ(const double lab[3], double xyz[3])
1307 {
1308 LabToXYZ(lab[0], lab[1], lab[2], xyz + 0, xyz + 1, xyz + 2);
1309 }
1310 static void LabToXYZ(double L, double a, double b, double* x, double* y, double* z);
1312
1314
1317 static void XYZToLab(const double xyz[3], double lab[3])
1318 {
1319 XYZToLab(xyz[0], xyz[1], xyz[2], lab + 0, lab + 1, lab + 2);
1320 }
1321 static void XYZToLab(double x, double y, double z, double* L, double* a, double* b);
1323
1325
1328 static void XYZToRGB(const double xyz[3], double rgb[3])
1329 {
1330 XYZToRGB(xyz[0], xyz[1], xyz[2], rgb + 0, rgb + 1, rgb + 2);
1331 }
1332 static void XYZToRGB(double x, double y, double z, double* r, double* g, double* b);
1334
1336
1339 static void RGBToXYZ(const double rgb[3], double xyz[3])
1340 {
1341 RGBToXYZ(rgb[0], rgb[1], rgb[2], xyz + 0, xyz + 1, xyz + 2);
1342 }
1343 static void RGBToXYZ(double r, double g, double b, double* x, double* y, double* z);
1345
1347
1353 static void RGBToLab(const double rgb[3], double lab[3])
1354 {
1355 RGBToLab(rgb[0], rgb[1], rgb[2], lab + 0, lab + 1, lab + 2);
1356 }
1357 static void RGBToLab(double red, double green, double blue, double* L, double* a, double* b);
1359
1361
1364 static void LabToRGB(const double lab[3], double rgb[3])
1365 {
1366 LabToRGB(lab[0], lab[1], lab[2], rgb + 0, rgb + 1, rgb + 2);
1367 }
1368 static void LabToRGB(double L, double a, double b, double* red, double* green, double* blue);
1370
1372
1375 static void UninitializeBounds(double bounds[6])
1376 {
1377 bounds[0] = 1.0;
1378 bounds[1] = -1.0;
1379 bounds[2] = 1.0;
1380 bounds[3] = -1.0;
1381 bounds[4] = 1.0;
1382 bounds[5] = -1.0;
1383 }
1385
1387
1390 static vtkTypeBool AreBoundsInitialized(const double bounds[6])
1391 {
1392 if (bounds[1] - bounds[0] < 0.0)
1393 {
1394 return 0;
1395 }
1396 return 1;
1397 }
1399
1404 template <class T>
1405 static T ClampValue(const T& value, const T& min, const T& max);
1406
1408
1412 static void ClampValue(double* value, const double range[2]);
1413 static void ClampValue(double value, const double range[2], double* clamped_value);
1414 static void ClampValues(double* values, int nb_values, const double range[2]);
1415 static void ClampValues(
1416 const double* values, int nb_values, const double range[2], double* clamped_values);
1418
1425 static double ClampAndNormalizeValue(double value, const double range[2]);
1426
1431 template <class T1, class T2>
1432 static void TensorFromSymmetricTensor(const T1 symmTensor[6], T2 tensor[9]);
1433
1439 template <class T>
1440 static void TensorFromSymmetricTensor(T tensor[9]);
1441
1451 double range_min, double range_max, double scale = 1.0, double shift = 0.0);
1452
1461 static vtkTypeBool GetAdjustedScalarRange(vtkDataArray* array, int comp, double range[2]);
1462
1467 static vtkTypeBool ExtentIsWithinOtherExtent(const int extent1[6], const int extent2[6]);
1468
1475 const double bounds1[6], const double bounds2[6], const double delta[3]);
1476
1483 const double point[3], const double bounds[6], const double delta[3]);
1484
1495 const double bounds[6], const double normal[3], const double point[3]);
1496
1506 static double Solve3PointCircle(
1507 const double p1[3], const double p2[3], const double p3[3], double center[3]);
1508
1512 static double Inf();
1513
1517 static double NegInf();
1518
1522 static double Nan();
1523
1527 static vtkTypeBool IsInf(double x);
1528
1532 static vtkTypeBool IsNan(double x);
1533
1538 static bool IsFinite(double x);
1539
1544 static int QuadraticRoot(double a, double b, double c, double min, double max, double* u);
1545
1546protected:
1547 vtkMath() = default;
1548 ~vtkMath() override = default;
1549
1551
1552private:
1553 vtkMath(const vtkMath&) = delete;
1554 void operator=(const vtkMath&) = delete;
1555};
1556
1557//----------------------------------------------------------------------------
1558inline float vtkMath::RadiansFromDegrees(float x)
1559{
1560 return x * 0.017453292f;
1561}
1562
1563//----------------------------------------------------------------------------
1564inline double vtkMath::RadiansFromDegrees(double x)
1565{
1566 return x * 0.017453292519943295;
1567}
1568
1569//----------------------------------------------------------------------------
1570inline float vtkMath::DegreesFromRadians(float x)
1571{
1572 return x * 57.2957795131f;
1573}
1574
1575//----------------------------------------------------------------------------
1576inline double vtkMath::DegreesFromRadians(double x)
1577{
1578 return x * 57.29577951308232;
1579}
1580
1581//----------------------------------------------------------------------------
1582inline bool vtkMath::IsPowerOfTwo(vtkTypeUInt64 x)
1583{
1584 return ((x != 0) & ((x & (x - 1)) == 0));
1585}
1586
1587//----------------------------------------------------------------------------
1588// Credit goes to Peter Hart and William Lewis on comp.lang.python 1997
1590{
1591 unsigned int z = static_cast<unsigned int>(((x > 0) ? x - 1 : 0));
1592 z |= z >> 1;
1593 z |= z >> 2;
1594 z |= z >> 4;
1595 z |= z >> 8;
1596 z |= z >> 16;
1597 return static_cast<int>(z + 1);
1598}
1599
1600//----------------------------------------------------------------------------
1601// Modify the trunc() operation provided by static_cast<int>() to get floor(),
1602// Note that in C++ conditions evaluate to values of 1 or 0 (true or false).
1603inline int vtkMath::Floor(double x)
1604{
1605 int i = static_cast<int>(x);
1606 return i - (i > x);
1607}
1608
1609//----------------------------------------------------------------------------
1610// Modify the trunc() operation provided by static_cast<int>() to get ceil(),
1611// Note that in C++ conditions evaluate to values of 1 or 0 (true or false).
1612inline int vtkMath::Ceil(double x)
1613{
1614 int i = static_cast<int>(x);
1615 return i + (i < x);
1616}
1617
1618//----------------------------------------------------------------------------
1619template <class T>
1620inline T vtkMath::Min(const T& a, const T& b)
1621{
1622 return (b <= a ? b : a);
1623}
1624
1625//----------------------------------------------------------------------------
1626template <class T>
1627inline T vtkMath::Max(const T& a, const T& b)
1628{
1629 return (b > a ? b : a);
1630}
1631
1632//----------------------------------------------------------------------------
1633inline float vtkMath::Normalize(float v[3])
1634{
1635 float den = vtkMath::Norm(v);
1636 if (den != 0.0)
1637 {
1638 for (int i = 0; i < 3; ++i)
1639 {
1640 v[i] /= den;
1641 }
1642 }
1643 return den;
1644}
1645
1646//----------------------------------------------------------------------------
1647inline double vtkMath::Normalize(double v[3])
1648{
1649 double den = vtkMath::Norm(v);
1650 if (den != 0.0)
1651 {
1652 for (int i = 0; i < 3; ++i)
1653 {
1654 v[i] /= den;
1655 }
1656 }
1657 return den;
1658}
1659
1660//----------------------------------------------------------------------------
1661inline float vtkMath::Normalize2D(float v[2])
1662{
1663 float den = vtkMath::Norm2D(v);
1664 if (den != 0.0)
1665 {
1666 for (int i = 0; i < 2; ++i)
1667 {
1668 v[i] /= den;
1669 }
1670 }
1671 return den;
1672}
1673
1674//----------------------------------------------------------------------------
1675inline double vtkMath::Normalize2D(double v[2])
1676{
1677 double den = vtkMath::Norm2D(v);
1678 if (den != 0.0)
1679 {
1680 for (int i = 0; i < 2; ++i)
1681 {
1682 v[i] /= den;
1683 }
1684 }
1685 return den;
1686}
1687
1688//----------------------------------------------------------------------------
1689inline float vtkMath::Determinant3x3(const float c1[3], const float c2[3], const float c3[3])
1690{
1691 return c1[0] * c2[1] * c3[2] + c2[0] * c3[1] * c1[2] + c3[0] * c1[1] * c2[2] -
1692 c1[0] * c3[1] * c2[2] - c2[0] * c1[1] * c3[2] - c3[0] * c2[1] * c1[2];
1693}
1694
1695//----------------------------------------------------------------------------
1696inline double vtkMath::Determinant3x3(const double c1[3], const double c2[3], const double c3[3])
1697{
1698 return c1[0] * c2[1] * c3[2] + c2[0] * c3[1] * c1[2] + c3[0] * c1[1] * c2[2] -
1699 c1[0] * c3[1] * c2[2] - c2[0] * c1[1] * c3[2] - c3[0] * c2[1] * c1[2];
1700}
1701
1702//----------------------------------------------------------------------------
1704 double a1, double a2, double a3, double b1, double b2, double b3, double c1, double c2, double c3)
1705{
1706 return (a1 * vtkMath::Determinant2x2(b2, b3, c2, c3) -
1707 b1 * vtkMath::Determinant2x2(a2, a3, c2, c3) + c1 * vtkMath::Determinant2x2(a2, a3, b2, b3));
1708}
1709
1710//----------------------------------------------------------------------------
1711inline float vtkMath::Distance2BetweenPoints(const float p1[3], const float p2[3])
1712{
1713 return ((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) +
1714 (p1[2] - p2[2]) * (p1[2] - p2[2]));
1715}
1716
1717//----------------------------------------------------------------------------
1718inline double vtkMath::Distance2BetweenPoints(const double p1[3], const double p2[3])
1719{
1720 return ((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) +
1721 (p1[2] - p2[2]) * (p1[2] - p2[2]));
1722}
1723
1724//----------------------------------------------------------------------------
1725template <typename ReturnTypeT, typename TupleRangeT1, typename TupleRangeT2, typename EnableT>
1726inline ReturnTypeT vtkMath::Distance2BetweenPoints(const TupleRangeT1& p1, const TupleRangeT2& p2)
1727{
1728 return ((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) +
1729 (p1[2] - p2[2]) * (p1[2] - p2[2]));
1730}
1731
1732//----------------------------------------------------------------------------
1733// Cross product of two 3-vectors. Result (a x b) is stored in c[3].
1734inline void vtkMath::Cross(const float a[3], const float b[3], float c[3])
1735{
1736 float Cx = a[1] * b[2] - a[2] * b[1];
1737 float Cy = a[2] * b[0] - a[0] * b[2];
1738 float Cz = a[0] * b[1] - a[1] * b[0];
1739 c[0] = Cx;
1740 c[1] = Cy;
1741 c[2] = Cz;
1742}
1743
1744//----------------------------------------------------------------------------
1745// Cross product of two 3-vectors. Result (a x b) is stored in c[3].
1746inline void vtkMath::Cross(const double a[3], const double b[3], double c[3])
1747{
1748 double Cx = a[1] * b[2] - a[2] * b[1];
1749 double Cy = a[2] * b[0] - a[0] * b[2];
1750 double Cz = a[0] * b[1] - a[1] * b[0];
1751 c[0] = Cx;
1752 c[1] = Cy;
1753 c[2] = Cz;
1754}
1755
1756//----------------------------------------------------------------------------
1757template <class T>
1758inline double vtkDeterminant3x3(const T A[3][3])
1759{
1760 return A[0][0] * A[1][1] * A[2][2] + A[1][0] * A[2][1] * A[0][2] + A[2][0] * A[0][1] * A[1][2] -
1761 A[0][0] * A[2][1] * A[1][2] - A[1][0] * A[0][1] * A[2][2] - A[2][0] * A[1][1] * A[0][2];
1762}
1763
1764//----------------------------------------------------------------------------
1765inline double vtkMath::Determinant3x3(const float A[3][3])
1766{
1767 return vtkDeterminant3x3(A);
1768}
1769
1770//----------------------------------------------------------------------------
1771inline double vtkMath::Determinant3x3(const double A[3][3])
1772{
1773 return vtkDeterminant3x3(A);
1774}
1775
1776//----------------------------------------------------------------------------
1777template <class T>
1778inline T vtkMath::ClampValue(const T& value, const T& min, const T& max)
1779{
1780 assert("pre: valid_range" && min <= max);
1781
1782#if __cplusplus >= 201703L
1783 return std::clamp(value, min, max);
1784#else
1785 // compilers are good at optimizing the ternary operator,
1786 // use '<' since it is preferred by STL for custom types
1787 T v = (min < value ? value : min);
1788 return (v < max ? v : max);
1789#endif
1790}
1791
1792//----------------------------------------------------------------------------
1793inline void vtkMath::ClampValue(double* value, const double range[2])
1794{
1795 if (value && range)
1796 {
1797 assert("pre: valid_range" && range[0] <= range[1]);
1798
1800 }
1801}
1802
1803//----------------------------------------------------------------------------
1804inline void vtkMath::ClampValue(double value, const double range[2], double* clamped_value)
1805{
1806 if (range && clamped_value)
1807 {
1808 assert("pre: valid_range" && range[0] <= range[1]);
1809
1810 *clamped_value = vtkMath::ClampValue(value, range[0], range[1]);
1811 }
1812}
1813
1814// ---------------------------------------------------------------------------
1815inline double vtkMath::ClampAndNormalizeValue(double value, const double range[2])
1816{
1817 assert("pre: valid_range" && range[0] <= range[1]);
1818
1819 double result;
1820 if (range[0] == range[1])
1821 {
1822 result = 0.0;
1823 }
1824 else
1825 {
1826 // clamp
1827 result = vtkMath::ClampValue(value, range[0], range[1]);
1828
1829 // normalize
1830 result = (result - range[0]) / (range[1] - range[0]);
1831 }
1832
1833 assert("post: valid_result" && result >= 0.0 && result <= 1.0);
1834
1835 return result;
1836}
1837
1838//-----------------------------------------------------------------------------
1839template <class T1, class T2>
1840inline void vtkMath::TensorFromSymmetricTensor(const T1 symmTensor[9], T2 tensor[9])
1841{
1842 for (int i = 0; i < 3; ++i)
1843 {
1844 tensor[4 * i] = symmTensor[i];
1845 }
1846 tensor[1] = tensor[3] = symmTensor[3];
1847 tensor[2] = tensor[6] = symmTensor[5];
1848 tensor[5] = tensor[7] = symmTensor[4];
1849}
1850
1851//-----------------------------------------------------------------------------
1852template <class T>
1854{
1855 tensor[6] = tensor[5]; // XZ
1856 tensor[7] = tensor[4]; // YZ
1857 tensor[8] = tensor[2]; // ZZ
1858 tensor[4] = tensor[1]; // YY
1859 tensor[5] = tensor[7]; // YZ
1860 tensor[2] = tensor[6]; // XZ
1861 tensor[1] = tensor[3]; // XY
1862}
1863
1864namespace
1865{
1866template <class QuaternionT, class MatrixT>
1867inline void vtkQuaternionToMatrix3x3(const QuaternionT& quat, MatrixT& A)
1868{
1870
1871 Scalar ww = quat[0] * quat[0];
1872 Scalar wx = quat[0] * quat[1];
1873 Scalar wy = quat[0] * quat[2];
1874 Scalar wz = quat[0] * quat[3];
1875
1876 Scalar xx = quat[1] * quat[1];
1877 Scalar yy = quat[2] * quat[2];
1878 Scalar zz = quat[3] * quat[3];
1879
1880 Scalar xy = quat[1] * quat[2];
1881 Scalar xz = quat[1] * quat[3];
1882 Scalar yz = quat[2] * quat[3];
1883
1884 Scalar rr = xx + yy + zz;
1885 // normalization factor, just in case quaternion was not normalized
1886 Scalar f = 1 / (ww + rr);
1887 Scalar s = (ww - rr) * f;
1888 f *= 2;
1889
1891
1892 Wrapper::template Get<0, 0>(A) = xx * f + s;
1893 Wrapper::template Get<1, 0>(A) = (xy + wz) * f;
1894 Wrapper::template Get<2, 0>(A) = (xz - wy) * f;
1895
1896 Wrapper::template Get<0, 1>(A) = (xy - wz) * f;
1897 Wrapper::template Get<1, 1>(A) = yy * f + s;
1898 Wrapper::template Get<2, 1>(A) = (yz + wx) * f;
1899
1900 Wrapper::template Get<0, 2>(A) = (xz + wy) * f;
1901 Wrapper::template Get<1, 2>(A) = (yz - wx) * f;
1902 Wrapper::template Get<2, 2>(A) = zz * f + s;
1903}
1904} // anonymous namespace
1905
1906//------------------------------------------------------------------------------
1907inline void vtkMath::QuaternionToMatrix3x3(const float quat[4], float A[3][3])
1908{
1909 vtkQuaternionToMatrix3x3(quat, A);
1910}
1911
1912//------------------------------------------------------------------------------
1913inline void vtkMath::QuaternionToMatrix3x3(const double quat[4], double A[3][3])
1914{
1915 vtkQuaternionToMatrix3x3(quat, A);
1916}
1917
1918//-----------------------------------------------------------------------------
1919template <class QuaternionT, class MatrixT, class EnableT>
1920inline void vtkMath::QuaternionToMatrix3x3(const QuaternionT& q, MatrixT&& A)
1921{
1922 vtkQuaternionToMatrix3x3(q, A);
1923}
1924
1925namespace
1926{
1927//------------------------------------------------------------------------------
1928// The solution is based on
1929// Berthold K. P. Horn (1987),
1930// "Closed-form solution of absolute orientation using unit quaternions,"
1931// Journal of the Optical Society of America A, 4:629-642
1932template <class MatrixT, class QuaternionT>
1933inline void vtkMatrix3x3ToQuaternion(const MatrixT& A, QuaternionT& quat)
1934{
1936
1937 Scalar N[4][4];
1938
1940
1941 // on-diagonal elements
1942 N[0][0] = Wrapper::template Get<0, 0>(A) + Wrapper::template Get<1, 1>(A) +
1943 Wrapper::template Get<2, 2>(A);
1944 N[1][1] = Wrapper::template Get<0, 0>(A) - Wrapper::template Get<1, 1>(A) -
1945 Wrapper::template Get<2, 2>(A);
1946 N[2][2] = -Wrapper::template Get<0, 0>(A) + Wrapper::template Get<1, 1>(A) -
1947 Wrapper::template Get<2, 2>(A);
1948 N[3][3] = -Wrapper::template Get<0, 0>(A) - Wrapper::template Get<1, 1>(A) +
1949 Wrapper::template Get<2, 2>(A);
1950
1951 // off-diagonal elements
1952 N[0][1] = N[1][0] = Wrapper::template Get<2, 1>(A) - Wrapper::template Get<1, 2>(A);
1953 N[0][2] = N[2][0] = Wrapper::template Get<0, 2>(A) - Wrapper::template Get<2, 0>(A);
1954 N[0][3] = N[3][0] = Wrapper::template Get<1, 0>(A) - Wrapper::template Get<0, 1>(A);
1955
1956 N[1][2] = N[2][1] = Wrapper::template Get<1, 0>(A) + Wrapper::template Get<0, 1>(A);
1957 N[1][3] = N[3][1] = Wrapper::template Get<0, 2>(A) + Wrapper::template Get<2, 0>(A);
1958 N[2][3] = N[3][2] = Wrapper::template Get<2, 1>(A) + Wrapper::template Get<1, 2>(A);
1959
1960 Scalar eigenvectors[4][4], eigenvalues[4];
1961
1962 // convert into format that JacobiN can use,
1963 // then use Jacobi to find eigenvalues and eigenvectors
1964 Scalar *NTemp[4], *eigenvectorsTemp[4];
1965 for (int i = 0; i < 4; ++i)
1966 {
1967 NTemp[i] = N[i];
1968 eigenvectorsTemp[i] = eigenvectors[i];
1969 }
1970 vtkMath::JacobiN(NTemp, 4, eigenvalues, eigenvectorsTemp);
1971
1972 // the first eigenvector is the one we want
1973 quat[0] = eigenvectors[0][0];
1974 quat[1] = eigenvectors[1][0];
1975 quat[2] = eigenvectors[2][0];
1976 quat[3] = eigenvectors[3][0];
1977}
1978} // anonymous namespace
1979
1980//------------------------------------------------------------------------------
1981inline void vtkMath::Matrix3x3ToQuaternion(const float A[3][3], float quat[4])
1982{
1983 vtkMatrix3x3ToQuaternion(A, quat);
1984}
1985
1986//------------------------------------------------------------------------------
1987inline void vtkMath::Matrix3x3ToQuaternion(const double A[3][3], double quat[4])
1988{
1989 vtkMatrix3x3ToQuaternion(A, quat);
1990}
1991
1992//-----------------------------------------------------------------------------
1993template <class MatrixT, class QuaternionT, class EnableT>
1994inline void vtkMath::Matrix3x3ToQuaternion(const MatrixT& A, QuaternionT&& q)
1995{
1996 vtkMatrix3x3ToQuaternion(A, q);
1997}
1998
1999namespace vtk_detail
2000{
2001// Can't specialize templates inside a template class, so we move the impl here.
2002template <typename OutT>
2003void RoundDoubleToIntegralIfNecessary(double val, OutT* ret)
2004{ // OutT is integral -- clamp and round
2005 if (!vtkMath::IsNan(val))
2006 {
2007 double min = static_cast<double>(vtkTypeTraits<OutT>::Min());
2008 double max = static_cast<double>(vtkTypeTraits<OutT>::Max());
2009 val = vtkMath::ClampValue(val, min, max);
2010 *ret = static_cast<OutT>((val >= 0.0) ? (val + 0.5) : (val - 0.5));
2011 }
2012 else
2013 *ret = 0;
2014}
2015template <>
2016inline void RoundDoubleToIntegralIfNecessary(double val, double* retVal)
2017{ // OutT is double: passthrough
2018 *retVal = val;
2019}
2020template <>
2021inline void RoundDoubleToIntegralIfNecessary(double val, float* retVal)
2022{ // OutT is float -- just clamp (as doubles, then the cast to float is well-defined.)
2023 if (!vtkMath::IsNan(val))
2024 {
2025 double min = static_cast<double>(vtkTypeTraits<float>::Min());
2026 double max = static_cast<double>(vtkTypeTraits<float>::Max());
2027 val = vtkMath::ClampValue(val, min, max);
2028 }
2029
2030 *retVal = static_cast<float>(val);
2031}
2032} // end namespace vtk_detail
2033
2034//-----------------------------------------------------------------------------
2035#if defined(VTK_HAS_ISINF) || defined(VTK_HAS_STD_ISINF)
2036#define VTK_MATH_ISINF_IS_INLINE
2037inline vtkTypeBool vtkMath::IsInf(double x)
2038{
2039#if defined(VTK_HAS_STD_ISINF)
2040 return std::isinf(x);
2041#else
2042 return (isinf(x) != 0); // Force conversion to bool
2043#endif
2044}
2045#endif
2046
2047//-----------------------------------------------------------------------------
2048#if defined(VTK_HAS_ISNAN) || defined(VTK_HAS_STD_ISNAN)
2049#define VTK_MATH_ISNAN_IS_INLINE
2050inline vtkTypeBool vtkMath::IsNan(double x)
2051{
2052#if defined(VTK_HAS_STD_ISNAN)
2053 return std::isnan(x);
2054#else
2055 return (isnan(x) != 0); // Force conversion to bool
2056#endif
2057}
2058#endif
2059
2060//-----------------------------------------------------------------------------
2061#if defined(VTK_HAS_ISFINITE) || defined(VTK_HAS_STD_ISFINITE) || defined(VTK_HAS_FINITE)
2062#define VTK_MATH_ISFINITE_IS_INLINE
2063inline bool vtkMath::IsFinite(double x)
2064{
2065#if defined(VTK_HAS_STD_ISFINITE)
2066 return std::isfinite(x);
2067#elif defined(VTK_HAS_ISFINITE)
2068 return (isfinite(x) != 0); // Force conversion to bool
2069#else
2070 return (finite(x) != 0); // Force conversion to bool
2071#endif
2072}
2073#endif
2074
2075#endif
Gaussian sequence of pseudo random numbers implemented with the Box-Mueller transform.
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:59
vtkFrustumSelector is a vtkSelector that selects elements based on whether they are inside or interse...
a simple class to control print indentation
Definition: vtkIndent.h:43
performs common math operations
Definition: vtkMath.h:97
static ReturnTypeT Distance2BetweenPoints(const TupleRangeT1 &p1, const TupleRangeT2 &p2)
Compute distance squared between two points p1 and p2.
Definition: vtkMath.h:1726
static void Multiply3x3(const float A[3][3], const float B[3][3], float C[3][3])
Multiply one 3x3 matrix by another according to C = AB.
static double Dot(const double a[3], const double b[3])
Dot product of two 3-vectors (double version).
Definition: vtkMath.h:454
static int GetScalarTypeFittingRange(double range_min, double range_max, double scale=1.0, double shift=0.0)
Return the scalar type that is most likely to have enough precision to store a given range of data on...
static void RGBToXYZ(double r, double g, double b, double *x, double *y, double *z)
Convert color from the RGB system to CIE XYZ.
static void Multiply3x3(const double A[3][3], const double B[3][3], double C[3][3])
Multiply one 3x3 matrix by another according to C = AB.
static double Norm(const double *x, int n)
Compute the norm of n-vector.
static int Round(float f)
Rounds a float to the nearest integer.
Definition: vtkMath.h:128
static void MultiplyMatrixWithVector(const MatrixT &M, const VectorT1 &X, VectorT2 &&Y)
Multiply matrix M with vector Y such that Y = M x X.
Definition: vtkMath.h:850
static double Norm2D(const double x[2])
Compute the norm of a 2-vector.
Definition: vtkMath.h:722
static void XYZToRGB(double x, double y, double z, double *r, double *g, double *b)
Convert color from the CIE XYZ system to RGB.
static void Subtract(const float a[3], const float b[3], float c[3])
Subtraction of two 3-vectors (float version).
Definition: vtkMath.h:363
static void LUSolve3x3(const double A[3][3], const int index[3], double x[3])
LU back substitution for a 3x3 matrix.
static vtkTypeBool SolveHomogeneousLeastSquares(int numberOfSamples, double **xt, int xOrder, double **mt)
Solves for the least squares best fit matrix for the homogeneous equation X'M' = 0'.
static void Outer2D(const float x[2], const float y[2], float A[2][2])
Outer product of two 2-vectors (float version).
Definition: vtkMath.h:687
static bool ProjectVector(const double a[3], const double b[3], double projection[3])
Compute the projection of vector a on vector b and return it in projection[3].
static vtkSmartPointer< vtkMathInternal > Internal
Definition: vtkMath.h:1550
static float Norm(const float *x, int n)
Compute the norm of n-vector.
static vtkTypeBool ExtentIsWithinOtherExtent(const int extent1[6], const int extent2[6])
Return true if first 3D extent is within second 3D extent Extent is x-min, x-max, y-min,...
static void Add(const double a[3], const double b[3], double c[3])
Addition of two 3-vectors (double version).
Definition: vtkMath.h:352
static void RGBToHSV(float r, float g, float b, float *h, float *s, float *v)
Convert color in RGB format (Red, Green, Blue) to HSV format (Hue, Saturation, Value).
static float Norm(const float v[3])
Compute the norm of 3-vector (float version).
Definition: vtkMath.h:534
static ReturnTypeT Dot(const TupleRangeT1 &a, const TupleRangeT2 &b)
Compute dot product between two points p1 and p2.
Definition: vtkMath.h:478
static vtkTypeBool Jacobi(double **a, double *w, double **v)
Jacobi iteration for the solution of eigenvectors/eigenvalues of a 3x3 real symmetric matrix.
static void XYZToLab(const double xyz[3], double lab[3])
Convert Color from the CIE XYZ system to CIE-L*ab.
Definition: vtkMath.h:1317
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
static vtkTypeInt64 Factorial(int N)
Compute N factorial, N! = N*(N-1) * (N-2)...*3*2*1.
static vtkTypeInt64 Binomial(int m, int n)
The number of combinations of n objects from a pool of m objects (m>n).
static double Random()
Generate pseudo-random numbers distributed according to the uniform distribution between 0....
static void LinearSolve(const MatrixT &M, const VectorT1 &x, VectorT2 &y)
This method solves linear systems M * x = y.
Definition: vtkMath.h:927
static void Identity3x3(float A[3][3])
Set A to the identity matrix.
static double GaussianAmplitude(const double variance, const double distanceFromMean)
Compute the amplitude of a Gaussian function with mean=0 and specified variance.
static void SingularValueDecomposition3x3(const float A[3][3], float U[3][3], float w[3], float VT[3][3])
Perform singular value decomposition on a 3x3 matrix.
static double Nan()
Special IEEE-754 number used to represent Not-A-Number (Nan).
static void Perpendiculars(const float v1[3], float v2[3], float v3[3], double theta)
Given a unit vector v1, find two unit vectors v2 and v3 such that v1 cross v2 = v3 (i....
static double Gaussian(double mean, double std)
Generate pseudo-random numbers distributed according to the Gaussian distribution with mean mean and ...
static bool IsFinite(double x)
Test if a number has finite value i.e.
static void LUSolveLinearSystem(double **A, int *index, double *x, int size)
Solve linear equations Ax = b using LU decomposition A = LU where L is lower triangular matrix and U ...
static double EstimateMatrixCondition(const double *const *A, int size)
Estimate the condition number of a LU factored matrix.
static void LUFactor3x3(float A[3][3], int index[3])
LU Factorization of a 3x3 matrix.
static void FreeCombination(int *combination)
Free the "iterator" array created by vtkMath::BeginCombination.
static double Random(double min, double max)
Generate pseudo-random numbers distributed according to the uniform distribution between min and max.
static void TensorFromSymmetricTensor(const T1 symmTensor[6], T2 tensor[9])
Convert a 6-Component symmetric tensor into a 9-Component tensor, no allocation performed.
static void LabToXYZ(const double lab[3], double xyz[3])
Convert color from the CIE-L*ab system to CIE XYZ.
Definition: vtkMath.h:1306
static double Solve3PointCircle(const double p1[3], const double p2[3], const double p3[3], double center[3])
In Euclidean space, there is a unique circle passing through any given three non-collinear points P1,...
static vtkTypeBool PointIsWithinBounds(const double point[3], const double bounds[6], const double delta[3])
Return true if point is within the given 3D bounds Bounds is x-min, x-max, y-min, y-max,...
static float Dot(const float a[3], const float b[3])
Dot product of two 3-vectors (float version).
Definition: vtkMath.h:446
static void Diagonalize3x3(const float A[3][3], float w[3], float V[3][3])
Diagonalize a symmetric 3x3 matrix and return the eigenvalues in w and the eigenvectors in the column...
static void LabToXYZ(double L, double a, double b, double *x, double *y, double *z)
Convert color from the CIE-L*ab system to CIE XYZ.
static vtkTypeBool GetAdjustedScalarRange(vtkDataArray *array, int comp, double range[2])
Get a vtkDataArray's scalar range for a given component.
static bool ProjectVector(const float a[3], const float b[3], float projection[3])
Compute the projection of vector a on vector b and return it in projection[3].
static void Cross(const float a[3], const float b[3], float c[3])
Cross product of two 3-vectors.
Definition: vtkMath.h:1734
static void MultiplyScalar2D(float a[2], float s)
Multiplies a 2-vector by a scalar (float version).
Definition: vtkMath.h:411
static void HSVToRGB(const float hsv[3], float rgb[3])
Convert color in HSV format (Hue, Saturation, Value) to RGB format (Red, Green, Blue).
Definition: vtkMath.h:1290
static void Assign(const double a[3], double b[3])
Assign values to a 3-vector (double version).
Definition: vtkMath.h:336
static double Determinant2x2(const double c1[2], const double c2[2])
Calculate the determinant of a 2x2 matrix: | a b | | c d |.
Definition: vtkMath.h:749
static T Max(const T &a, const T &b)
Returns the maximum of the two arguments provided.
Definition: vtkMath.h:1627
static void Outer2D(const double x[2], const double y[2], double A[2][2])
Outer product of two 2-vectors (double version).
Definition: vtkMath.h:701
static void RandomSeed(int s)
Initialize seed value.
static double NegInf()
Special IEEE-754 number used to represent negative infinity.
static void MultiplyScalar2D(double a[2], double s)
Multiplies a 2-vector by a scalar (double version).
Definition: vtkMath.h:435
static void LabToRGB(double L, double a, double b, double *red, double *green, double *blue)
Convert color from the CIE-L*ab system to RGB.
static double Gaussian()
Generate pseudo-random numbers distributed according to the standard normal distribution.
static int Ceil(double x)
Rounds a double to the nearest integer not less than itself.
Definition: vtkMath.h:1612
static void HSVToRGB(const double hsv[3], double rgb[3])
Convert color in HSV format (Hue, Saturation, Value) to RGB format (Red, Green, Blue).
Definition: vtkMath.h:1295
~vtkMath() override=default
static ScalarT Dot(const VectorT1 &x, const VectorT2 &y)
Computes the dot product between 2 vectors x and y.
Definition: vtkMath.h:861
static double Inf()
Special IEEE-754 number used to represent positive infinity.
static double GaussianAmplitude(const double mean, const double variance, const double position)
Compute the amplitude of a Gaussian function with specified mean and variance.
static vtkTypeBool Jacobi(float **a, float *w, float **v)
Jacobi iteration for the solution of eigenvectors/eigenvalues of a 3x3 real symmetric matrix.
static int PlaneIntersectsAABB(const double bounds[6], const double normal[3], const double point[3])
Implements Plane / Axis-Aligned Bounding-Box intersection as described in Graphics Gems IV,...
static void RGBToXYZ(const double rgb[3], double xyz[3])
Convert color from the RGB system to CIE XYZ.
Definition: vtkMath.h:1339
static void QuaternionToMatrix3x3(const float quat[4], float A[3][3])
Convert a quaternion to a 3x3 rotation matrix.
Definition: vtkMath.h:1907
static int NearestPowerOfTwo(int x)
Compute the nearest power of two that is not less than x.
Definition: vtkMath.h:1589
static void HSVToRGB(double h, double s, double v, double *r, double *g, double *b)
Convert color in HSV format (Hue, Saturation, Value) to RGB format (Red, Green, Blue).
static void SingularValueDecomposition3x3(const double A[3][3], double U[3][3], double w[3], double VT[3][3])
Perform singular value decomposition on a 3x3 matrix.
static double SignedAngleBetweenVectors(const double v1[3], const double v2[3], const double vn[3])
Compute signed angle in radians between two vectors with regard to a third orthogonal vector.
static float Normalize2D(float v[2])
Normalize (in place) a 2-vector.
Definition: vtkMath.h:1661
static void Invert3x3(const double A[3][3], double AI[3][3])
Invert a 3x3 matrix.
static void HSVToRGB(float h, float s, float v, float *r, float *g, float *b)
Convert color in HSV format (Hue, Saturation, Value) to RGB format (Red, Green, Blue).
static void MultiplyQuaternion(const double q1[4], const double q2[4], double q[4])
Multiply two quaternions.
static void Multiply3x3(const double A[3][3], const double v[3], double u[3])
Multiply a vector by a 3x3 matrix.
static void Outer(const double a[3], const double b[3], double c[3][3])
Outer product of two 3-vectors (double version).
Definition: vtkMath.h:500
static vtkTypeBool InvertMatrix(double **A, double **AI, int size, int *tmp1Size, double *tmp2Size)
Thread safe version of InvertMatrix method.
static vtkTypeBool InvertMatrix(double **A, double **AI, int size)
Invert input square matrix A into matrix AI.
static void LUSolve3x3(const float A[3][3], const int index[3], float x[3])
LU back substitution for a 3x3 matrix.
static int GetSeed()
Return the current seed used by the random number generator.
static void Assign(const VectorT1 &a, VectorT2 &&b)
Assign values to a 3-vector (templated version).
Definition: vtkMath.h:326
static float RadiansFromDegrees(float degrees)
Convert degrees into radians.
Definition: vtkMath.h:1558
static void RotateVectorByWXYZ(const double v[3], const double q[4], double r[3])
rotate a vector by WXYZ using // https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
static void Add(const float a[3], const float b[3], float c[3])
Addition of two 3-vectors (float version).
Definition: vtkMath.h:341
static int CeilLog2(vtkTypeUInt64 x)
Gives the exponent of the lowest power of two not less than x.
static vtkTypeBool AreBoundsInitialized(const double bounds[6])
Are the bounds initialized?
Definition: vtkMath.h:1390
static bool ProjectVector2D(const double a[2], const double b[2], double projection[2])
Compute the projection of 2D vector a on 2D vector b and returns the result in projection[2].
static vtkTypeBool JacobiN(float **a, int n, float *w, float **v)
JacobiN iteration for the solution of eigenvectors/eigenvalues of a nxn real symmetric matrix.
static vtkMatrixUtilities::ScalarTypeExtractor< MatrixT >::value_type Determinant(const MatrixT &M)
Computes the determinant of input square SizeT x SizeT matrix M.
Definition: vtkMath.h:884
static int NextCombination(int m, int n, int *combination)
Given m, n, and a valid combination of n integers in the range [0,m[, this function alters the intege...
static constexpr double Pi()
A mathematical constant.
Definition: vtkMath.h:106
static double GaussianWeight(const double variance, const double distanceFromMean)
Compute the amplitude of an unnormalized Gaussian function with mean=0 and specified variance.
static void Multiply3x3(const float A[3][3], const float v[3], float u[3])
Multiply a vector by a 3x3 matrix.
static void Subtract(const double a[3], const double b[3], double c[3])
Subtraction of two 3-vectors (double version).
Definition: vtkMath.h:374
static void Matrix3x3ToQuaternion(const float A[3][3], float quat[4])
Convert a 3x3 matrix into a quaternion.
Definition: vtkMath.h:1981
static vtkMath * New()
static void Orthogonalize3x3(const double A[3][3], double B[3][3])
Orthogonalize a 3x3 matrix and put the result in B.
static void XYZToRGB(const double xyz[3], double rgb[3])
Convert color from the CIE XYZ system to RGB.
Definition: vtkMath.h:1328
static double ClampAndNormalizeValue(double value, const double range[2])
Clamp a value against a range and then normalize it between 0 and 1.
Definition: vtkMath.h:1815
static void MultiplyScalar(double a[3], double s)
Multiplies a 3-vector by a scalar (double version).
Definition: vtkMath.h:423
static double Dot2D(const double x[2], const double y[2])
Dot product of two 2-vectors.
Definition: vtkMath.h:682
static void LinearSolve3x3(const float A[3][3], const float x[3], float y[3])
Solve Ay = x for y and place the result in y.
static void MultiplyMatrix(const MatrixT1 &M1, const MatrixT2 &M2, MatrixT3 &&M3)
Multiply matrices such that M3 = M1 x M2.
Definition: vtkMath.h:823
static vtkTypeBool IsNan(double x)
Test if a number is equal to the special floating point value Not-A-Number (Nan).
static void Diagonalize3x3(const double A[3][3], double w[3], double V[3][3])
Diagonalize a symmetric 3x3 matrix and return the eigenvalues in w and the eigenvectors in the column...
static void RGBToLab(const double rgb[3], double lab[3])
Convert color from the RGB system to CIE-L*ab.
Definition: vtkMath.h:1353
static int Floor(double x)
Rounds a double to the nearest integer not greater than itself.
Definition: vtkMath.h:1603
static void RotateVectorByNormalizedQuaternion(const double v[3], const double q[4], double r[3])
rotate a vector by a normalized quaternion using // https://en.wikipedia.org/wiki/Rodrigues%27_rotati...
static void Subtract(const VectorT1 &a, const VectorT2 &b, VectorT3 &&c)
Subtraction of two 3-vectors (templated version).
Definition: vtkMath.h:388
static vtkTypeBool BoundsIsWithinOtherBounds(const double bounds1[6], const double bounds2[6], const double delta[3])
Return true if first 3D bounds is within the second 3D bounds Bounds is x-min, x-max,...
static double Determinant2x2(double a, double b, double c, double d)
Calculate the determinant of a 2x2 matrix: | a b | | c d |.
Definition: vtkMath.h:748
static void RGBToHSV(const double rgb[3], double hsv[3])
Convert color in RGB format (Red, Green, Blue) to HSV format (Hue, Saturation, Value).
Definition: vtkMath.h:1275
static vtkTypeBool JacobiN(double **a, int n, double *w, double **v)
JacobiN iteration for the solution of eigenvectors/eigenvalues of a nxn real symmetric matrix.
static double AngleBetweenVectors(const double v1[3], const double v2[3])
Compute angle in radians between two vectors.
static void MultiplyMatrix(const double *const *A, const double *const *B, unsigned int rowA, unsigned int colA, unsigned int rowB, unsigned int colB, double **C)
General matrix multiplication.
static float DegreesFromRadians(float radians)
Convert radians into degrees.
Definition: vtkMath.h:1570
static float Determinant2x2(const float c1[2], const float c2[2])
Compute determinant of 2x2 matrix.
Definition: vtkMath.h:739
static int Round(double f)
Definition: vtkMath.h:129
static vtkTypeBool IsInf(double x)
Test if a number is equal to the special floating point value infinity.
static void UninitializeBounds(double bounds[6])
Set the bounds to an uninitialized state.
Definition: vtkMath.h:1375
vtkMath()=default
static void RGBToHSV(double r, double g, double b, double *h, double *s, double *v)
Convert color in RGB format (Red, Green, Blue) to HSV format (Hue, Saturation, Value).
static void Outer(const float a[3], const float b[3], float c[3][3])
Outer product of two 3-vectors (float version).
Definition: vtkMath.h:486
static int * BeginCombination(int m, int n)
Start iterating over "m choose n" objects.
static double Norm(const double v[3])
Compute the norm of 3-vector (double version).
Definition: vtkMath.h:539
static void RoundDoubleToIntegralIfNecessary(double val, OutT *ret)
Round a double to type OutT if OutT is integral, otherwise simply clamp the value to the output range...
Definition: vtkMath.h:137
static void RotateVectorByWXYZ(const float v[3], const float q[4], float r[3])
rotate a vector by WXYZ using // https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula
static bool IsPowerOfTwo(vtkTypeUInt64 x)
Returns true if integer is a power of two.
Definition: vtkMath.h:1582
static void Invert3x3(const float A[3][3], float AI[3][3])
Invert a 3x3 matrix.
static float Normalize(float v[3])
Normalize (in place) a 3-vector.
Definition: vtkMath.h:1633
static void Transpose3x3(const double A[3][3], double AT[3][3])
Transpose a 3x3 matrix.
static ReturnTypeT SquaredNorm(const TupleRangeT &v)
Compute the squared norm of a 3-vector.
Definition: vtkMath.h:554
static double Determinant3x3(const float A[3][3])
Return the determinant of a 3x3 matrix.
Definition: vtkMath.h:1765
static float Dot2D(const float x[2], const float y[2])
Dot product of two 2-vectors.
Definition: vtkMath.h:677
static void RotateVectorByNormalizedQuaternion(const float v[3], const float q[4], float r[3])
rotate a vector by a normalized quaternion using // https://en.wikipedia.org/wiki/Rodrigues%27_rotati...
static ScalarT Dot(const VectorT1 &x, const MatrixT &M, const VectorT2 &y)
Computes the dot product x^T M y, where x and y are vectors and M is a metric matrix.
Definition: vtkMath.h:948
static void RGBToHSV(const float rgb[3], float hsv[3])
Convert color in RGB format (Red, Green, Blue) to HSV format (Hue, Saturation, Value).
Definition: vtkMath.h:1270
static void Orthogonalize3x3(const float A[3][3], float B[3][3])
Orthogonalize a 3x3 matrix and put the result in B.
static bool ProjectVector2D(const float a[2], const float b[2], float projection[2])
Compute the projection of 2D vector a on 2D vector b and returns the result in projection[2].
static vtkTypeBool SolveLinearSystemGEPP2x2(double a00, double a01, double a10, double a11, double b0, double b1, double &x0, double &x1)
Solve linear equation Ax = b using Gaussian Elimination with Partial Pivoting for a 2x2 system.
static vtkTypeBool SolveLinearSystem(double **A, double *x, int size)
Solve linear equations Ax = b using Crout's method.
static void LabToRGB(const double lab[3], double rgb[3])
Convert color from the CIE-L*ab system to RGB.
Definition: vtkMath.h:1364
static float Norm2D(const float x[2])
Compute the norm of a 2-vector.
Definition: vtkMath.h:716
static double GaussianWeight(const double mean, const double variance, const double position)
Compute the amplitude of an unnormalized Gaussian function with specified mean and variance.
static vtkTypeBool LUFactorLinearSystem(double **A, int *index, int size, double *tmpSize)
Thread safe version of LUFactorLinearSystem method.
static void LinearSolve3x3(const double A[3][3], const double x[3], double y[3])
Solve Ay = x for y and place the result in y.
static void XYZToLab(double x, double y, double z, double *L, double *a, double *b)
Convert Color from the CIE XYZ system to CIE-L*ab.
static void InvertMatrix(const MatrixT1 &M1, MatrixT2 &&M2)
Computes the inverse of input matrix M1 into M2.
Definition: vtkMath.h:907
static void MultiplyScalar(float a[3], float s)
Multiplies a 3-vector by a scalar (float version).
Definition: vtkMath.h:399
static T Min(const T &a, const T &b)
Returns the minimum of the two arguments provided.
Definition: vtkMath.h:1620
static void Perpendiculars(const double v1[3], double v2[3], double v3[3], double theta)
Given a unit vector v1, find two unit vectors v2 and v3 such that v1 cross v2 = v3 (i....
static T ClampValue(const T &value, const T &min, const T &max)
Clamp some value against a range, return the result.
Definition: vtkMath.h:1778
static vtkTypeBool SolveLeastSquares(int numberOfSamples, double **xt, int xOrder, double **yt, int yOrder, double **mt, int checkHomogeneous=1)
Solves for the least squares best fit matrix for the equation X'M' = Y'.
static void Identity3x3(double A[3][3])
Set A to the identity matrix.
static void LUFactor3x3(double A[3][3], int index[3])
LU Factorization of a 3x3 matrix.
static vtkTypeBool LUFactorLinearSystem(double **A, int *index, int size)
Factor linear equations Ax = b using LU decomposition into the form A = LU where L is a unit lower tr...
static void RGBToLab(double red, double green, double blue, double *L, double *a, double *b)
Convert color from the RGB system to CIE-L*ab.
static void MultiplyQuaternion(const float q1[4], const float q2[4], float q[4])
Multiply two quaternions.
static void ClampValues(const double *values, int nb_values, const double range[2], double *clamped_values)
Clamp some values against a range The method without 'clamped_values' will perform in-place clamping.
static void Transpose3x3(const float A[3][3], float AT[3][3])
Transpose a 3x3 matrix.
static void ClampValues(double *values, int nb_values, const double range[2])
Clamp some values against a range The method without 'clamped_values' will perform in-place clamping.
static int QuadraticRoot(double a, double b, double c, double min, double max, double *u)
find roots of ax^2+bx+c=0 in the interval min,max.
Matrix wrapping class.
Park and Miller Sequence of pseudo random numbers.
abstract base class for most VTK objects
Definition: vtkObject.h:63
represent and manipulate 3D points
Definition: vtkPoints.h:43
@ point
Definition: vtkX3D.h:242
@ value
Definition: vtkX3D.h:226
@ scale
Definition: vtkX3D.h:235
@ range
Definition: vtkX3D.h:244
@ center
Definition: vtkX3D.h:236
@ type
Definition: vtkX3D.h:522
@ position
Definition: vtkX3D.h:267
@ size
Definition: vtkX3D.h:259
@ index
Definition: vtkX3D.h:252
void RoundDoubleToIntegralIfNecessary(double val, OutT *ret)
Definition: vtkMath.h:2003
detail::ScalarTypeExtractor< std::is_array< DerefContainer >::value||std::is_pointer< DerefContainer >::value, ContainerT >::value_type value_type
Template defining traits of native types used by VTK.
Definition: vtkTypeTraits.h:30
int vtkTypeBool
Definition: vtkABI.h:69
double vtkDeterminant3x3(const T A[3][3])
Definition: vtkMath.h:1758
#define max(a, b)