1 /*****************************************************************************
2 ** This is part of the CTSim program
3 ** Copyright (C) 1983-2000 Kevin Rosenberg
5 ** $Id: kmath.h,v 1.9 2000/05/08 20:00:48 kevin Exp $
7 ** Revision 1.9 2000/05/08 20:00:48 kevin
10 ** Revision 1.8 2000/05/07 12:46:19 kevin
11 ** made c++ compatible
13 ** Revision 1.7 2000/05/04 18:16:34 kevin
14 ** renamed filter definitions
16 ** Revision 1.6 2000/05/02 20:00:25 kevin
17 ** *** empty log message ***
19 ** Revision 1.5 2000/05/02 15:31:39 kevin
22 ** Revision 1.4 2000/04/30 19:17:35 kevin
23 ** Set up include files for conditional INTERACTIVE_GRAPHICS
25 ** Revision 1.3 2000/04/28 14:14:16 kevin
26 ** *** empty log message ***
29 ** This program is free software; you can redistribute it and/or modify
30 ** it under the terms of the GNU General Public License (version 2) as
31 ** published by the Free Software Foundation.
33 ** This program is distributed in the hope that it will be useful,
34 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
35 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36 ** GNU General Public License for more details.
38 ** You should have received a copy of the GNU General Public License
39 ** along with this program; if not, write to the Free Software
40 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
41 ******************************************************************************/
42 /******************************************************************************
45 * Header file containing definitions for numerical app's
46 * Date Started: Nov 84
48 *****************************************************************************/
58 #endif /* __cplusplus */
60 #define PI 3.14159265358979323846
61 #define HALFPI 1.57079632679489661923 /* PI divided by 2 */
62 #define QUARTPI 0.78539816339744830962 /* PI divided by 4 */
63 #define I_PI 0.31830988618379067154 /* Inverse of PI */
64 #define I_PID2 0.63661977236758134308 /* Inverse of PID2 */
66 #define TWOPI 6.28318530717958647692
67 #define SQRT2 1.414213562373095049
69 #define F_EPSILON 1.0E-6
70 #define D_EPSILON 1.0E-10
72 #define DEG_TO_RAD(x) (x*(PI/180.))
73 #define RAD_TO_DEG(x) (x*(180./PI))
76 #define ASSUMEDZERO 1E-10
78 /* codes for C data types */
87 typedef char *CMTX_1D;
88 typedef CMTX_1D *CMTX_2D;
89 typedef CMTX_2D *CMTX_3D;
92 typedef IMTX_1D *IMTX_2D;
93 typedef IMTX_2D *IMTX_3D;
95 typedef float *FMTX_1D;
96 typedef FMTX_1D *FMTX_2D;
97 typedef FMTX_2D *FMTX_3D;
99 typedef double *DMTX_1D;
100 typedef DMTX_1D *DMTX_2D;
101 typedef DMTX_2D *DMTX_3D;
103 typedef double GRFMTX_2D[3][3];
104 typedef double GRFMTX_3D[4][4];
106 union elem_val_un { /* holds an element value */
114 typedef union elem_val_un MTX_ELEM_VAL;
117 union elem_ptr_un { /* holds a pointer to a 1D vector of any type */
125 typedef union elem_ptr_un MTX_1D;
126 typedef MTX_1D *MTX_2D;
127 typedef MTX_2D *MTX_3D;
129 union mtx_val_ptr_un { /* pointer to matrix values */
135 typedef union mtx_val_ptr_un MTX_PTR;
138 unsigned int order; /* order, or dimension, of matrix */
139 unsigned int elemtype; /* element type */
140 unsigned int elemsize; /* size of element in bytes */
141 unsigned int nx, ny, nz; /* size of matrix in each dimension */
142 MTX_PTR val; /* pointer to matrix values */
145 typedef struct matrix_st MTX;
146 typedef struct matrix_st *MTXP;
148 /* DEFINITION IDENTIFICATION
150 * Definitions to access a matrix element from an matrix
154 (mtx->elemtype == DT_FLOAT ? mtx->val.m1.f[x] :\
155 (mtx->elemtype == DT_DOUBLE ? mtx->val.m1.d[x] :\
156 (mtx->elemtype == DT_INT ? mtx->val.m1.i[x] :\
157 (mtx->elemtype == DT_LONG ? mtx->val.m1.l[x] :\
158 (mtx->elemtype == DT_CHAR ? mtx->val.m1.c[x] :\
162 #define me2(mtx,x,y)\
163 (mtx->elemtype == DT_FLOAT ? mtx->val.m2[x].f[y] :\
164 (mtx->elemtype == DT_DOUBLE ? mtx->val.m2[x].d[y] :\
165 (mtx->elemtype == DT_INT ? mtx->val.m2[x].i[y] :\
166 (mtx->elemtype == DT_LONG ? mtx->val.m2[x].l[y] :\
167 (mtx->elemtype == DT_CHAR ? mtx->val.m2[x].c[y] :\
172 #define me3(mtx,x,y,z)\
173 (mtx->elemtype == DT_FLOAT ? mtx->val.m3[x][y].f[z] :\
174 (mtx->elemtype == DT_DOUBLE ? mtx->val.m3[x][y].d[z] :\
175 (mtx->elemtype == DT_INT ? mtx->val.m3[x][y].i[z] :\
176 (mtx->elemtype == DT_LONG ? mtx->val.m3[x][y].l[z] :\
177 (mtx->elemtype == DT_CHAR ? mtx->val.m3[x][y].c[z] :\
183 int clip_rect(double *x1, double *y1, double *x2, double *y2, const double rect[4]);
184 int clip_segment(double *x1, double *y1, double *x2, double *y2, const double u, const double v);
185 int clip_sector(double *x1, double *y1, double *x2, double *y2, const double u, const double v);
186 int clip_circle(double *x1, double *y1, double *x2, double *y2, const double cx, const double cy, const double radius, double t1, double t2);
187 int clip_triangle(double *x1, double *y1, double *x2, double *y2, const double u, const double v, const int clip_xaxis);
190 long int lnearest(double x);
193 double fmax(const double a, const double b);
194 void minmax_dvector(const double array[], const int pts, double *xmin, double *xmax);
197 void mtx_show(const MTX *mtx);
198 void mtx_prt(const MTX *mtx, FILE *fp);
199 int mtx_prt_elem(const MTX *mtx, FILE *fp, unsigned int x, unsigned int y, unsigned int z);
202 int mtx_get_elem(const MTX *mtx, MTX_ELEM_VAL *me, const int x, const int y, const int z);
203 int mtx_put_elem(MTX *mtx, const MTX_ELEM_VAL *me, unsigned int x, unsigned int y, unsigned int z);
206 int mtx_inp_elem(const char *prompt, MTX_ELEM_VAL *mev, const int dtype);
209 MTX *mtx_init(const unsigned int order, const unsigned int elem_type, const unsigned int nx, const unsigned int ny, const unsigned int nz);
210 MTX *mtx_clr(MTX *mtx);
211 int mtx_free(MTX *mtx);
212 int mtx_elem_size(const int dt);
213 int mtx_check(const MTX *mtx, const char *func_name);
216 double norm_ang(double theta);
219 double simpson(const double xmin, const double xmax, const double *y, const int np);
222 void indent_mtx2(GRFMTX_2D m);
223 void xlat_mtx2(GRFMTX_2D m, const double x, const double y);
224 void scale_mtx2(GRFMTX_2D m, const double sx, const double sy);
225 void rot_mtx2(GRFMTX_2D m, const double theta);
226 void mult_mtx2(GRFMTX_2D m1, GRFMTX_2D m2, GRFMTX_2D result);
227 void xform_mtx2(GRFMTX_2D m, double *x, double *y);
228 void rotate2d(double x[], double y[], int pts, double angle);
229 void xlat2d(double x[], double y[], int pts, double xoffset, double yoffset);
230 void scale2d(double x[], double y[], int pts, double xfact, double yfact);
234 #endif /* __cplusplus */