PostGIS  3.2.2dev-r@@SVN_REVISION@@

◆ lw_dist2d_pre_seg_seg()

int lw_dist2d_pre_seg_seg ( POINTARRAY l1,
POINTARRAY l2,
LISTSTRUCT list1,
LISTSTRUCT list2,
double  k,
DISTPTS dl 
)

preparation before lw_dist2d_seg_seg.

Definition at line 2070 of file measures.c.

2071 {
2072  const POINT2D *p1, *p2, *p3, *p4, *p01, *p02;
2073  int pnr1, pnr2, pnr3, pnr4, n1, n2, i, u, r, twist;
2074  double maxmeasure;
2075  n1 = l1->npoints;
2076  n2 = l2->npoints;
2077 
2078  LWDEBUG(2, "lw_dist2d_pre_seg_seg is called");
2079 
2080  p1 = getPoint2d_cp(l1, list1[0].pnr);
2081  p3 = getPoint2d_cp(l2, list2[0].pnr);
2082  lw_dist2d_pt_pt(p1, p3, dl);
2083  maxmeasure = sqrt(dl->distance * dl->distance + (dl->distance * dl->distance * k * k));
2084  twist = dl->twisted; /*to keep the incoming order between iterations*/
2085  for (i = (n1 - 1); i >= 0; --i)
2086  {
2087  /*we break this iteration when we have checked every point closer to our perpendicular "checkline" than
2088  * our shortest found distance*/
2089  if (((list2[0].themeasure - list1[i].themeasure)) > maxmeasure)
2090  break;
2091  /*because we are not iterating in the original point order we have to check the segment before and after
2092  * every point*/
2093  for (r = -1; r <= 1; r += 2)
2094  {
2095  pnr1 = list1[i].pnr;
2096  p1 = getPoint2d_cp(l1, pnr1);
2097  if (pnr1 + r < 0)
2098  {
2099  p01 = getPoint2d_cp(l1, (n1 - 1));
2100  if ((p1->x == p01->x) && (p1->y == p01->y))
2101  pnr2 = (n1 - 1);
2102  else
2103  pnr2 = pnr1; /* if it is a line and the last and first point is not the same we
2104  avoid the edge between start and end this way*/
2105  }
2106 
2107  else if (pnr1 + r > (n1 - 1))
2108  {
2109  p01 = getPoint2d_cp(l1, 0);
2110  if ((p1->x == p01->x) && (p1->y == p01->y))
2111  pnr2 = 0;
2112  else
2113  pnr2 = pnr1; /* if it is a line and the last and first point is not the same we
2114  avoid the edge between start and end this way*/
2115  }
2116  else
2117  pnr2 = pnr1 + r;
2118 
2119  p2 = getPoint2d_cp(l1, pnr2);
2120  for (u = 0; u < n2; ++u)
2121  {
2122  if (((list2[u].themeasure - list1[i].themeasure)) >= maxmeasure)
2123  break;
2124  pnr3 = list2[u].pnr;
2125  p3 = getPoint2d_cp(l2, pnr3);
2126  if (pnr3 == 0)
2127  {
2128  p02 = getPoint2d_cp(l2, (n2 - 1));
2129  if ((p3->x == p02->x) && (p3->y == p02->y))
2130  pnr4 = (n2 - 1);
2131  else
2132  pnr4 = pnr3; /* if it is a line and the last and first point is not the
2133  same we avoid the edge between start and end this way*/
2134  }
2135  else
2136  pnr4 = pnr3 - 1;
2137 
2138  p4 = getPoint2d_cp(l2, pnr4);
2139  dl->twisted = twist;
2140  if (!lw_dist2d_selected_seg_seg(p1, p2, p3, p4, dl))
2141  return LW_FALSE;
2142 
2143  if (pnr3 >= (n2 - 1))
2144  {
2145  p02 = getPoint2d_cp(l2, 0);
2146  if ((p3->x == p02->x) && (p3->y == p02->y))
2147  pnr4 = 0;
2148  else
2149  pnr4 = pnr3; /* if it is a line and the last and first point is not the
2150  same we avoid the edge between start and end this way*/
2151  }
2152 
2153  else
2154  pnr4 = pnr3 + 1;
2155 
2156  p4 = getPoint2d_cp(l2, pnr4);
2157  dl->twisted = twist; /*we reset the "twist" for each iteration*/
2158  if (!lw_dist2d_selected_seg_seg(p1, p2, p3, p4, dl))
2159  return LW_FALSE;
2160  /*here we "translate" the found mindistance so it can be compared to our "z"-values*/
2161  maxmeasure = sqrt(dl->distance * dl->distance + (dl->distance * dl->distance * k * k));
2162  }
2163  }
2164  }
2165 
2166  return LW_TRUE;
2167 }
char * r
Definition: cu_in_wkt.c:24
#define LW_FALSE
Definition: liblwgeom.h:108
#define LW_TRUE
Return types for functions with status returns.
Definition: liblwgeom.h:107
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:83
static const POINT2D * getPoint2d_cp(const POINTARRAY *pa, uint32_t n)
Returns a POINT2D pointer into the POINTARRAY serialized_ptlist, suitable for reading from.
Definition: lwinline.h:101
int lw_dist2d_selected_seg_seg(const POINT2D *A, const POINT2D *B, const POINT2D *C, const POINT2D *D, DISTPTS *dl)
This is the same function as lw_dist2d_seg_seg but without any calculations to determine intersection...
Definition: measures.c:2175
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:2274
int twisted
Definition: measures.h:55
double distance
Definition: measures.h:51
int pnr
Definition: measures.h:62
double y
Definition: liblwgeom.h:404
double x
Definition: liblwgeom.h:404
uint32_t npoints
Definition: liblwgeom.h:441

References DISTPTS::distance, getPoint2d_cp(), lw_dist2d_pt_pt(), lw_dist2d_selected_seg_seg(), LW_FALSE, LW_TRUE, LWDEBUG, POINTARRAY::npoints, LISTSTRUCT::pnr, r, DISTPTS::twisted, POINT2D::x, and POINT2D::y.

Referenced by lw_dist2d_fast_ptarray_ptarray().

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