20#ifndef _ACF_UTILS_MATH_H_
21#define _ACF_UTILS_MATH_H_
32#define POW4(x) ((x) * (x) * (x) * (x))
34#define POW3(x) ((x) * (x) * (x))
36#define POW2(x) ((x) * (x))
39#define ABS(x) ((x) > 0 ? (x) : -(x))
44API_EXPORT
unsigned quadratic_solve(
double a,
double b,
double c,
double x[2]);
45API_EXPORT
double fx_lin(
double x,
double x1,
double y1,
double x2,
double y2)
47API_EXPORT
double fx_lin_multi(
double x,
const struct vect2_s *points,
48 bool_t extrapolate) PURE_ATTR;
49API_EXPORT
double fx_lin_multi2(
double x,
const struct vect2_s *points,
50 size_t n_points, bool_t extrapolate) PURE_ATTR;
54 bool_t extrapolate,
size_t *num_out);
56 size_t n_points, bool_t extrapolate,
size_t *num_out);
63wavg_impl(
double x,
double y,
double w,
const char *file,
int line)
67 ASSERT_MSG(!isnan(w),
"%f is NAN: called from: %s:%d", w, file, line);
68 ASSERT_MSG(w >= 0.0,
"%f < 0.0: called from: %s:%d", w, file, line);
69 ASSERT_MSG(w <= 1.0, "%f > 1.0: called from: %s:%d
", w, file, line);
70 return (x + (y - x) * w);
77#define wavg(x, y, w) wavg_impl((x), (y), (w), __FILE__, __LINE__)
84wavg2(double x, double y, double w)
86 return (x + (y - x) * w);
110iter_fract(double x, double min_val, double max_val, bool_t clamp_output)
112 ASSERT3F(min_val, !=, max_val);
113 x = (x - min_val) / (max_val - min_val);
119#define MAX_PN_INTERP_ORDER 64
131 double coeff[MAX_PN_INTERP_ORDER];
134API_EXPORT void pn_interp_init(pn_interp_t *interp, const vect2_t *points,
144pn_interp_run(double x, const pn_interp_t *interp)
146 double y = 0, power = 1;
148 ASSERT(interp != NULL);
149 ASSERT(interp->order != 0);
150 for (unsigned i = 0; i < interp->order; i++) {
151 y += interp->coeff[i] * power;
163smoothstep(double x, double edge0, double edge1)
166 ASSERT3F(edge1, >, edge0);
167 x = clamp((x - edge0) / (edge1 - edge0), 0, 1);
168 return (POW2(x) * (3 - 2 * x));
175smoothstep_inv(double x)
178 return (0.5 - sin(asin(1 - 2 * x) / 3));
219#define HROUND2(oldval, newval, step, hyst_rng) \
221 double tmpval = round((newval) / (step)) * (step); \
222 if (isnan((oldval))) { \
225 (newval) > (oldval) + (step) * (0.5 + (hyst_rng)) || \
226 (newval) < (oldval) - (step) * (0.5 + (hyst_rng))) { \
237#define HROUND(oldval, newval, step) \
238 HROUND2((oldval), (newval), (step), 0.35)
244#endif /* _ACF_UTILS_GEOM_H_ */
#define ASSERT_MSG(x, fmt,...)
double * fx_lin_multi_inv(double y, const struct vect2_s *points, size_t *num_out)
double * fx_lin_multi_inv3(double y, const struct vect2_s *points, size_t n_points, bool_t extrapolate, size_t *num_out)
double fx_lin(double x, double x1, double y1, double x2, double y2)
static double wavg_impl(double x, double y, double w, const char *file, int line)
unsigned quadratic_solve(double a, double b, double c, double x[2])
double fx_lin_multi2(double x, const struct vect2_s *points, size_t n_points, bool_t extrapolate)
double fx_lin_multi(double x, const struct vect2_s *points, bool_t extrapolate)
double * fx_lin_multi_inv2(double y, const struct vect2_s *points, bool_t extrapolate, size_t *num_out)