00001
00002
00003
00004
00005
00006
00007 #include "xymath.h"
00008 #include <stdlib.h>
00009
00010 const char* xy_id_xymath_cpp="$Id: xymath.cpp,v 1.13 2002/01/23 16:10:20 clinio Exp $";
00011 static double Tol = 1e-7;
00012
00013 int mtDecade(double val)
00014 {
00015 double l = log10(val);
00016 return (int)floor(l);
00017 }
00018
00019 double mtTolerance(double v)
00020 {
00021 double oldtol = Tol;
00022 Tol = v;
00023 return oldtol;
00024 }
00025
00026
00027 xybool mtEqual(double v1, double v2)
00028 {
00029 return (fabs(v2 - v1) < Tol);
00030 }
00031
00032
00033 xybool mtEqual(double v1, double v2, double tol)
00034 {
00035 return (fabs(v2 - v1) < tol);
00036 }
00037
00038
00039 xybool mtLessEqual(double v1, double v2, double tol)
00040 {
00041 return (v1<v2) || mtEqual(v1, v2, tol);
00042 }
00043
00044
00045 xybool mtLessEqual(double v1, double v2)
00046 {
00047 return (v1<v2) || mtEqual(v1, v2);
00048 }
00049
00050
00051 double mtDistance(double x0, double y0, double x1, double y1)
00052 {
00053 return sqrt(fabs((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)));
00054 }
00055
00056
00057 double mtDistance(int x0, int y0, int x1, int y1)
00058 {
00059 return sqrt((double) abs((x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)));
00060 }
00061
00062
00063 void mtRotate(double xi, double yi, double angle, double* xr, double* yr)
00064 {
00065 *xr = xi * cos(angle) - yi * sin(angle);
00066 *yr = xi * sin(angle) + yi * cos(angle);
00067 }
00068
00069
00070 void mtRotate(int xi, int yi, double angle, int* xr, int* yr)
00071 {
00072 *xr = (int) (xi * cos(angle) - yi * sin(angle));
00073 *yr = (int) (xi * sin(angle) + yi * cos(angle));
00074 }
00075
00076
00077 xybool mtIntercept(double xmin1, double ymin1, double xmax1, double ymax1,
00078 double xmin2, double ymin2, double xmax2, double ymax2)
00079 {
00080 if (xmin1 > xmax2) return 0;
00081 else if (xmax1 < xmin2) return 0;
00082 else if (ymin1 > ymax2) return 0;
00083 else if (ymax1 < ymin2) return 0;
00084 else return 1;
00085 }
00086
00087
00088 xybool mtIntercept(int xmin1, int ymin1, int xmax1, int ymax1,
00089 int xmin2, int ymin2, int xmax2, int ymax2)
00090 {
00091 if (xmin1 > xmax2) return 0;
00092 else if (xmax1 < xmin2) return 0;
00093 else if (ymin1 > ymax2) return 0;
00094 else if (ymax1 < ymin2) return 0;
00095 else return 1;
00096 }
00097
00098
00099 xybool mtInclude(double xmin1, double ymin1, double xmax1, double ymax1,
00100 double xmin2, double ymin2, double xmax2, double ymax2)
00101 {
00102 if ((xmin2 < xmin1) && (xmax1 < xmax2) && (ymin2 < ymin1) &&
00103 (ymax1 < ymax2))
00104 return xytrue;
00105 else
00106 return xyfalse;
00107 }
00108
00109
00110 xybool mtInclude(int xmin1, int ymin1, int xmax1, int ymax1,
00111 int xmin2, int ymin2, int xmax2, int ymax2)
00112 {
00113 if ((xmin2 < xmin1) && (xmax1 < xmax2) && (ymin2 < ymin1) &&
00114 (ymax1 < ymax2))
00115 return xytrue;
00116 else
00117 return xyfalse;
00118 }
00119
00120
00121 xybool mtPointInRect(int px, int py, int x1, int y1, int x2, int y2)
00122 {
00123 return ((x1 <= px) && (px <= x2) && (y1 <= py) && (py <= y2));
00124 }
00125
00126
00127 xybool mtPointInRect(double px, double py, double x1, double y1,
00128 double x2, double y2)
00129 {
00130 return ((x1 <= px) && (px <= x2) && (y1 <= py) && ( py <= y2));
00131 }
00132
00133
00134 xybool mtPointInLine(double px, double py, double x1, double y1,double x2, double y2)
00135 {
00136 if ((x1 < px) && (px < x2))
00137 return mtEqual((y2 - y1) / (x2 - x1) * (px - x1) + y1, py);
00138 else
00139 return xyfalse;
00140 }
00141
00142
00143 xybool mtPointInLineEx(int px, int py, int x1, int y1, int x2, int y2)
00144 {
00145
00146 double sz = mtDistance((double)x1, (double)y1, (double)x2, (double)y2);
00147
00148
00149 if ( sz <= 1.0 )
00150 return mtPointInsideCircle(px, py, x1, y1, (int)Tol);
00151
00152
00153 double dx = (x2 - x1)/sz;
00154 double dy = (y2 - y1)/sz;
00155 double nx = dy;
00156 double ny = -dx;
00157
00158
00159 double dist = (px - x1)*nx + (py - y1)*ny;
00160
00161
00162 if (mtEqual(dist,0.0))
00163 {
00164
00165 double proj = (px - x1)*dx + (py - y1)*dy;
00166
00167
00168 if (proj > 0.0 && proj < sz)
00169 return xytrue;
00170 }
00171
00172 return xyfalse;
00173 }
00174
00175
00176 xybool mtPointInLineEx(double px, double py, double x1, double y1,double x2, double y2)
00177 {
00178
00179 double sz = mtDistance(x1, y1, x2, y2);
00180
00181
00182 double dx = (x2 - x1)/sz;
00183 double dy = (y2 - y1)/sz;
00184 double nx = dy;
00185 double ny = -dx;
00186
00187
00188 double dist = (px - x1)*nx + (py - y1)*ny;
00189
00190
00191 if (mtEqual(dist,0))
00192 {
00193
00194 double proj = (px - x1)*dx + (py - y1)*dy;
00195
00196
00197 if (proj > 0.0 && proj < sz)
00198 return xytrue;
00199 }
00200
00201 return xyfalse;
00202 }
00203
00204
00205 xybool mtPointInMark(int px, int py, int x1, int y1, int tol)
00206 {
00207
00208 int xmn = x1 - tol;
00209 int xmx = x1 + tol;
00210 int ymn = y1 - tol;
00211 int ymx = y1 + tol;
00212
00213 if ((xmn < px) && (px < xmx) && (ymn < py) && (py < ymx))
00214 return xytrue;
00215 else
00216 return xyfalse;
00217 }
00218
00219
00220
00221 xybool mtPointInsideCircle (int px, int py, int cx, int cy, int radius)
00222 {
00223 double dist = mtDistance ((double)px, (double)py, (double)cx, (double)cy);
00224
00225 if ( dist < radius )
00226 return xytrue;
00227
00228 return xyfalse;
00229 }
00230
00231
00232 xybool mtPointInCircle (int px, int py, int x0, int y0, int x1, int y1)
00233 {
00234
00235 double radius = mtDistance (x0, y0, x1, y1);
00236
00237
00238 double distance = mtDistance (x0, y0, px, py);
00239
00240
00241
00242 if (mtEqual(distance, radius))
00243 return xytrue;
00244
00245 return xyfalse;
00246 }
00247