PostGIS  3.0.6dev-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 373 of file lwalgorithm.c.

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