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 по дате отправления:

Предыдущее
От: "Park, Chul-Su"
Дата:
Сообщение: [Q] exit(0) in C examples
Следующее
От: Brett McCormickS
Дата:
Сообщение: rule/notify bug?