2 * $Header: /cvsroot/pgsql/src/test/regress/regress.c,v 1.8 1997/08/12 22:55:25 momjian Exp $
5 #include <float.h> /* faked on sunos */
7 #include <string.h> /* for memset() */
11 #include "utils/geo_decls.h" /* includes <math.h> */
12 #include "executor/executor.h" /* For GetAttributeByName */
21 extern double *regress_dist_ptpath (Point *pt, PATH *path);
22 extern double *regress_path_dist (PATH *p1, PATH *p2);
23 extern PATH *poly2path (POLYGON *poly);
24 extern Point *interpt_pp (PATH *p1, PATH *p2);
25 extern void regress_lseg_construct (LSEG *lseg, Point *pt1, Point *pt2);
26 extern char overpaid (TUPLE tuple);
27 extern int boxarea (BOX *box);
28 extern char *reverse_c16 (char *string);
31 ** Distance from a point to a path
34 regress_dist_ptpath(pt, path)
45 result = PALLOCTYPE(double);
46 *result = Abs((double) DBL_MAX); /* +infinity */
49 result = point_distance(pt, &path->p[0]);
53 * the distance from a point to a path is the smallest distance
54 * from the point to any of its constituent segments.
56 Assert(path->npts > 1);
57 result = PALLOCTYPE(double);
58 for (i = 0; i < path->npts - 1; ++i) {
59 regress_lseg_construct(&lseg, &path->p[i], &path->p[i+1]);
60 tmp = dist_ps(pt, &lseg);
61 if (i == 0 || *tmp < *result)
71 /* this essentially does a cartesian product of the lsegs in the
72 two paths, and finds the min distance between any two lsegs */
74 regress_path_dist(p1, p2)
82 regress_lseg_construct(&seg1, &p1->p[0], &p1->p[1]);
83 regress_lseg_construct(&seg2, &p2->p[0], &p2->p[1]);
84 min = lseg_distance(&seg1, &seg2);
86 for (i = 0; i < p1->npts - 1; i++)
87 for (j = 0; j < p2->npts - 1; j++)
89 regress_lseg_construct(&seg1, &p1->p[i], &p1->p[i+1]);
90 regress_lseg_construct(&seg2, &p2->p[j], &p2->p[j+1]);
92 if (*min < *(tmp = lseg_distance(&seg1, &seg2)))
105 char *output = (char *)PALLOC(2*(P_MAXDIG + 1)*poly->npts + 64);
106 char buf[2*(P_MAXDIG)+20];
108 sprintf(output, "(1, %*d", P_MAXDIG, poly->npts);
110 for (i=0; i<poly->npts; i++)
112 sprintf(buf, ",%*g,%*g", P_MAXDIG, poly->p[i].x, P_MAXDIG, poly->p[i].y);
116 sprintf(buf, "%c", RDELIM);
118 return(path_in(output));
121 /* return the point where two paths intersect. Assumes that they do. */
134 bool found; /* We've found the intersection */
136 found = false; /* Haven't found it yet */
138 for (i = 0; i < p1->npts - 1 && !found; i++)
139 for (j = 0; j < p2->npts - 1 && !found; j++)
141 regress_lseg_construct(&seg1, &p1->p[i], &p1->p[i+1]);
142 regress_lseg_construct(&seg2, &p2->p[j], &p2->p[j+1]);
143 if (lseg_intersect(&seg1, &seg2)) found = true;
147 ln = line_construct_pp(&seg2.p[0], &seg2.p[1]);
148 retval = interpt_sl(&seg1, ln);
150 retval = lseg_interpt( &seg1, &seg2);
156 /* like lseg_construct, but assume space already allocated */
158 regress_lseg_construct(lseg, pt1, pt2)
163 lseg->p[0].x = pt1->x;
164 lseg->p[0].y = pt1->y;
165 lseg->p[1].x = pt2->x;
166 lseg->p[1].y = pt2->y;
167 lseg->m = point_sl(pt1, pt2);
177 salary = (long)GetAttributeByName(tuple, "salary", &isnull);
178 return(salary > 699);
182 * This used to be "circle", but I added circle to builtins,
183 * so needed to make sure the names do not collide. - tgl 97/04/21
191 extern WIDGET *widget_in (char *str);
192 extern char *widget_out (WIDGET *widget);
193 extern int pt_in_widget (Point *point, WIDGET *widget);
201 char *p, *coord[NARGS], buf2[1000];
207 for (i = 0, p = str; *p && i < NARGS && *p != RDELIM; p++)
208 if (*p == ',' || (*p == LDELIM && !i))
212 result = (WIDGET *) palloc(sizeof(WIDGET));
213 result->center.x = atof(coord[0]);
214 result->center.y = atof(coord[1]);
215 result->radius = atof(coord[2]);
217 sprintf(buf2, "widget_in: read (%f, %f, %f)\n", result->center.x,
218 result->center.y,result->radius);
231 result = (char *) palloc(60);
232 sprintf(result, "(%g,%g,%g)",
233 widget->center.x, widget->center.y, widget->radius);
238 pt_in_widget(point, widget)
242 extern double point_dt();
244 return( point_dt(point, &widget->center) < widget->radius );
247 #define ABS(X) ((X) > 0 ? (X) : -(X))
257 width = ABS(box->high.x - box->low.x);
258 height = ABS(box->high.y - box->low.y);
259 return (width * height);
270 if (!(new_string = palloc(16))) {
271 fprintf(stderr, "reverse_c16: palloc failed\n");
274 memset(new_string, 0, 16);
275 for (i = 0; i < 16 && string[i]; ++i)
277 if (i == 16 || !string[i])
281 new_string[len-i] = string[i];