/* $Id$
*
* Copyright (c) 2010 Anders Wallin (anders.e.e.wallin "at" gmail.com).
*
* This file is part of OpenCAMlib
* (see https://github.com/aewallin/opencamlib).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 2.1 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*/
#ifndef NUMERIC_H
#define NUMERIC_H
#include
#include "point.hpp"
// #ifdef _MSC_VER
// #include // for _isnan() on VC++
// #define isnan(x) _isnan(x) // VC++ uses _isnan() instead of isnan()
// #elif defined WIN32
// bool isnan(double x){return false;}
// #endif
#include // isnan
namespace ocl
{
#define PI 3.1415926535897932
///
/// \brief Numeric is a collection of functions for dealing
/// with the joys of floating-point arithmetic.
///
/// return 1 of x>0, return -1 if x<0.
double sign(double x);
/// return x*x
inline double square(double x) {
return x*x;
}
/// return true if x is negative
bool isNegative(double x);
/// return true if x is negative
bool isPositive(double x);
/// return true if x is zero, to within tolerance
bool isZero_tol(double x);
/// returns machine-epsilon
/// eps is such that 1 < 1 + eps
/// but 1 == 1 + eps/2
double eps();
double epsD(double x);
float epsF(float x);
/// assertion with error message
void assert_msg( bool assertion, std::string message);
/// solves 2x2 matrix system Ax=y, solution is x = Ainv * y
/// [ a b ] [u] = [ e ]
/// [ c d ] [v] = [ f ]
bool two_by_two_solver( const double& a,
const double& b,
const double& c,
const double& d,
const double& e,
const double& f,
double& u,
double& v);
/// returns intersection in XY plane btw. lines p1,p2 and p3,p4
/// line1 is p1 + v * (p2-p1)
/// line2 is p3 + t * (p4-p3)
bool xy_line_line_intersection( const Point& p1, const Point& p2, double& v,
const Point& p3, const Point& p4, double& t);
/// convert the direction (x,y) into a diangle
double xyVectorToDiangle(double x, double y);
} // end ocl namespace
#endif
// end file numeric.hpp