00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "CouenneTypes.hpp"
00012 #include "CouennePrecisions.hpp"
00013
00014
00015 namespace Couenne {
00016
00017
00018
00019
00020
00021
00022 CouNumber project (CouNumber a, CouNumber b, CouNumber c,
00023 CouNumber x0, CouNumber y0,
00024 CouNumber lb, CouNumber ub, int sign,
00025 CouNumber *xp, CouNumber *yp) {
00026
00027
00028 register CouNumber
00029 t = - (a*x0 + b*y0 + c);
00030
00031
00032 CouNumber xpr, ypr;
00033
00034
00035 if (fabs (t) < COUENNE_EPS) return 0.;
00036
00037
00038 if (sign > 0) {if (t < 0.) return 0.;}
00039 else if (sign < 0) {if (t > 0.) return 0.;}
00040
00041
00042 t /= sqrt (a*a + b*b);
00043
00044
00045 xpr = x0 + a*t;
00046 ypr = y0 + b*t;
00047
00048
00049 if (t < 0.) t = -t;
00050
00051
00052
00053 if ((xpr < lb) || (xpr > ub)) {
00054
00055 if (xpr < lb) xpr = lb;
00056 else if (xpr > ub) xpr = ub;
00057
00058 ypr = (- c - a * xpr) / b - y0;
00059 xpr -= x0;
00060
00061 t = sqrt (xpr * xpr + ypr * ypr);
00062 }
00063
00064
00065 if (xp) *xp = xpr;
00066 if (yp) *yp = ypr;
00067
00068
00069 return t;
00070 }
00071
00072
00078 CouNumber projectSeg (CouNumber x0, CouNumber y0,
00079 CouNumber x1, CouNumber y1,
00080 CouNumber x2, CouNumber y2,
00081 int sign,
00082 CouNumber *xp, CouNumber *yp) {
00083 CouNumber
00084 dx = x2-x1,
00085 dy = y2-y1,
00086 a = -dy,
00087 b = dx,
00088 c = x1*dy - y1*dx;
00089
00090 return project (a, b, c, x0, y0, x1, x2, sign, xp, yp);
00091 }
00092
00093 }
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118