PostGIS  2.2.8dev-r@@SVN_REVISION@@

◆ lw_dist2d_pt_ptarrayarc()

int lw_dist2d_pt_ptarrayarc ( const POINT2D p,
const POINTARRAY pa,
DISTPTS dl 
)

Search all the arcs of pointarray to see which one is closest to p1 Returns minimum distance between point and arc pointarray.

Definition at line 1065 of file measures.c.

References DIST_MAX, DIST_MIN, DISTPTS::distance, getPoint2d_cp(), lw_dist2d_pt_arc(), lw_dist2d_pt_pt(), LW_FALSE, LW_TRUE, LWDEBUG, lwerror(), DISTPTS::mode, POINTARRAY::npoints, DISTPTS::tolerance, and DISTPTS::twisted.

Referenced by lw_dist2d_point_circstring(), and test_lw_dist2d_pt_ptarrayarc().

1066 {
1067  int t;
1068  const POINT2D *A1;
1069  const POINT2D *A2;
1070  const POINT2D *A3;
1071  int twist = dl->twisted;
1072 
1073  LWDEBUG(2, "lw_dist2d_pt_ptarrayarc is called");
1074 
1075  if ( pa->npoints % 2 == 0 || pa->npoints < 3 )
1076  {
1077  lwerror("lw_dist2d_pt_ptarrayarc called with non-arc input");
1078  return LW_FALSE;
1079  }
1080 
1081  if (dl->mode == DIST_MAX)
1082  {
1083  lwerror("lw_dist2d_pt_ptarrayarc does not currently support DIST_MAX mode");
1084  return LW_FALSE;
1085  }
1086 
1087  A1 = getPoint2d_cp(pa, 0);
1088 
1089  if ( ! lw_dist2d_pt_pt(p, A1, dl) )
1090  return LW_FALSE;
1091 
1092  for ( t=1; t<pa->npoints; t += 2 )
1093  {
1094  dl->twisted = twist;
1095  A2 = getPoint2d_cp(pa, t);
1096  A3 = getPoint2d_cp(pa, t+1);
1097 
1098  if ( lw_dist2d_pt_arc(p, A1, A2, A3, dl) == LW_FALSE )
1099  return LW_FALSE;
1100 
1101  if ( dl->distance <= dl->tolerance && dl->mode == DIST_MIN )
1102  return LW_TRUE; /*just a check if the answer is already given*/
1103 
1104  A1 = A3;
1105  }
1106 
1107  return LW_TRUE;
1108 }
int npoints
Definition: liblwgeom.h:355
int mode
Definition: measures.h:27
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:50
double tolerance
Definition: measures.h:29
#define DIST_MIN
Definition: measures.h:17
#define LW_FALSE
Definition: liblwgeom.h:62
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, int n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from...
Definition: lwgeom_api.c:472
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:61
int lw_dist2d_pt_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, DISTPTS *dl)
Definition: measures.c:1421
int twisted
Definition: measures.h:28
double distance
Definition: measures.h:24
#define DIST_MAX
Definition: measures.h:16
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:74
int lw_dist2d_pt_pt(const POINT2D *thep1, const POINT2D *thep2, DISTPTS *dl)
Compares incomming points and stores the points closest to each other or most far away from each othe...
Definition: measures.c:2266
Here is the call graph for this function:
Here is the caller graph for this function: