PostGIS  2.4.9dev-r@@SVN_REVISION@@

◆ lw_segment_intersects()

int lw_segment_intersects ( const POINT2D p1,
const POINT2D p2,
const POINT2D q1,
const POINT2D q2 
)

returns the kind of CG_SEGMENT_INTERSECTION_TYPE behavior of lineseg 1 (constructed from p1 and p2) and lineseg 2 (constructed from q1 and q2)

Parameters
p1start point of first straight linesegment
p2end point of first straight linesegment
q1start point of second line segment
q2end point of second line segment
Returns
a CG_SEGMENT_INTERSECTION_TYPE Returns one of SEG_ERROR = -1, SEG_NO_INTERSECTION = 0, SEG_COLINEAR = 1, SEG_CROSS_LEFT = 2, SEG_CROSS_RIGHT = 3,

Definition at line 371 of file lwalgorithm.c.

References lw_seg_interact(), lw_segment_side(), LWDEBUGF, SEG_COLINEAR, SEG_CROSS_LEFT, SEG_CROSS_RIGHT, SEG_ERROR, and SEG_NO_INTERSECTION.

Referenced by lwline_crossing_direction(), rect_tree_intersects_tree(), and test_lw_segment_intersects().

372 {
373 
374  int pq1, pq2, qp1, qp2;
375 
376  /* No envelope interaction => we are done. */
377  if (!lw_seg_interact(p1, p2, q1, p2))
378  {
379  return SEG_NO_INTERSECTION;
380  }
381 
382  /* Are the start and end points of q on the same side of p? */
383  pq1=lw_segment_side(p1,p2,q1);
384  pq2=lw_segment_side(p1,p2,q2);
385  if ((pq1>0 && pq2>0) || (pq1<0 && pq2<0))
386  {
387  return SEG_NO_INTERSECTION;
388  }
389 
390  /* Are the start and end points of p on the same side of q? */
391  qp1=lw_segment_side(q1,q2,p1);
392  qp2=lw_segment_side(q1,q2,p2);
393  if ( (qp1 > 0.0 && qp2 > 0.0) || (qp1 < 0.0 && qp2 < 0.0) )
394  {
395  return SEG_NO_INTERSECTION;
396  }
397 
398  /* Nobody is on one side or another? Must be colinear. */
399  if ( pq1 == 0.0 && pq2 == 0.0 && qp1 == 0.0 && qp2 == 0.0 )
400  {
401  return SEG_COLINEAR;
402  }
403 
404  /*
405  ** When one end-point touches, the sidedness is determined by the
406  ** location of the other end-point. Only touches by the first point
407  ** will be considered "real" to avoid double counting.
408  */
409  LWDEBUGF(4, "pq1=%.15g pq2=%.15g", pq1, pq2);
410  LWDEBUGF(4, "qp1=%.15g qp2=%.15g", qp1, qp2);
411 
412  /* Second point of p or q touches, it's not a crossing. */
413  if ( pq2 == 0 || qp2 == 0 )
414  {
415  return SEG_NO_INTERSECTION;
416  }
417 
418  /* First point of p touches, it's a "crossing". */
419  if ( pq1 == 0 )
420  {
421  if ( pq2 > 0 )
422  return SEG_CROSS_RIGHT;
423  else
424  return SEG_CROSS_LEFT;
425  }
426 
427  /* First point of q touches, it's a crossing. */
428  if ( qp1 == 0 )
429  {
430  if ( pq1 < pq2 )
431  return SEG_CROSS_RIGHT;
432  else
433  return SEG_CROSS_LEFT;
434  }
435 
436  /* The segments cross, what direction is the crossing? */
437  if ( pq1 < pq2 )
438  return SEG_CROSS_RIGHT;
439  else
440  return SEG_CROSS_LEFT;
441 
442  /* This should never happen! */
443  return SEG_ERROR;
444 }
static int lw_seg_interact(const POINT2D *p1, const POINT2D *p2, const POINT2D *q1, const POINT2D *q2)
Definition: lwalgorithm.c:336
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
Definition: lwalgorithm.c:64
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:88
Here is the call graph for this function:
Here is the caller graph for this function: