PostGIS  2.2.8dev-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 2057 of file measures.c.

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

Referenced by lw_dist2d_fast_ptarray_ptarray().

2058 {
2059  const POINT2D *p1, *p2, *p3, *p4, *p01, *p02;
2060  int pnr1,pnr2,pnr3,pnr4, n1, n2, i, u, r, twist;
2061  double maxmeasure;
2062  n1= l1->npoints;
2063  n2 = l2->npoints;
2064 
2065  LWDEBUG(2, "lw_dist2d_pre_seg_seg is called");
2066 
2067  p1 = getPoint2d_cp(l1, list1[0].pnr);
2068  p3 = getPoint2d_cp(l2, list2[0].pnr);
2069  lw_dist2d_pt_pt(p1, p3, dl);
2070  maxmeasure = sqrt(dl->distance*dl->distance + (dl->distance*dl->distance*k*k));
2071  twist = dl->twisted; /*to keep the incomming order between iterations*/
2072  for (i =(n1-1); i>=0; --i)
2073  {
2074  /*we break this iteration when we have checked every
2075  point closer to our perpendicular "checkline" than
2076  our shortest found distance*/
2077  if (((list2[0].themeasure-list1[i].themeasure)) > maxmeasure) break;
2078  for (r=-1; r<=1; r +=2) /*because we are not iterating in the original pointorder we have to check the segment before and after every point*/
2079  {
2080  pnr1 = list1[i].pnr;
2081  p1 = getPoint2d_cp(l1, pnr1);
2082  if (pnr1+r<0)
2083  {
2084  p01 = getPoint2d_cp(l1, (n1-1));
2085  if (( p1->x == p01->x) && (p1->y == p01->y)) pnr2 = (n1-1);
2086  else pnr2 = pnr1; /* if it is a line and the last and first point is not the same we avoid the edge between start and end this way*/
2087  }
2088 
2089  else if (pnr1+r>(n1-1))
2090  {
2091  p01 = getPoint2d_cp(l1, 0);
2092  if (( p1->x == p01->x) && (p1->y == p01->y)) pnr2 = 0;
2093  else pnr2 = pnr1; /* if it is a line and the last and first point is not the same we avoid the edge between start and end this way*/
2094  }
2095  else pnr2 = pnr1+r;
2096 
2097 
2098  p2 = getPoint2d_cp(l1, pnr2);
2099  for (u=0; u<n2; ++u)
2100  {
2101  if (((list2[u].themeasure-list1[i].themeasure)) >= maxmeasure) break;
2102  pnr3 = list2[u].pnr;
2103  p3 = getPoint2d_cp(l2, pnr3);
2104  if (pnr3==0)
2105  {
2106  p02 = getPoint2d_cp(l2, (n2-1));
2107  if (( p3->x == p02->x) && (p3->y == p02->y)) pnr4 = (n2-1);
2108  else pnr4 = pnr3; /* if it is a line and the last and first point is not the same we avoid the edge between start and end this way*/
2109  }
2110  else pnr4 = pnr3-1;
2111 
2112  p4 = getPoint2d_cp(l2, pnr4);
2113  dl->twisted=twist;
2114  if (!lw_dist2d_selected_seg_seg(p1, p2, p3, p4, dl)) return LW_FALSE;
2115 
2116  if (pnr3>=(n2-1))
2117  {
2118  p02 = getPoint2d_cp(l2, 0);
2119  if (( p3->x == p02->x) && (p3->y == p02->y)) pnr4 = 0;
2120  else pnr4 = pnr3; /* if it is a line and the last and first point is not the same we avoid the edge between start and end this way*/
2121  }
2122 
2123  else pnr4 = pnr3+1;
2124 
2125  p4 = getPoint2d_cp(l2, pnr4);
2126  dl->twisted=twist; /*we reset the "twist" for each iteration*/
2127  if (!lw_dist2d_selected_seg_seg(p1, p2, p3, p4, dl)) return LW_FALSE;
2128 
2129  maxmeasure = sqrt(dl->distance*dl->distance + (dl->distance*dl->distance*k*k));/*here we "translate" the found mindistance so it can be compared to our "z"-values*/
2130  }
2131  }
2132  }
2133 
2134  return LW_TRUE;
2135 }
char * r
Definition: cu_in_wkt.c:24
int npoints
Definition: liblwgeom.h:355
#define LWDEBUG(level, msg)
Definition: lwgeom_log.h:50
double x
Definition: liblwgeom.h:312
#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
double y
Definition: liblwgeom.h:312
int twisted
Definition: measures.h:28
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:2144
double distance
Definition: measures.h:24
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
int pnr
Definition: measures.h:35
Here is the call graph for this function:
Here is the caller graph for this function: