00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
#ifndef WFMATH_CONST_H
00027
#define WFMATH_CONST_H
00028
00029
#include <cfloat>
00030
00031
00032
#include <cassert>
00033
#include <cmath>
00034
00035
#ifdef _MSC_VER
00036
#if _MSC_VER < 1300
00037
#error "You are using an older version of MSVC++ with extremely poor"
00038
#error "template support. Please use at least version 7.0, where the"
00039
#error "template support is merely bad, or try a different compiler."
00040
#else
00041
00042
00043
00044
#define WFMATH_NO_CLASS_FUNCTION_SPECIALIZATION 1
00045
00046
#define WFMATH_NO_TEMPLATES_AS_TEMPLATE_PARAMETERS 1
00047
#endif
00048
#endif
00049
00050
00051
#include <iosfwd>
00052
00054
namespace WFMath {
00055
00056
00057
00058
00059
class AtlasInType;
00060
class AtlasOutType;
00061
00062
00063
00065 const double Pi = 3.14159265358979323846264338327950288419716939937508;
00067 const double SqrtPi = 1.77245385090551602729816748334114518279754945612237;
00069 const double LogPi = 1.14472988584940017414342735135305871164729481291530;
00071 const double Sqrt2 = 1.41421356237309504880168872420969807856967187537693;
00073 const double Sqrt3 = 1.73205080756887729352744634150587236694280525381037;
00075 const double Log2 = 0.69314718055994530941723212145817656807550013436025;
00076
00078
#define WFMATH_PRECISION_FUDGE_FACTOR 30
00079
00080
#define WFMATH_MAX_NORM_AGE ((WFMATH_PRECISION_FUDGE_FACTOR * 2) / 3)
00081
00083 typedef float CoordType;
00085
#define WFMATH_EPSILON (WFMATH_PRECISION_FUDGE_FACTOR * FLT_EPSILON)
00086
00088
#define WFMATH_MAX FLT_MAX
00089
00090
#define WFMATH_MIN FLT_MIN
00091
00092
00093
00094
double _ScaleEpsilon(
double x1,
double x2,
double epsilon);
00095
double _ScaleEpsilon(
const CoordType* x1,
const CoordType* x2,
00096
int length,
double epsilon = WFMATH_EPSILON);
00097
00099
00106
template<
class C>
00107 inline bool Equal(
const C& c1,
const C& c2,
double epsilon = WFMATH_EPSILON)
00108 {
return c1.isEqualTo(c2, epsilon);}
00109
00110
bool Equal(
double x1,
double x2,
double epsilon = WFMATH_EPSILON);
00111
00112
inline bool Equal(
float x1,
float x2,
double epsilon = WFMATH_EPSILON)
00113 {
return Equal((
double) x1, (
double) x2, epsilon);}
00114
00115
00116
00117
00118
inline CoordType FloatMax(CoordType a, CoordType b)
00119 {
return (a > b) ? a : b;}
00120
inline CoordType FloatMin(CoordType a, CoordType b)
00121 {
return (a < b) ? a : b;}
00122
inline CoordType FloatClamp(CoordType val, CoordType min, CoordType max)
00123 {
return (min >= val) ? min : (max <= val ? max : val);}
00124
00125 }
00126
00127
#endif // WFMATH_CONST_H