X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=include%2Fkmath.h;h=e4c577b928a6b76f2329daba594f2da9f07705cc;hb=63ddd1048df804cc73f21c1cdaf70f32324d0197;hp=636339a33483a97495b76f910f7758d56a12a16c;hpb=13838bda88b63a2535b5baaf7197006767de4b8e;p=ctsim.git diff --git a/include/kmath.h b/include/kmath.h index 636339a..e4c577b 100644 --- a/include/kmath.h +++ b/include/kmath.h @@ -1,17 +1,29 @@ -/****************************************************************************** - * - * FILE IDENTIFICATION - * - * File Name: NUMR.H - * Author: Kevin Rosenberg - * Purpose: Header file containing definitions for numerical app's - * Date Started: Nov 84 - * - * DESCRIPTION - * - * MODIFICATION LOG - * - *****************************************************************************/ +/***************************************************************************** +** FILE IDENTIFICATION +** +** Name: kmath.h +** Purpose: Header file containing definitions for numerical app +** Programmer: Kevin Rosenberg +** Date Started: Nov 84 +** +** This is part of the CTSim program +** Copyright (C) 1983-2000 Kevin Rosenberg +** +** $Id: kmath.h,v 1.16 2000/06/19 15:48:23 kevin Exp $ +** +** This program is free software; you can redistribute it and/or modify +** it under the terms of the GNU General Public License (version 2) as +** published by the Free Software Foundation. +** +** 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 General Public License for more details. +** +** You should have received a copy of the GNU General Public License +** along with this program; if not, write to the Free Software +** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************************/ #ifndef _H_kmath #define _H_kmath @@ -31,158 +43,70 @@ #define F_EPSILON 1.0E-6 #define D_EPSILON 1.0E-10 -#define DEG_TO_RAD(x) (x*(PI/180.)) -#define RAD_TO_DEG(x) (x*(180./PI)) - - #define ASSUMEDZERO 1E-10 -/* codes for C data types */ - -#define DT_CHAR 1 -#define DT_INT 2 -#define DT_LONG 3 -#define DT_FLOAT 4 -#define DT_DOUBLE 5 -#define DT_STRING 6 - -typedef char *CMTX_1D; -typedef CMTX_1D *CMTX_2D; -typedef CMTX_2D *CMTX_3D; - -typedef int *IMTX_1D; -typedef IMTX_1D *IMTX_2D; -typedef IMTX_2D *IMTX_3D; - -typedef float *FMTX_1D; -typedef FMTX_1D *FMTX_2D; -typedef FMTX_2D *FMTX_3D; - -typedef double *DMTX_1D; -typedef DMTX_1D *DMTX_2D; -typedef DMTX_2D *DMTX_3D; - -union elem_val_un { /* holds an element value */ - char c; - int i; - long int l; - float f; - double d; -}; - -typedef union elem_val_un MTX_ELEM_VAL; - - -union elem_ptr_un { /* holds a pointer to a 1D vector of any type */ - char *c; - int *i; - long int *l; - float *f; - double *d; -}; - -typedef union elem_ptr_un MTX_1D; -typedef MTX_1D *MTX_2D; -typedef MTX_2D *MTX_3D; - -union mtx_val_ptr_un { /* pointer to matrix values */ - MTX_1D m1; - MTX_2D m2; - MTX_3D m3; -}; - -typedef union mtx_val_ptr_un MTX_PTR; - -struct matrix_st { - unsigned int order; /* order, or dimension, of matrix */ - unsigned int elemtype; /* element type */ - unsigned int elemsize; /* size of element in bytes */ - unsigned int nx, ny, nz; /* size of matrix in each dimension */ - MTX_PTR val; /* pointer to matrix values */ -}; - -typedef struct matrix_st MTX; -typedef struct matrix_st *MTXP; - -/* DEFINITION IDENTIFICATION - * - * Definitions to access a matrix element from an matrix - * - -#define me1(mtx,x)\ - (mtx->elemtype == DT_FLOAT ? mtx->val.m1.f[x] :\ - (mtx->elemtype == DT_DOUBLE ? mtx->val.m1.d[x] :\ - (mtx->elemtype == DT_INT ? mtx->val.m1.i[x] :\ - (mtx->elemtype == DT_LONG ? mtx->val.m1.l[x] :\ - (mtx->elemtype == DT_CHAR ? mtx->val.m1.c[x] :\ - 0\ - ))))) - -#define me2(mtx,x,y)\ - (mtx->elemtype == DT_FLOAT ? mtx->val.m2[x].f[y] :\ - (mtx->elemtype == DT_DOUBLE ? mtx->val.m2[x].d[y] :\ - (mtx->elemtype == DT_INT ? mtx->val.m2[x].i[y] :\ - (mtx->elemtype == DT_LONG ? mtx->val.m2[x].l[y] :\ - (mtx->elemtype == DT_CHAR ? mtx->val.m2[x].c[y] :\ - 0\ - ))))) - - -#define me3(mtx,x,y,z)\ - (mtx->elemtype == DT_FLOAT ? mtx->val.m3[x][y].f[z] :\ - (mtx->elemtype == DT_DOUBLE ? mtx->val.m3[x][y].d[z] :\ - (mtx->elemtype == DT_INT ? mtx->val.m3[x][y].i[z] :\ - (mtx->elemtype == DT_LONG ? mtx->val.m3[x][y].l[z] :\ - (mtx->elemtype == DT_CHAR ? mtx->val.m3[x][y].c[z] :\ - 0\ - ))))) -*/ - - -/* calc_x.c */ -int calc_x(double *x, const double xmin, const double xmax, const int n); -/* calcpoly.c */ -void calcpoly(const double *a, const int degree, const double *x, double *y, const int n); -/* gauss.c */ -int gauss(double **a, double *b, double *x, const int num); -/* lnearest.c */ -long int lnearest(double x); -/* lsfit.c */ -int lsfit(double *x, double *y, int n, int degree, double *coeff, FILE *fp); -/* matprt.c */ -void matprt(const double **m, const int row, const int col, FILE *fp); -/* mtx_disp.c */ -void mtx_show(const MTX *mtx); -void mtx_prt(const MTX *mtx, FILE *fp); -int mtx_prt_elem(const MTX *mtx, FILE *fp, unsigned int x, unsigned int y, unsigned int z); -/* mtx_elem.c */ -int mtx_get_elem(const MTX *mtx, MTX_ELEM_VAL *me, const int x, const int y, const int z); -int mtx_put_elem(MTX *mtx, const MTX_ELEM_VAL *me, unsigned int x, unsigned int y, unsigned int z); -/* mtx_inp.c */ -int mtx_inp_elem(const char *prompt, MTX_ELEM_VAL *mev, const int dtype); -/* mtx_main.c */ -MTX *mtx_init(const unsigned int order, const unsigned int elem_type, const unsigned int nx, const unsigned int ny, const unsigned int nz); -MTX *mtx_clr(MTX *mtx); -int mtx_free(MTX *mtx); -int mtx_elem_size(const int dt); -int mtx_check(const MTX *mtx, const char *func_name); -/* norm_ang.c */ -double norm_ang(double theta); -/* pntprt.c */ -void pntprt(const double *x, const double *y, const int n, FILE *fp); -/* pntread.c */ -int pntread(double *x, double *y, int *num, const int maxn, FILE *fp); -/* poly.c */ -double poly(const double *a, const int degree, const double x); -/* simpson.c */ -double simpson(const double xmin, const double xmax, const double *y, const int np); -/* stddev.c */ -double stddev(const double *y1, const double *y2, const int n, const int df_lost); -/* vectprt.c */ -void vectprt(const double *v, const int n, FILE *fp); -/* vectread.c */ -int vectread(double *v, int *n, const int maxn, FILE *fp); -/* vectsort.c */ -int vectsort(int num_vec, const int dtype, const int num_pts, char *vec1, char *vec2, char *vec3); +typedef double GRFMTX_2D[3][3]; +typedef double GRFMTX_3D[4][4]; + +inline double +convertDegreesToRadians (double x) +{ return (x * (PI/180.)); } + +inline double +convertRadiansToDegrees (double x) +{ return (x*(180./PI)); } + +template +inline T nearest (double x) +{ return (x > 0 ? static_cast(x+0.5) : static_cast(x-0.5)); } + +template +inline T clamp (T value, T lowerBounds, T upperBounds) +{ return (value >= upperBounds ? upperBounds : (value <= lowerBounds ? lowerBounds : value )); } + +template +inline T lineLength (T x1, T y1, T x2, T y2) +{ return static_cast( sqrt ((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)) ); } + +template +inline void minmax_array (const T* array, const int n, T& min, T& max) +{ + max = min = array[0]; + + for (int i = 1; i < n; i++) + if (array[i] < min) + min = array[i]; + else if (array[i] > max) + max = array[i]; +} + + +////////////////////////////////////////////////////////////// +// FUNTION DECLARATIONS +////////////////////////////////////////////////////////////// + +// clip.cpp +int clip_rect(double& x1, double& y1, double& x2, double& y2, const double rect[4]); +int clip_segment(double& x1, double& y1, double& x2, double& y2, const double u, const double v); +int clip_sector(double& x1, double& y1, double& x2, double& y2, const double u, const double v); +int clip_circle(double& x1, double& y1, double& x2, double& y2, const double cx, const double cy, const double radius, double t1, double t2); +int clip_triangle(double& x1, double& y1, double& x2, double& y2, const double u, const double v, const int clip_xaxis); + +// norm_ang.cpp +double norm_ang (double theta); + +// xform.cpp +void indent_mtx2(GRFMTX_2D m); +void xlat_mtx2(GRFMTX_2D m, const double x, const double y); +void scale_mtx2(GRFMTX_2D m, const double sx, const double sy); +void rot_mtx2(GRFMTX_2D m, const double theta); +void mult_mtx2(GRFMTX_2D m1, GRFMTX_2D m2, GRFMTX_2D result); +void xform_mtx2(GRFMTX_2D m, double& x, double& y); +void rotate2d(double x[], double y[], int pts, double angle); +void xlat2d(double x[], double y[], int pts, double xoffset, double yoffset); +void scale2d(double x[], double y[], int pts, double xfact, double yfact); + +// simpson.cpp +double integrateSimpson (const double xmin, const double xmax, const double *y, const int np); #endif