55 # define VTK_DBL_MIN 2.2250738585072014e-308 57 # define VTK_DBL_MIN DBL_MIN 61 # define VTK_DBL_EPSILON 2.2204460492503131e-16 63 # define VTK_DBL_EPSILON DBL_EPSILON 66 #ifndef VTK_DBL_EPSILON 68 # define VTK_DBL_EPSILON 2.2204460492503131e-16 70 # define VTK_DBL_EPSILON DBL_EPSILON 71 # endif // DBL_EPSILON 72 #endif // VTK_DBL_EPSILON 76 class vtkMathInternal;
88 static double Pi() {
return 3.141592653589793; };
98 static float RadiansFromDegrees(
float degrees);
99 static double RadiansFromDegrees(
double degrees);
104 static float DegreesFromRadians(
float radians);
105 static double DegreesFromRadians(
double radians);
111 return static_cast<int>( f + ( f >= 0 ? 0.5 : -0.5 ) ); }
113 return static_cast<int>( f + ( f >= 0 ? 0.5 : -0.5 ) ); }
118 static int Floor(
double x);
122 static int Ceil(
double x);
127 static int CeilLog2(vtkTypeUInt64 x);
130 static bool IsPowerOfTwo(vtkTypeUInt64 x);
135 static int NearestPowerOfTwo(
int x);
139 static vtkTypeInt64 Factorial(
int N );
144 static vtkTypeInt64 Binomial(
int m,
int n );
152 static int* BeginCombination(
int m,
int n );
160 static int NextCombination(
int m,
int n,
int* combination );
163 static void FreeCombination(
int* combination);
176 static void RandomSeed(
int s);
186 static int GetSeed();
197 static double Random();
207 static double Random(
double min,
double max );
217 static double Gaussian();
228 static double Gaussian(
double mean,
double std );
232 static void Add(
const float a[3],
const float b[3],
float c[3]) {
233 for (
int i = 0; i < 3; ++i)
240 static void Add(
const double a[3],
const double b[3],
double c[3]) {
241 for (
int i = 0; i < 3; ++i)
249 static void Subtract(
const float a[3],
const float b[3],
float c[3]) {
250 for (
int i = 0; i < 3; ++i)
258 static void Subtract(
const double a[3],
const double b[3],
double c[3]) {
259 for (
int i = 0; i < 3; ++i)
268 for (
int i = 0; i < 3; ++i)
277 for (
int i = 0; i < 2; ++i)
286 for (
int i = 0; i < 3; ++i)
295 for (
int i = 0; i < 2; ++i)
302 static float Dot(
const float x[3],
const float y[3]) {
303 return ( x[0] * y[0] + x[1] * y[1] + x[2] * y[2] );};
308 static double Dot(
const double x[3],
const double y[3]) {
309 return ( x[0] * y[0] + x[1] * y[1] + x[2] * y[2] );};
314 static void Outer(
const float x[3],
const float y[3],
float A[3][3]) {
315 for (
int i=0; i < 3; i++)
316 for (
int j=0; j < 3; j++)
317 A[i][j] = x[i] * y[j];
322 static void Outer(
const double x[3],
const double y[3],
double A[3][3]) {
323 for (
int i=0; i < 3; i++)
324 for (
int j=0; j < 3; j++)
325 A[i][j] = x[i] * y[j];
330 static void Cross(
const float x[3],
const float y[3],
float z[3]);
334 static void Cross(
const double x[3],
const double y[3],
double z[3]);
338 static float Norm(
const float* x,
int n);
339 static double Norm(
const double* x,
int n);
344 static float Norm(
const float x[3]) {
345 return static_cast<float> (sqrt( x[0] * x[0] + x[1] * x[1] + x[2] * x[2] ) );};
350 static double Norm(
const double x[3]) {
351 return sqrt( x[0] * x[0] + x[1] * x[1] + x[2] * x[2] );};
355 static float Normalize(
float x[3]);
359 static double Normalize(
double x[3]);
367 static void Perpendiculars(
const double x[3],
double y[3],
double z[3],
369 static void Perpendiculars(
const float x[3],
float y[3],
float z[3],
377 static bool ProjectVector(
const float a[3],
const float b[3],
float projection[3]);
378 static bool ProjectVector(
const double a[3],
const double b[3],
double projection[3]);
386 static bool ProjectVector2D(
const float a[2],
const float b[2],
float projection[2]);
387 static bool ProjectVector2D(
const double a[2],
const double b[2],
double projection[2]);
391 static float Distance2BetweenPoints(
const float x[3],
const float y[3]);
395 static double Distance2BetweenPoints(
const double x[3],
const double y[3]);
398 static double AngleBetweenVectors(
const double v1[3],
const double v2[3]);
403 static double GaussianAmplitude(
const double variance,
const double distanceFromMean);
408 static double GaussianAmplitude(
const double mean,
const double variance,
const double position);
414 static double GaussianWeight(
const double variance,
const double distanceFromMean);
420 static double GaussianWeight(
const double mean,
const double variance,
const double position);
424 static float Dot2D(
const float x[2],
const float y[2]) {
425 return ( x[0] * y[0] + x[1] * y[1] );};
430 static double Dot2D(
const double x[2],
const double y[2]) {
431 return ( x[0] * y[0] + x[1] * y[1] );};
436 static void Outer2D(
const float x[2],
const float y[2],
float A[2][2])
438 for (
int i=0; i < 2; i++)
440 for (
int j=0; j < 2; j++)
442 A[i][j] = x[i] * y[j];
449 static void Outer2D(
const double x[2],
const double y[2],
double A[2][2])
451 for (
int i=0; i < 2; i++)
453 for (
int j=0; j < 2; j++)
455 A[i][j] = x[i] * y[j];
464 return static_cast<float> (sqrt( x[0] * x[0] + x[1] * x[1] ) );};
469 static double Norm2D(
const double x[2]) {
470 return sqrt( x[0] * x[0] + x[1] * x[1] );};
474 static float Normalize2D(
float x[2]);
478 static double Normalize2D(
double x[2]);
483 return (c1[0] * c2[1] - c2[0] * c1[1] );};
489 return (a * d - b * c);};
491 return (c1[0] * c2[1] - c2[0] * c1[1] );};
496 static void LUFactor3x3(
float A[3][3],
int index[3]);
497 static void LUFactor3x3(
double A[3][3],
int index[3]);
502 static void LUSolve3x3(
const float A[3][3],
const int index[3],
504 static void LUSolve3x3(
const double A[3][3],
const int index[3],
511 static void LinearSolve3x3(
const float A[3][3],
const float x[3],
513 static void LinearSolve3x3(
const double A[3][3],
const double x[3],
519 static void Multiply3x3(
const float A[3][3],
const float in[3],
521 static void Multiply3x3(
const double A[3][3],
const double in[3],
527 static void Multiply3x3(
const float A[3][3],
const float B[3][3],
529 static void Multiply3x3(
const double A[3][3],
const double B[3][3],
536 static void MultiplyMatrix(
double **A,
double **B,
537 unsigned int rowA,
unsigned int colA,
538 unsigned int rowB,
unsigned int colB,
545 static void Transpose3x3(
const float A[3][3],
float AT[3][3]);
546 static void Transpose3x3(
const double A[3][3],
double AT[3][3]);
552 static void Invert3x3(
const float A[3][3],
float AI[3][3]);
553 static void Invert3x3(
const double A[3][3],
double AI[3][3]);
558 static void Identity3x3(
float A[3][3]);
559 static void Identity3x3(
double A[3][3]);
564 static double Determinant3x3(
float A[3][3]);
565 static double Determinant3x3(
double A[3][3]);
570 static float Determinant3x3(
const float c1[3],
577 static double Determinant3x3(
const double c1[3],
585 static double Determinant3x3(
double a1,
double a2,
double a3,
586 double b1,
double b2,
double b3,
587 double c1,
double c2,
double c3);
595 static void QuaternionToMatrix3x3(
const float quat[4],
float A[3][3]);
596 static void QuaternionToMatrix3x3(
const double quat[4],
double A[3][3]);
605 static void Matrix3x3ToQuaternion(
const float A[3][3],
float quat[4]);
606 static void Matrix3x3ToQuaternion(
const double A[3][3],
double quat[4]);
613 static void MultiplyQuaternion(
const float q1[4],
const float q2[4],
float q[4] );
614 static void MultiplyQuaternion(
const double q1[4],
const double q2[4],
double q[4] );
621 static void Orthogonalize3x3(
const float A[3][3],
float B[3][3]);
622 static void Orthogonalize3x3(
const double A[3][3],
double B[3][3]);
630 static void Diagonalize3x3(
const float A[3][3],
float w[3],
float V[3][3]);
631 static void Diagonalize3x3(
const double A[3][3],
double w[3],
double V[3][3]);
642 static void SingularValueDecomposition3x3(
const float A[3][3],
643 float U[3][3],
float w[3],
645 static void SingularValueDecomposition3x3(
const double A[3][3],
646 double U[3][3],
double w[3],
654 static int SolveLinearSystem(
double **A,
double *x,
int size);
659 static int InvertMatrix(
double **A,
double **AI,
int size);
664 static int InvertMatrix(
double **A,
double **AI,
int size,
665 int *tmp1Size,
double *tmp2Size);
683 static int LUFactorLinearSystem(
double **A,
int *index,
int size);
688 static int LUFactorLinearSystem(
double **A,
int *index,
int size,
699 static void LUSolveLinearSystem(
double **A,
int *index,
700 double *x,
int size);
710 static double EstimateMatrixCondition(
double **A,
int size);
718 static int Jacobi(
float **a,
float *w,
float **
v);
719 static int Jacobi(
double **a,
double *w,
double **v);
729 static int JacobiN(
float **a,
int n,
float *w,
float **v);
730 static int JacobiN(
double **a,
int n,
double *w,
double **v);
744 static int SolveHomogeneousLeastSquares(
int numberOfSamples,
double **xt,
int xOrder,
761 static int SolveLeastSquares(
int numberOfSamples,
double **xt,
int xOrder,
762 double **yt,
int yOrder,
double **mt,
int checkHomogeneous=1);
770 static void RGBToHSV(
const float rgb[3],
float hsv[3])
771 { RGBToHSV(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); }
772 static void RGBToHSV(
float r,
float g,
float b,
float *
h,
float *s,
float *v);
773 static double* RGBToHSV(
const double rgb[3]);
774 static double* RGBToHSV(
double r,
double g,
double b);
775 static void RGBToHSV(
const double rgb[3],
double hsv[3])
776 { RGBToHSV(rgb[0], rgb[1], rgb[2], hsv, hsv+1, hsv+2); }
777 static void RGBToHSV(
double r,
double g,
double b,
double *h,
double *s,
double *v);
785 static void HSVToRGB(
const float hsv[3],
float rgb[3])
786 { HSVToRGB(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2); }
787 static void HSVToRGB(
float h,
float s,
float v,
float *r,
float *g,
float *b);
788 static double* HSVToRGB(
const double hsv[3]);
789 static double* HSVToRGB(
double h,
double s,
double v);
790 static void HSVToRGB(
const double hsv[3],
double rgb[3])
791 { HSVToRGB(hsv[0], hsv[1], hsv[2], rgb, rgb+1, rgb+2); }
792 static void HSVToRGB(
double h,
double s,
double v,
double *r,
double *g,
double *b);
797 static void LabToXYZ(
const double lab[3],
double xyz[3]) {
798 LabToXYZ(lab[0], lab[1], lab[2], xyz+0, xyz+1, xyz+2);
800 static void LabToXYZ(
double L,
double a,
double b,
801 double *x,
double *y,
double *z);
802 static double *LabToXYZ(
const double lab[3]);
807 static void XYZToLab(
const double xyz[3],
double lab[3]) {
808 XYZToLab(xyz[0], xyz[1], xyz[2], lab+0, lab+1, lab+2);
810 static void XYZToLab(
double x,
double y,
double z,
811 double *L,
double *a,
double *b);
812 static double *XYZToLab(
const double xyz[3]);
817 static void XYZToRGB(
const double xyz[3],
double rgb[3]) {
818 XYZToRGB(xyz[0], xyz[1], xyz[2], rgb+0, rgb+1, rgb+2);
820 static void XYZToRGB(
double x,
double y,
double z,
821 double *r,
double *g,
double *b);
822 static double *XYZToRGB(
const double xyz[3]);
827 static void RGBToXYZ(
const double rgb[3],
double xyz[3]) {
828 RGBToXYZ(rgb[0], rgb[1], rgb[2], xyz+0, xyz+1, xyz+2);
830 static void RGBToXYZ(
double r,
double g,
double b,
831 double *x,
double *y,
double *z);
832 static double *RGBToXYZ(
const double rgb[3]);
839 static void RGBToLab(
const double rgb[3],
double lab[3]) {
840 RGBToLab(rgb[0], rgb[1], rgb[2], lab+0, lab+1, lab+2);
842 static void RGBToLab(
double red,
double green,
double blue,
843 double *L,
double *a,
double *b);
844 static double *RGBToLab(
const double rgb[3]);
849 static void LabToRGB(
const double lab[3],
double rgb[3]) {
850 LabToRGB(lab[0], lab[1], lab[2], rgb+0, rgb+1, rgb+2);
852 static void LabToRGB(
double L,
double a,
double b,
853 double *red,
double *green,
double *blue);
854 static double *LabToRGB(
const double lab[3]);
872 if ( bounds[1]-bounds[0]<0.0 )
883 static void ClampValue(
double *
value,
const double range[2]);
884 static void ClampValue(
double value,
const double range[2],
double *clamped_value);
885 static void ClampValues(
886 double *
values,
int nb_values,
const double range[2]);
887 static void ClampValues(
888 const double *values,
int nb_values,
const double range[2],
double *clamped_values);
895 static double ClampAndNormalizeValue(
double value,
896 const double range[2]);
906 static int GetScalarTypeFittingRange(
907 double range_min,
double range_max,
908 double scale = 1.0,
double shift = 0.0);
918 static int GetAdjustedScalarRange(
924 static int ExtentIsWithinOtherExtent(
int extent1[6],
int extent2[6]);
929 static int BoundsIsWithinOtherBounds(
double bounds1[6],
double bounds2[6],
double delta[3]);
934 static int PointIsWithinBounds(
double point[3],
double bounds[6],
double delta[3]);
944 static double Solve3PointCircle(
const double p1[3],
const double p2[3],
const double p3[3],
double center[3]);
950 static double NegInf();
957 static int IsInf(
double x);
961 static int IsNan(
double x);
965 static bool IsFinite(
double x);
974 void operator=(
const vtkMath&);
980 return x * 0.017453292f;
986 return x * 0.017453292519943295;
992 return x * 57.2957795131f;
998 return x * 57.29577951308232;
1015 return ((x != 0) & ((x & (x - 1)) == 0));
1022 unsigned int z = ((x > 0) ? x - 1 : 0);
1028 return static_cast<int>(z + 1);
1036 int i =
static_cast<int>(
x);
1037 return i - ( i >
x );
1045 int i =
static_cast<int>(
x);
1046 return i + ( i <
x );
1055 for (
int i=0; i < 3; i++)
1069 for (
int i=0; i < 3; i++)
1083 for (
int i=0; i < 2; i++)
1097 for (
int i=0; i < 2; i++)
1110 return c1[0] * c2[1] * c3[2] + c2[0] * c3[1] * c1[2] + c3[0] * c1[1] * c2[2] -
1111 c1[0] * c3[1] * c2[2] - c2[0] * c1[1] * c3[2] - c3[0] * c2[1] * c1[2];
1119 return c1[0] * c2[1] * c3[2] + c2[0] * c3[1] * c1[2] + c3[0] * c1[1] * c2[2] -
1120 c1[0] * c3[1] * c2[2] - c2[0] * c1[1] * c3[2] - c3[0] * c2[1] * c1[2];
1125 double b1,
double b2,
double b3,
1126 double c1,
double c2,
double c3)
1137 return ( ( x[0] - y[0] ) * ( x[0] - y[0] )
1138 + ( x[1] - y[1] ) * ( x[1] - y[1] )
1139 + ( x[2] - y[2] ) * ( x[2] - y[2] ) );
1146 return ( ( x[0] - y[0] ) * ( x[0] - y[0] )
1147 + ( x[1] - y[1] ) * ( x[1] - y[1] )
1148 + ( x[2] - y[2] ) * ( x[2] - y[2] ) );
1155 float Zx = x[1] * y[2] - x[2] * y[1];
1156 float Zy = x[2] * y[0] - x[0] * y[2];
1157 float Zz = x[0] * y[1] - x[1] * y[0];
1158 z[0] = Zx; z[1] = Zy; z[2] = Zz;
1165 double Zx = x[1] * y[2] - x[2] * y[1];
1166 double Zy = x[2] * y[0] - x[0] * y[2];
1167 double Zz = x[0] * y[1] - x[1] * y[0];
1168 z[0] = Zx; z[1] = Zy; z[2] = Zz;
1176 return A[0][0] * A[1][1] * A[2][2] + A[1][0] * A[2][1] * A[0][2] +
1177 A[2][0] * A[0][1] * A[1][2] - A[0][0] * A[2][1] * A[1][2] -
1178 A[1][0] * A[0][1] * A[2][2] - A[2][0] * A[1][1] * A[0][2];
1199 if (*value < range[0])
1203 else if (*value > range[1])
1212 double value,
const double range[2],
double *clamped_value)
1214 if (range && clamped_value)
1216 if (value < range[0])
1218 *clamped_value = range[0];
1220 else if (value > range[1])
1222 *clamped_value = range[1];
1226 *clamped_value =
value;
1233 const double range[2])
1235 assert(
"pre: valid_range" && range[0]<=range[1]);
1238 if(range[0]==range[1])
1262 result=( result - range[0] ) / ( range[1] - range[0] );
1265 assert(
"post: valid_result" && result>=0.0 && result<=1.0);
1271 #if defined(VTK_HAS_ISINF) || defined(VTK_HAS_STD_ISINF) 1272 #define VTK_MATH_ISINF_IS_INLINE 1275 #if defined(VTK_HAS_STD_ISINF) 1276 return std::isinf(x);
1278 return (isinf(x) != 0);
1284 #if defined(VTK_HAS_ISNAN) || defined(VTK_HAS_STD_ISNAN) 1285 #define VTK_MATH_ISNAN_IS_INLINE 1288 #if defined(VTK_HAS_STD_ISNAN) 1289 return std::isnan(x);
1291 return (isnan(x) != 0);
1297 #if defined(VTK_HAS_ISFINITE) || defined(VTK_HAS_STD_ISFINITE) || defined(VTK_HAS_FINITE) 1298 #define VTK_MATH_ISFINITE_IS_INLINE 1301 #if defined(VTK_HAS_STD_ISFINITE) 1302 return std::isfinite(x);
1303 #elif defined(VTK_HAS_ISFINITE) 1304 return (isfinite(x) != 0);
1306 return (finite(x) != 0);
static void MultiplyScalar2D(float a[2], float s)
static bool IsFinite(double x)
static float Dot2D(const float x[2], const float y[2])
static void Cross(const float x[3], const float y[3], float z[3])
GLboolean GLboolean GLboolean b
static int IsInf(double x)
abstract base class for most VTK objects
static void LabToXYZ(const double lab[3], double xyz[3])
static double Norm(const double x[3])
static void ClampValue(double *value, const double range[2])
static bool IsPowerOfTwo(vtkTypeUInt64 x)
static void Outer(const float x[3], const float y[3], float A[3][3])
GLenum GLenum GLenum GLenum GLenum scale
static float Determinant2x2(const float c1[2], const float c2[2])
#define VTKCOMMONCORE_EXPORT
static vtkTypeInt64 Factorial(int N)
static void RGBToHSV(const double rgb[3], double hsv[3])
static int Round(float f)
GLsizei const GLfloat * value
static void RGBToHSV(const float rgb[3], float hsv[3])
static int AreBoundsInitialized(double bounds[6])
static double ClampAndNormalizeValue(double value, const double range[2])
GLdouble GLdouble GLdouble r
GLint GLint GLint GLint GLint GLint y
static void Outer(const double x[3], const double y[3], double A[3][3])
#define vtkTypeMacro(thisClass, superclass)
static void Add(const double a[3], const double b[3], double c[3])
static void XYZToRGB(const double xyz[3], double rgb[3])
static float Norm2D(const float x[2])
static float Normalize2D(float x[2])
GLint GLint GLint GLint GLint x
static void UninitializeBounds(double bounds[6])
GLfloat GLfloat GLfloat v2
static int NearestPowerOfTwo(int x)
GLubyte GLubyte GLubyte GLubyte w
virtual void PrintSelf(ostream &os, vtkIndent indent)
static void RGBToXYZ(const double rgb[3], double xyz[3])
a simple class to control print indentation
GLboolean GLenum GLenum GLvoid * values
static float Dot(const float x[3], const float y[3])
static void Subtract(const float a[3], const float b[3], float c[3])
static void Subtract(const double a[3], const double b[3], double c[3])
static int Floor(double x)
abstract superclass for arrays of numeric data
static double Determinant2x2(double a, double b, double c, double d)
static float RadiansFromDegrees(float degrees)
static void HSVToRGB(const double hsv[3], double rgb[3])
Park and Miller Sequence of pseudo random numbers.
static void MultiplyScalar(double a[3], double s)
static double Determinant3x3(float A[3][3])
static float Normalize(float x[3])
static void RGBToLab(const double rgb[3], double lab[3])
static float DegreesFromRadians(float radians)
static void Outer2D(const double x[2], const double y[2], double A[2][2])
#define VTK_LEGACY(method)
static void Outer2D(const float x[2], const float y[2], float A[2][2])
static int Ceil(double x)
GLboolean GLboolean GLboolean GLboolean a
performs common math operations
static double Dot2D(const double x[2], const double y[2])
static double Dot(const double x[3], const double y[3])
static void MultiplyScalar(float a[3], float s)
static void HSVToRGB(const float hsv[3], float rgb[3])
static double Norm2D(const double x[2])
static int Round(double f)
VTKWRAPPINGJAVA_EXPORT jlong q(JNIEnv *env, jobject obj)
static void MultiplyScalar2D(double a[2], double s)
static void LabToRGB(const double lab[3], double rgb[3])
static vtkMathInternal Internal
double vtkDeterminant3x3(T A[3][3])
static float Norm(const float *x, int n)
static float Distance2BetweenPoints(const float x[3], const float y[3])
static int IsNan(double x)
Gaussian sequence of pseudo random numbers implemented with the Box-Mueller transform.
static double Determinant2x2(const double c1[2], const double c2[2])
static float Norm(const float x[3])
static void Add(const float a[3], const float b[3], float c[3])
GLfloat GLfloat GLfloat GLfloat h
represent and manipulate 3D points
static void XYZToLab(const double xyz[3], double lab[3])