1 /*****************************************************************************
5 ** Purpose: Header file containing definitions for numerical app
6 ** Programmer: Kevin Rosenberg
7 ** Date Started: Nov 84
9 ** This is part of the CTSim program
10 ** Copyright (C) 1983-2000 Kevin Rosenberg
12 ** $Id: kmath.h,v 1.12 2000/06/13 16:20:31 kevin Exp $
14 ** This program is free software; you can redistribute it and/or modify
15 ** it under the terms of the GNU General Public License (version 2) as
16 ** published by the Free Software Foundation.
18 ** This program is distributed in the hope that it will be useful,
19 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
20 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 ** GNU General Public License for more details.
23 ** You should have received a copy of the GNU General Public License
24 ** along with this program; if not, write to the Free Software
25 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
26 ******************************************************************************/
35 #define PI 3.14159265358979323846
36 #define HALFPI 1.57079632679489661923 /* PI divided by 2 */
37 #define QUARTPI 0.78539816339744830962 /* PI divided by 4 */
38 #define I_PI 0.31830988618379067154 /* Inverse of PI */
39 #define I_PID2 0.63661977236758134308 /* Inverse of PID2 */
41 #define TWOPI 6.28318530717958647692
42 #define SQRT2 1.414213562373095049
44 #define F_EPSILON 1.0E-6
45 #define D_EPSILON 1.0E-10
47 #define DEG_TO_RAD(x) (x*(PI/180.))
48 #define RAD_TO_DEG(x) (x*(180./PI))
50 #define ASSUMEDZERO 1E-10
52 typedef double GRFMTX_2D[3][3];
53 typedef double GRFMTX_3D[4][4];
57 inline T nearest (double x)
58 { return (x > 0 ? static_cast<T>(x+0.5) : static_cast<T>(x-0.5)); }
61 inline T clamp (T value, T upperBounds, T lowerBounds)
62 { return (value >= upperBounds ? upperBounds : (value <= lowerBounds ? lowerBounds : value )); }
66 int clip_rect(double *x1, double *y1, double *x2, double *y2, const double rect[4]);
67 int clip_segment(double *x1, double *y1, double *x2, double *y2, const double u, const double v);
68 int clip_sector(double *x1, double *y1, double *x2, double *y2, const double u, const double v);
69 int clip_circle(double *x1, double *y1, double *x2, double *y2, const double cx, const double cy, const double radius, double t1, double t2);
70 int clip_triangle(double *x1, double *y1, double *x2, double *y2, const double u, const double v, const int clip_xaxis);
73 double norm_ang(double theta);
76 void indent_mtx2(GRFMTX_2D m);
77 void xlat_mtx2(GRFMTX_2D m, const double x, const double y);
78 void scale_mtx2(GRFMTX_2D m, const double sx, const double sy);
79 void rot_mtx2(GRFMTX_2D m, const double theta);
80 void mult_mtx2(GRFMTX_2D m1, GRFMTX_2D m2, GRFMTX_2D result);
81 void xform_mtx2(GRFMTX_2D m, double *x, double *y);
82 void rotate2d(double x[], double y[], int pts, double angle);
83 void xlat2d(double x[], double y[], int pts, double xoffset, double yoffset);
84 void scale2d(double x[], double y[], int pts, double xfact, double yfact);
87 double simpson(const double xmin, const double xmax, const double *y, const int np);
90 void minmax_dvector(const double array[], const int pts, double *xmin, double *xmax);