actual patch for close_ps() [file: geo_ops.c]
От | Gautam H Thaker |
---|---|
Тема | actual patch for close_ps() [file: geo_ops.c] |
Дата | |
Msg-id | 354A1FE6.B6393E12@atl.lmco.com обсуждение исходный текст |
Список | pgsql-hackers |
Opps, did not include the actual patch in my last email: Attached is my patch that fixes the routine close_ps(). I can try to fix other as I run into them, esp. for line when line can be input. I tested my fix with: -- try vertical lseg. select '(1,1)'::point ## '((0,0),(0,2))'::lseg; ?column? -------- (0,1) (1 row) -- try horizontal lseg. select '(1,1)'::point ## '((0,2),(2,2))'::lseg; ?column? -------- (1,2) (1 row) (both of above were returning wrong answers before.) -- Gautam H. Thaker Distributed Processing Lab; Lockheed Martin Adv. Tech. Labs A&E 3W; 1 Federal Street; Camden, NJ 08102 609-338-3907, fax 609-338-4144 email: gthaker@atl.lmco.com *** geo_ops.c Fri May 1 14:41:47 1998 --- geo_ops.c.last Fri May 1 13:43:36 1998 *************** *** 2354,2360 **** * * Some tricky code here, relying on boolean expressions * evaluating to only zero or one to use as an array index. - * bug fixes by gthaker@atl.lmco.com; May 1, 98 */ Point * close_ps(Point *pt, LSEG *lseg) --- 2354,2359 ---- *************** *** 2368,2374 **** result = NULL; xh = lseg->p[0].x < lseg->p[1].x; yh = lseg->p[0].y < lseg->p[1].y; ! /* !xh (or !yh) is the index of lower x( or y) end point of lseg */ /* vertical segment? */ if (lseg_vertical(lseg)) --- 2367,2382 ---- result = NULL; xh = lseg->p[0].x < lseg->p[1].x; yh = lseg->p[0].y < lseg->p[1].y; ! if (pt->x < lseg->p[!xh].x) ! result = point_copy(&lseg->p[!xh]); ! else if (pt->x > lseg->p[xh].x) ! result = point_copy(&lseg->p[xh]); ! else if (pt->y < lseg->p[!yh].y) ! result = point_copy(&lseg->p[!yh]); ! else if (pt->y > lseg->p[yh].y) ! result = point_copy(&lseg->p[yh]); ! if (result != NULL) ! return (result); /* vertical segment? */ if (lseg_vertical(lseg)) *************** *** 2376,2391 **** #ifdef GEODEBUG printf("close_ps- segment is vertical\n"); #endif - /* first check if point is below or above the entire lseg. */ - if (pt->y < lseg->p[!yh].y) - result = point_copy(&lseg->p[!yh]); /* below the lseg */ - else if (pt->y > lseg->p[yh].y) - result = point_copy(&lseg->p[yh]); /* above the lseg */ - if (result != NULL) - return (result); - - /* point lines along (to left or right) of the vertical lseg. */ - result = palloc(sizeof(*result)); result->x = lseg->p[0].x; result->y = pt->y; --- 2384,2389 ---- *************** *** 2396,2410 **** #ifdef GEODEBUG printf("close_ps- segment is horizontal\n"); #endif - /* first check if point is left or right of the entire lseg. */ - if (pt->x < lseg->p[!xh].x) - result = point_copy(&lseg->p[!xh]); /* left of the lseg */ - else if (pt->x > lseg->p[xh].x) - result = point_copy(&lseg->p[xh]); /* right of the lseg */ - if (result != NULL) - return (result); - - /* point lines along (at top or below) the horiz. lseg. */ result = palloc(sizeof(*result)); result->x = pt->x; result->y = lseg->p[0].y; --- 2394,2399 ----
В списке pgsql-hackers по дате отправления: