PostGIS  2.5.7dev-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 1083 of file measures.c.

1084 {
1085  uint32_t t;
1086  const POINT2D *A1;
1087  const POINT2D *A2;
1088  const POINT2D *A3;
1089  int twist = dl->twisted;
1090 
1091  LWDEBUG(2, "lw_dist2d_pt_ptarrayarc is called");
1092 
1093  if ( pa->npoints % 2 == 0 || pa->npoints < 3 )
1094  {
1095  lwerror("lw_dist2d_pt_ptarrayarc called with non-arc input");
1096  return LW_FALSE;
1097  }
1098 
1099  if (dl->mode == DIST_MAX)
1100  {
1101  lwerror("lw_dist2d_pt_ptarrayarc does not currently support DIST_MAX mode");
1102  return LW_FALSE;
1103  }
1104 
1105  A1 = getPoint2d_cp(pa, 0);
1106 
1107  if ( ! lw_dist2d_pt_pt(p, A1, dl) )
1108  return LW_FALSE;
1109 
1110  for ( t=1; t<pa->npoints; t += 2 )
1111  {
1112  dl->twisted = twist;
1113  A2 = getPoint2d_cp(pa, t);
1114  A3 = getPoint2d_cp(pa, t+1);
1115 
1116  if ( lw_dist2d_pt_arc(p, A1, A2, A3, dl) == LW_FALSE )
1117  return LW_FALSE;
1118 
1119  if ( dl->distance <= dl->tolerance && dl->mode == DIST_MIN )
1120  return LW_TRUE; /*just a check if the answer is already given*/
1121 
1122  A1 = A3;
1123  }
1124 
1125  return LW_TRUE;
1126 }
#define LW_FALSE
Definition: liblwgeom.h:77
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:76
const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition: lwgeom_api.c:374
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
int lw_dist2d_pt_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, DISTPTS *dl)
Definition: measures.c:1439
int lw_dist2d_pt_pt(const POINT2D *thep1, const POINT2D *thep2, DISTPTS *dl)
Compares incoming points and stores the points closest to each other or most far away from each other...
Definition: measures.c:2282
#define DIST_MIN
Definition: measures.h:44
#define DIST_MAX
Definition: measures.h:43
int twisted
Definition: measures.h:55
double tolerance
Definition: measures.h:56
int mode
Definition: measures.h:54
double distance
Definition: measures.h:51
uint32_t npoints
Definition: liblwgeom.h:374
unsigned int uint32_t
Definition: uthash.h:78

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().

Here is the call graph for this function:
Here is the caller graph for this function: