24 #ifndef PXR_BASE_GF_MATH_H 25 #define PXR_BASE_GF_MATH_H 33 #include "pxr/base/gf/api.h" 34 #include "pxr/base/gf/traits.h" 36 #include <type_traits> 38 PXR_NAMESPACE_OPEN_SCOPE
42 inline bool GfIsClose(
double a,
double b,
double epsilon) {
43 return fabs(a-b) < epsilon;
49 return radians * (180.0 / M_PI);
55 return degrees * (M_PI / 180.0);
62 inline double GfSqr(
const T& x) {
75 return (v < 0) ? -1 : ((v > 0) ? 1 : 0);
80 inline double GfSqrt(
double f) {
return std::sqrt(f); }
83 inline float GfSqrt(
float f) {
return std::sqrt(f); }
87 inline double GfExp(
double f) {
return std::exp(f); }
90 inline float GfExp(
float f) {
return std::exp(f); }
94 inline double GfLog(
double f) {
return std::log(f); }
97 inline float GfLog(
float f) {
return std::log(f); }
101 inline double GfFloor(
double f) {
return std::floor(f); }
104 inline float GfFloor(
float f) {
return std::floor(f); }
108 inline double GfCeil(
double f) {
return std::ceil(f); }
111 inline float GfCeil(
float f) {
return std::ceil(f); }
115 inline double GfAbs(
double f) {
return std::fabs(f); }
118 inline float GfAbs(
float f) {
return std::fabs(f); }
122 inline double GfRound(
double f) {
return std::rint(f); }
125 inline float GfRound(
float f) {
return std::rint(f); }
129 inline double GfPow(
double f,
double p) {
return std::pow(f, p); }
132 inline float GfPow(
float f,
float p) {
return std::pow(f, p); }
136 inline double GfSin(
double v) {
return std::sin(v); }
139 inline float GfSin(
float v) {
return std::sin(v); }
142 inline double GfCos(
double v) {
return std::cos(v); }
145 inline float GfCos(
float v) {
return std::cos(v); }
156 inline double GfClamp(
double value,
double min,
double max) {
157 if (value < min)
return min;
158 if (value > max)
return max;
164 inline float GfClamp(
float value,
float min,
float max) {
165 if (value < min)
return min;
166 if (value > max)
return max;
178 double GfMod(
double a,
double b);
182 float GfMod(
float a,
float b);
193 inline T
GfLerp(
double alpha,
const T& a,
const T& b) {
194 return (1-alpha)* a + alpha * b;
201 return (a1 < a2 ? a1 : a2);
204 inline T
GfMin(T a1, T a2, T a3) {
208 inline T
GfMin(T a1, T a2, T a3, T a4) {
212 inline T
GfMin(T a1, T a2, T a3, T a4, T a5) {
220 return (a1 < a2 ? a2 : a1);
223 inline T
GfMax(T a1, T a2, T a3) {
227 inline T
GfMax(T a1, T a2, T a3, T a4) {
231 inline T
GfMax(T a1, T a2, T a3, T a4, T a5) {
238 template <
typename Left,
typename Right,
239 std::enable_if_t<GfIsArithmetic<Left>::value &&
241 inline decltype(std::declval<Left>() * std::declval<Right>())
249 template <
typename Left,
typename Right,
250 std::enable_if_t<GfIsArithmetic<Left>::value &&
252 inline decltype(std::declval<Left>() * std::declval<Right>())
260 template <
typename Left,
typename Right,
261 std::enable_if_t<GfIsArithmetic<Left>::value &&
263 inline decltype(std::declval<Left>() / std::declval<Right>())
269 PXR_NAMESPACE_CLOSE_SCOPE
271 #endif // PXR_BASE_GF_MATH_H GF_API double GfMod(double a, double b)
The mod function with "correct" behaviour for negative numbers.
Architecture-specific math function calls.
double GfCos(double v)
Return cos(v).
bool GfIsClose(double a, double b, double epsilon)
Returns true if a and b are with epsilon of each other.
double GfRadiansToDegrees(double radians)
Converts an angle in radians to degrees.
decltype(std::declval< Left >() *std::declval< Right >()) GfCompMult(Left left, Right right)
Returns component-wise multiplication of vectors.
double GfFloor(double f)
Return floor(f).
double GfSqr(const T &x)
Returns the inner product of x with itself: specifically, x*x.
double GfDegreesToRadians(double degrees)
Converts an angle in degrees to radians.
double GfAbs(double f)
Return abs(f).
T GfSgn(T v)
Return the signum of v (i.e.
T GfMin(T a1, T a2)
Returns the smallest of the given values.
double GfPow(double f, double p)
Return pow(f, p).
double GfCeil(double f)
Return ceil(f).
T GfLerp(double alpha, const T &a, const T &b)
Linear interpolation function.
double GfClamp(double value, double min, double max)
Return the resulting of clamping value to lie between min and max.
decltype(std::declval< Left >()/std::declval< Right >()) GfCompDiv(Left left, Right right)
Returns component-wise quotient of vectors.
double GfLog(double f)
Return log(f).
decltype(std::declval< Left >() *std::declval< Right >()) GfDot(Left left, Right right)
Returns the dot (inner) product of two vectors.
T GfMax(T a1, T a2)
Returns the largest of the given values.
void ArchSinCosf(float v, float *s, float *c)
Computes the sine and cosine of the specified value as a float.
double GfSqrt(double f)
Return sqrt(f).
void GfSinCos(double v, double *s, double *c)
Return sin(v) in s and cos(v) in c.
double GfExp(double f)
Return exp(f).
A metafunction which is equivalent to std::arithmetic but also includes any specializations from GfIs...
double GfSin(double v)
Return sin(v).
void ArchSinCos(double v, double *s, double *c)
Computes the sine and cosine of the specified value as a double.
double GfRound(double f)
Return round(f).