PostGIS  3.6.1dev-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 388 of file lwalgorithm.c.

389 {
390 
391  int pq1, pq2, qp1, qp2;
392 
393  /* No envelope interaction => we are done. */
394  if (!lw_seg_interact(p1, p2, q1, p2))
395  {
396  return SEG_NO_INTERSECTION;
397  }
398 
399  /* Are the start and end points of q on the same side of p? */
400  pq1=lw_segment_side(p1,p2,q1);
401  pq2=lw_segment_side(p1,p2,q2);
402  if ((pq1>0 && pq2>0) || (pq1<0 && pq2<0))
403  {
404  return SEG_NO_INTERSECTION;
405  }
406 
407  /* Are the start and end points of p on the same side of q? */
408  qp1=lw_segment_side(q1,q2,p1);
409  qp2=lw_segment_side(q1,q2,p2);
410  if ( (qp1 > 0.0 && qp2 > 0.0) || (qp1 < 0.0 && qp2 < 0.0) )
411  {
412  return SEG_NO_INTERSECTION;
413  }
414 
415  /* Nobody is on one side or another? Must be colinear. */
416  if ( pq1 == 0.0 && pq2 == 0.0 && qp1 == 0.0 && qp2 == 0.0 )
417  {
418  return SEG_COLINEAR;
419  }
420 
421  /*
422  ** When one end-point touches, the sidedness is determined by the
423  ** location of the other end-point. Only touches by the first point
424  ** will be considered "real" to avoid double counting.
425  */
426  LWDEBUGF(4, "pq1=%d pq2=%d", pq1, pq2);
427  LWDEBUGF(4, "qp1=%d qp2=%d", qp1, qp2);
428 
429  /* Second point of p or q touches, it's not a crossing. */
430  if ( pq2 == 0 || qp2 == 0 )
431  {
432  return SEG_NO_INTERSECTION;
433  }
434 
435  /* First point of p touches, it's a "crossing". */
436  if ( pq1 == 0 )
437  {
438  if ( pq2 > 0 )
439  return SEG_CROSS_RIGHT;
440  else
441  return SEG_CROSS_LEFT;
442  }
443 
444  /* First point of q touches, it's a crossing. */
445  if ( qp1 == 0 )
446  {
447  if ( pq1 < pq2 )
448  return SEG_CROSS_RIGHT;
449  else
450  return SEG_CROSS_LEFT;
451  }
452 
453  /* The segments cross, what direction is the crossing? */
454  if ( pq1 < pq2 )
455  return SEG_CROSS_RIGHT;
456  else
457  return SEG_CROSS_LEFT;
458 
459  /* This should never happen! */
460  return SEG_ERROR;
461 }
@ 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:353
int lw_segment_side(const POINT2D *p1, const POINT2D *p2, const POINT2D *q)
lw_segment_side()
Definition: lwalgorithm.c:70
#define LWDEBUGF(level, msg,...)
Definition: lwgeom_log.h:106

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: