PostGIS  3.4.0dev-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 370 of file lwalgorithm.c.

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

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_leaf_node_intersects(), and test_lw_segment_intersects().

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