// This file is part of fityk program. Copyright (C) Marcin Wojdyr
// Licence: GNU General Public License version 2
// $Id: numfuncs.h 326 2007-08-01 05:54:03Z wojdyr $
// it contains also declarations of functions from nmath.cpp
#ifndef FITYK__NUMFUNCS__H__
#define FITYK__NUMFUNCS__H__
#include <stdlib.h>
#include "common.h"
/// Points used for parametrized functions. They have q parameter, that
/// is used for cubic spline computation
struct PointQ
{
fp x, y;
fp q; /* q is used for spline */
PointQ (fp x_, fp y_) : x(x_), y(y_) {}
};
inline bool operator< (const PointQ& p, const PointQ& q)
{ return p.x < q.x; }
/// returns position pos in sorted vector of points, *pos and *(pos+1) are
/// required segment for interpolation
/// optimized for sequenced calling with slowly increasing x's
std::vector<PointQ>::iterator
get_interpolation_segment(std::vector<PointQ> &bb, fp x);
/// must be run before computing value of cubic spline in point x
/// results are written in PointQ::q
/// based on Numerical Recipes www.nr.com
void prepare_spline_interpolation (std::vector<PointQ> &bb);
fp get_spline_interpolation(std::vector<PointQ> &bb, fp x);
fp get_linear_interpolation(std::vector<PointQ> &bb, fp x);
//fp LnGammaE (fp x); /// log_e of Gamma function
double digamma(double x);//in nmath.cpp
double gammafn(double x);//in nmath.cpp
double lgammafn(double x);//in nmath.cpp
// random number utilities
inline fp rand_1_1() { return 2.0 * rand() / RAND_MAX - 1.; }
inline fp rand_0_1() { return static_cast<fp>(rand()) / RAND_MAX; }
inline fp rand_uniform(fp a, fp b) { return a + rand_0_1() * (b-a); }
inline bool rand_bool() { return rand() < RAND_MAX / 2; }
fp rand_gauss();
fp rand_cauchy();
// Simple Polyline Convex Hull Algorithms
// takes as input a sequence of points (x,y), with increasing x coord (added
// in push_point()) and returns points of convex hull (get_vertices())
class SimplePolylineConvex
{
public:
void push_point(PointQ const& p);
std::vector<PointQ> const& get_vertices() const { return vertices; }
// test if point p2 left of the line through p0 and p1
static bool is_left(PointQ const& p0, PointQ const& p1, PointQ const& p2)
{ return (p1.x - p0.x)*(p2.y - p0.y) > (p2.x - p0.x)*(p1.y - p0.y); }
private:
std::vector<PointQ> vertices;
};
#endif
syntax highlighted by Code2HTML, v. 0.9.1