42 #include "vtkCommonCoreModule.h"
47 #include "vtkMathConfigure.h"
53 #define VTK_DBL_MIN 2.2250738585072014e-308
55 #define VTK_DBL_MIN DBL_MIN
59 #define VTK_DBL_EPSILON 2.2204460492503131e-16
61 #define VTK_DBL_EPSILON DBL_EPSILON
64 #ifndef VTK_DBL_EPSILON
66 #define VTK_DBL_EPSILON 2.2204460492503131e-16
68 #define VTK_DBL_EPSILON DBL_EPSILON
74 class vtkMathInternal;
81 template <
typename OutT>
95 static double Pi() {
return 3.141592653589793; }
101 static float RadiansFromDegrees(
float degrees);
102 static double RadiansFromDegrees(
double degrees);
109 static float DegreesFromRadians(
float radians);
110 static double DegreesFromRadians(
double radians);
117 static int Round(
float f) {
return static_cast<int>(f + (f >= 0.0 ? 0.5 : -0.5)); }
118 static int Round(
double f) {
return static_cast<int>(f + (f >= 0.0 ? 0.5 : -0.5)); }
125 template <
typename OutT>
138 static int Floor(
double x);
145 static int Ceil(
double x);
159 static T Min(
const T& a,
const T& b);
166 static T Max(
const T& a,
const T& b);
171 static bool IsPowerOfTwo(vtkTypeUInt64 x);
178 static int NearestPowerOfTwo(
int x);
313 static void Add(
const float a[3],
const float b[3],
float c[3])
315 for (
int i = 0; i < 3; ++i)
324 static void Add(
const double a[3],
const double b[3],
double c[3])
326 for (
int i = 0; i < 3; ++i)
335 static void Subtract(
const float a[3],
const float b[3],
float c[3])
337 for (
int i = 0; i < 3; ++i)
346 static void Subtract(
const double a[3],
const double b[3],
double c[3])
348 for (
int i = 0; i < 3; ++i)
360 for (
int i = 0; i < 3; ++i)
372 for (
int i = 0; i < 2; ++i)
384 for (
int i = 0; i < 3; ++i)
396 for (
int i = 0; i < 2; ++i)
405 static float Dot(
const float a[3],
const float b[3])
407 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
413 static double Dot(
const double a[3],
const double b[3])
415 return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
421 static void Outer(
const float a[3],
const float b[3],
float c[3][3])
423 for (
int i = 0; i < 3; ++i)
425 for (
int j = 0; j < 3; ++j)
427 c[i][j] = a[i] * b[j];
435 static void Outer(
const double a[3],
const double b[3],
double c[3][3])
437 for (
int i = 0; i < 3; ++i)
439 for (
int j = 0; j < 3; ++j)
441 c[i][j] = a[i] * b[j];
450 static void Cross(
const float a[3],
const float b[3],
float c[3]);
456 static void Cross(
const double a[3],
const double b[3],
double c[3]);
462 static float Norm(
const float* x,
int n);
463 static double Norm(
const double* x,
int n);
469 static float Norm(
const float v[3]) {
return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]); }
474 static double Norm(
const double v[3])
476 return std::sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
483 static float Normalize(
float v[3]);
489 static double Normalize(
double v[3]);
499 static void Perpendiculars(
const double v1[3],
double v2[3],
double v3[3],
double theta);
500 static void Perpendiculars(
const float v1[3],
float v2[3],
float v3[3],
double theta);
509 static bool ProjectVector(
const float a[3],
const float b[3],
float projection[3]);
510 static bool ProjectVector(
const double a[3],
const double b[3],
double projection[3]);
521 static bool ProjectVector2D(
const double a[2],
const double b[2],
double projection[2]);
528 static float Distance2BetweenPoints(
const float p1[3],
const float p2[3]);
534 static double Distance2BetweenPoints(
const double p1[3],
const double p2[3]);
558 static double GaussianWeight(
const double variance,
const double distanceFromMean);
570 static float Dot2D(
const float x[2],
const float y[2]) {
return x[0] * y[0] + x[1] * y[1]; }
575 static double Dot2D(
const double x[2],
const double y[2]) {
return x[0] * y[0] + x[1] * y[1]; }
580 static void Outer2D(
const float x[2],
const float y[2],
float A[2][2])
582 for (
int i = 0; i < 2; ++i)
584 for (
int j = 0; j < 2; ++j)
586 A[i][j] = x[i] * y[j];
594 static void Outer2D(
const double x[2],
const double y[2],
double A[2][2])
596 for (
int i = 0; i < 2; ++i)
598 for (
int j = 0; j < 2; ++j)
600 A[i][j] = x[i] * y[j];
609 static float Norm2D(
const float x[2]) {
return std::sqrt(x[0] * x[0] + x[1] * x[1]); }
615 static double Norm2D(
const double x[2]) {
return std::sqrt(x[0] * x[0] + x[1] * x[1]); }
634 return c1[0] * c2[1] - c2[0] * c1[1];
641 static double Determinant2x2(
double a,
double b,
double c,
double d) {
return a * d - b * c; }
644 return c1[0] * c2[1] - c2[0] * c1[1];
670 static void LinearSolve3x3(
const double A[3][3],
const double x[3],
double y[3]);
677 static void Multiply3x3(
const float A[3][3],
const float in[3],
float out[3]);
678 static void Multiply3x3(
const double A[3][3],
const double in[3],
double out[3]);
685 static void Multiply3x3(
const float A[3][3],
const float B[3][3],
float C[3][3]);
686 static void Multiply3x3(
const double A[3][3],
const double B[3][3],
double C[3][3]);
694 static void MultiplyMatrix(
const double*
const* A,
const double*
const* B,
unsigned int rowA,
695 unsigned int colA,
unsigned int rowB,
unsigned int colB,
double** C);
711 static void Invert3x3(
const float A[3][3],
float AI[3][3]);
712 static void Invert3x3(
const double A[3][3],
double AI[3][3]);
727 static double Determinant3x3(
const float A[3][3]);
728 static double Determinant3x3(
const double A[3][3]);
734 static float Determinant3x3(
const float c1[3],
const float c2[3],
const float c3[3]);
739 static double Determinant3x3(
const double c1[3],
const double c2[3],
const double c3[3]);
747 static double Determinant3x3(
double a1,
double a2,
double a3,
double b1,
double b2,
double b3,
748 double c1,
double c2,
double c3);
837 const float A[3][3],
float U[3][3],
float w[3],
float VT[3][3]);
839 const double A[3][3],
double U[3][3],
double w[3],
double VT[3][3]);
864 double** A,
double** AI,
int size,
int* tmp1Size,
double* tmp2Size);
958 int numberOfSamples,
double** xt,
int xOrder,
double** mt);
975 int yOrder,
double** mt,
int checkHomogeneous = 1);
985 static void RGBToHSV(
const float rgb[3],
float hsv[3])
987 RGBToHSV(rgb[0], rgb[1], rgb[2], hsv, hsv + 1, hsv + 2);
989 static void RGBToHSV(
float r,
float g,
float b,
float*
h,
float* s,
float* v);
990 static void RGBToHSV(
const double rgb[3],
double hsv[3])
992 RGBToHSV(rgb[0], rgb[1], rgb[2], hsv, hsv + 1, hsv + 2);
994 static void RGBToHSV(
double r,
double g,
double b,
double*
h,
double* s,
double* v);
1007 HSVToRGB(hsv[0], hsv[1], hsv[2], rgb, rgb + 1, rgb + 2);
1009 static void HSVToRGB(
float h,
float s,
float v,
float* r,
float* g,
float* b);
1010 static void HSVToRGB(
const double hsv[3],
double rgb[3])
1012 HSVToRGB(hsv[0], hsv[1], hsv[2], rgb, rgb + 1, rgb + 2);
1014 static void HSVToRGB(
double h,
double s,
double v,
double* r,
double* g,
double* b);
1021 static void LabToXYZ(
const double lab[3],
double xyz[3])
1023 LabToXYZ(lab[0], lab[1], lab[2], xyz + 0, xyz + 1, xyz + 2);
1025 static void LabToXYZ(
double L,
double a,
double b,
double* x,
double* y,
double* z);
1032 static void XYZToLab(
const double xyz[3],
double lab[3])
1034 XYZToLab(xyz[0], xyz[1], xyz[2], lab + 0, lab + 1, lab + 2);
1036 static void XYZToLab(
double x,
double y,
double z,
double* L,
double* a,
double* b);
1043 static void XYZToRGB(
const double xyz[3],
double rgb[3])
1045 XYZToRGB(xyz[0], xyz[1], xyz[2], rgb + 0, rgb + 1, rgb + 2);
1047 static void XYZToRGB(
double x,
double y,
double z,
double* r,
double* g,
double* b);
1054 static void RGBToXYZ(
const double rgb[3],
double xyz[3])
1056 RGBToXYZ(rgb[0], rgb[1], rgb[2], xyz + 0, xyz + 1, xyz + 2);
1058 static void RGBToXYZ(
double r,
double g,
double b,
double* x,
double* y,
double* z);
1068 static void RGBToLab(
const double rgb[3],
double lab[3])
1070 RGBToLab(rgb[0], rgb[1], rgb[2], lab + 0, lab + 1, lab + 2);
1072 static void RGBToLab(
double red,
double green,
double blue,
double* L,
double* a,
double* b);
1079 static void LabToRGB(
const double lab[3],
double rgb[3])
1081 LabToRGB(lab[0], lab[1], lab[2], rgb + 0, rgb + 1, rgb + 2);
1083 static void LabToRGB(
double L,
double a,
double b,
double* red,
double* green,
double* blue);
1107 if (bounds[1] - bounds[0] < 0.0)
1120 static T ClampValue(
const T&
value,
const T& min,
const T&
max);
1127 static void ClampValue(
double*
value,
const double range[2]);
1128 static void ClampValue(
double value,
const double range[2],
double* clamped_value);
1131 const double* values,
int nb_values,
const double range[2],
double* clamped_values);
1140 static double ClampAndNormalizeValue(
double value,
const double range[2]);
1146 template <
class T1,
class T2>
1155 static void TensorFromSymmetricTensor(T tensor[9]);
1166 double range_min,
double range_max,
double scale = 1.0,
double shift = 0.0);
1190 const double bounds1[6],
const double bounds2[6],
const double delta[3]);
1198 const double point[3],
const double bounds[6],
const double delta[3]);
1210 const double bounds[6],
const double normal[3],
const double point[3]);
1222 const double p1[3],
const double p2[3],
const double p3[3],
double center[3]);
1269 void operator=(
const vtkMath&) =
delete;
1275 return x * 0.017453292f;
1281 return x * 0.017453292519943295;
1287 return x * 57.2957795131f;
1293 return x * 57.29577951308232;
1299 return ((x != 0) & ((x & (x - 1)) == 0));
1306 unsigned int z =
static_cast<unsigned int>(((x > 0) ? x - 1 : 0));
1312 return static_cast<int>(z + 1);
1320 int i =
static_cast<int>(x);
1329 int i =
static_cast<int>(x);
1337 return (b <= a ? b : a);
1344 return (b > a ? b : a);
1353 for (
int i = 0; i < 3; ++i)
1367 for (
int i = 0; i < 3; ++i)
1381 for (
int i = 0; i < 2; ++i)
1395 for (
int i = 0; i < 2; ++i)
1406 return c1[0] * c2[1] * c3[2] + c2[0] * c3[1] * c1[2] + c3[0] * c1[1] * c2[2] -
1407 c1[0] * c3[1] * c2[2] - c2[0] * c1[1] * c3[2] - c3[0] * c2[1] * c1[2];
1413 return c1[0] * c2[1] * c3[2] + c2[0] * c3[1] * c1[2] + c3[0] * c1[1] * c2[2] -
1414 c1[0] * c3[1] * c2[2] - c2[0] * c1[1] * c3[2] - c3[0] * c2[1] * c1[2];
1419 double a1,
double a2,
double a3,
double b1,
double b2,
double b3,
double c1,
double c2,
double c3)
1428 return ((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) +
1429 (p1[2] - p2[2]) * (p1[2] - p2[2]));
1435 return ((p1[0] - p2[0]) * (p1[0] - p2[0]) + (p1[1] - p2[1]) * (p1[1] - p2[1]) +
1436 (p1[2] - p2[2]) * (p1[2] - p2[2]));
1443 float Cx = a[1] * b[2] - a[2] * b[1];
1444 float Cy = a[2] * b[0] - a[0] * b[2];
1445 float Cz = a[0] * b[1] - a[1] * b[0];
1455 double Cx = a[1] * b[2] - a[2] * b[1];
1456 double Cy = a[2] * b[0] - a[0] * b[2];
1457 double Cz = a[0] * b[1] - a[1] * b[0];
1467 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] -
1468 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];
1487 assert(
"pre: valid_range" && min <=
max);
1489 #if __cplusplus >= 201703L
1490 return std::clamp(
value, min,
max);
1495 return (v <
max ? v :
max);
1504 assert(
"pre: valid_range" &&
range[0] <=
range[1]);
1513 if (
range && clamped_value)
1515 assert(
"pre: valid_range" &&
range[0] <=
range[1]);
1524 assert(
"pre: valid_range" &&
range[0] <=
range[1]);
1540 assert(
"post: valid_result" && result >= 0.0 && result <= 1.0);
1546 template <
class T1,
class T2>
1549 for (
int i = 0; i < 3; ++i)
1551 tensor[4 * i] = symmTensor[i];
1553 tensor[1] = tensor[3] = symmTensor[3];
1554 tensor[2] = tensor[6] = symmTensor[5];
1555 tensor[5] = tensor[7] = symmTensor[4];
1562 tensor[6] = tensor[5];
1563 tensor[7] = tensor[4];
1564 tensor[8] = tensor[2];
1565 tensor[4] = tensor[1];
1566 tensor[5] = tensor[7];
1567 tensor[2] = tensor[6];
1568 tensor[1] = tensor[3];
1574 template <
typename OutT>
1582 *ret =
static_cast<OutT
>((val >= 0.0) ? (val + 0.5) : (val - 0.5));
1600 *retVal =
static_cast<float>(val);
1608 #if defined(VTK_HAS_ISINF) || defined(VTK_HAS_STD_ISINF)
1609 #define VTK_MATH_ISINF_IS_INLINE
1612 #if defined(VTK_HAS_STD_ISINF)
1613 return std::isinf(x);
1615 return (isinf(x) != 0);
1621 #if defined(VTK_HAS_ISNAN) || defined(VTK_HAS_STD_ISNAN)
1622 #define VTK_MATH_ISNAN_IS_INLINE
1625 #if defined(VTK_HAS_STD_ISNAN)
1628 return (
isnan(x) != 0);
1634 #if defined(VTK_HAS_ISFINITE) || defined(VTK_HAS_STD_ISFINITE) || defined(VTK_HAS_FINITE)
1635 #define VTK_MATH_ISFINITE_IS_INLINE
1638 #if defined(VTK_HAS_STD_ISFINITE)
1639 return std::isfinite(x);
1640 #elif defined(VTK_HAS_ISFINITE)
1641 return (isfinite(x) != 0);
1643 return (finite(x) != 0);
Gaussian sequence of pseudo random numbers implemented with the Box-Mueller transform.
abstract superclass for arrays of numeric data
vtkFrustumSelector is a vtkSelector that selects elements based on whether they are inside or interse...
a simple class to control print indentation
performs common math operations
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).
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)
static void Multiply3x3(const double A[3][3], const double B[3][3], double C[3][3])
static double Norm(const double *x, int n)
static int Round(float f)
Rounds a float to the nearest integer.
static int * BeginCombination(int m, int n)
Start iterating over "m choose n" objects.
static double Norm2D(const double x[2])
Compute the norm of a 2-vector.
static void XYZToRGB(double x, double y, double z, double *r, double *g, double *b)
static void Matrix3x3ToQuaternion(const double A[3][3], double quat[4])
static void Subtract(const float a[3], const float b[3], float c[3])
Subtraction of two 3-vectors (float version).
static void LUSolve3x3(const double A[3][3], const int index[3], double x[3])
static void Multiply3x3(const double A[3][3], const double in[3], double out[3])
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).
static bool ProjectVector(const double a[3], const double b[3], double projection[3])
static vtkSmartPointer< vtkMathInternal > Internal
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).
static void RGBToHSV(float r, float g, float b, float *h, float *s, float *v)
static float Norm(const float v[3])
Compute the norm of 3-vector (float version).
static vtkTypeBool Jacobi(double **a, double *w, double **v)
static void XYZToLab(const double xyz[3], double lab[3])
Convert Color from the CIE XYZ system to CIE-L*ab.
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 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)
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.
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).
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)
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.
static void MultiplyScalar2D(float a[2], float s)
Multiplies a 2-vector by a scalar (float version).
static void HSVToRGB(const float hsv[3], float rgb[3])
Convert color in HSV format (Hue, Saturation, Value) to RGB format (Red, Green, Blue).
static double Determinant2x2(const double c1[2], const double c2[2])
static T Max(const T &a, const T &b)
Returns the maximum of the two arguments provided.
static void Outer2D(const double x[2], const double y[2], double A[2][2])
Outer product of two 2-vectors (double version).
static void RandomSeed(int s)
Initialize seed value.
static double Normalize2D(double v[2])
Normalize (in place) a 2-vector.
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).
static void LabToRGB(double L, double a, double b, double *red, double *green, double *blue)
static double Gaussian()
Generate pseudo-random numbers distributed according to the standard normal distribution.
static void Multiply3x3(const float A[3][3], const float in[3], float out[3])
Multiply a vector by a 3x3 matrix.
static int Ceil(double x)
Rounds a double to the nearest integer not less than itself.
static void HSVToRGB(const double hsv[3], double rgb[3])
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 float Normalize2D(float v[2])
Normalize (in place) a 2-vector.
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.
static float Distance2BetweenPoints(const float p1[3], const float p2[3])
Compute distance squared between two points p1 and p2.
static int NearestPowerOfTwo(int x)
Compute the nearest power of two that is not less than x.
static void HSVToRGB(double h, double s, double v, double *r, double *g, double *b)
static void SingularValueDecomposition3x3(const double A[3][3], double U[3][3], double w[3], double VT[3][3])
static void Invert3x3(const double A[3][3], double AI[3][3])
static void HSVToRGB(float h, float s, float v, float *r, float *g, float *b)
static void MultiplyQuaternion(const double q1[4], const double q2[4], double q[4])
static void Outer(const double a[3], const double b[3], double c[3][3])
Outer product of two 3-vectors (double version).
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 float RadiansFromDegrees(float degrees)
Convert degrees into radians.
static void RotateVectorByWXYZ(const double v[3], const double q[4], double r[3])
static void Add(const float a[3], const float b[3], float c[3])
Addition of two 3-vectors (float version).
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?
static double Pi()
A mathematical constant.
static bool ProjectVector2D(const double a[2], const double b[2], double 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 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 double GaussianWeight(const double variance, const double distanceFromMean)
Compute the amplitude of an unnormalized Gaussian function with mean=0 and specified variance.
static void Subtract(const double a[3], const double b[3], double c[3])
Subtraction of two 3-vectors (double version).
static void Orthogonalize3x3(const double A[3][3], double B[3][3])
static void XYZToRGB(const double xyz[3], double rgb[3])
Convert color from the CIE XYZ system to RGB.
static double ClampAndNormalizeValue(double value, const double range[2])
Clamp a value against a range and then normalize it between 0 and 1.
static void MultiplyScalar(double a[3], double s)
Multiplies a 3-vector by a scalar (double version).
static double Dot2D(const double x[2], const double y[2])
Dot product of two 2-vectors.
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 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])
static void RGBToLab(const double rgb[3], double lab[3])
Convert color from the RGB system to CIE-L*ab.
static int Floor(double x)
Rounds a double to the nearest integer not greater than itself.
static void RotateVectorByNormalizedQuaternion(const double v[3], const double q[4], double r[3])
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 |.
static void RGBToHSV(const double rgb[3], double hsv[3])
static vtkTypeBool JacobiN(double **a, int n, double *w, double **v)
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.
static float Determinant2x2(const float c1[2], const float c2[2])
Compute determinant of 2x2 matrix.
static int Round(double f)
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.
static void RGBToHSV(double r, double g, double b, double *h, double *s, double *v)
static void Outer(const float a[3], const float b[3], float c[3][3])
Outer product of two 3-vectors (float version).
static double Norm(const double v[3])
Compute the norm of 3-vector (double version).
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...
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 void Matrix3x3ToQuaternion(const float A[3][3], float quat[4])
Convert a 3x3 matrix into a quaternion.
static bool IsPowerOfTwo(vtkTypeUInt64 x)
Returns true if integer is a power of two.
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.
static void Transpose3x3(const double A[3][3], double AT[3][3])
static double Determinant3x3(const float A[3][3])
Return the determinant of a 3x3 matrix.
static float Dot2D(const float x[2], const float y[2])
Dot product of two 2-vectors.
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 void RGBToHSV(const float rgb[3], float hsv[3])
Convert color in RGB format (Red, Green, Blue) to HSV format (Hue, Saturation, Value).
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 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.
static float Norm2D(const float x[2])
Compute the norm of a 2-vector.
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])
static void XYZToLab(double x, double y, double z, double *L, double *a, double *b)
static void MultiplyScalar(float a[3], float s)
Multiplies a 3-vector by a scalar (float version).
static T Min(const T &a, const T &b)
Returns the minimum of the two arguments provided.
static void QuaternionToMatrix3x3(const double quat[4], double A[3][3])
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.
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])
static void LUFactor3x3(double A[3][3], int index[3])
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)
static void MultiplyQuaternion(const float q1[4], const float q2[4], float q[4])
Multiply two quaternions.
static void QuaternionToMatrix3x3(const float quat[4], float A[3][3])
Convert a quaternion to a 3x3 rotation matrix.
static void ClampValues(const double *values, int nb_values, const double range[2], double *clamped_values)
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])
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.
Park and Miller Sequence of pseudo random numbers.
abstract base class for most VTK objects
represent and manipulate 3D points
void RoundDoubleToIntegralIfNecessary(double val, OutT *ret)
Template defining traits of native types used by VTK.
double vtkDeterminant3x3(const T A[3][3])