PostGIS  2.5.2dev-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.

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

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 }
int mode
Definition: measures.h:54
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
unsigned int uint32_t
Definition: uthash.h:78
double tolerance
Definition: measures.h:56
#define DIST_MIN
Definition: measures.h:44
#define LW_FALSE
Definition: liblwgeom.h:76
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:75
int lw_dist2d_pt_arc(const POINT2D *P, const POINT2D *A1, const POINT2D *A2, const POINT2D *A3, DISTPTS *dl)
Definition: measures.c:1439
int twisted
Definition: measures.h:55
double distance
Definition: measures.h:51
#define DIST_MAX
Definition: measures.h:43
void lwerror(const char *fmt,...)
Write a notice out to the error handler.
Definition: lwutil.c:190
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:2281
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
uint32_t npoints
Definition: liblwgeom.h:373
Here is the call graph for this function:
Here is the caller graph for this function: