intersection_segment_segment

compas.geometry.intersection_segment_segment(ab, cd, tol=1e-06)[source]

Compute the intersection of two lines segments.

Parameters
  • ab ([point, point] | compas.geometry.Line) – XYZ coordinates of two points defining a line segment.

  • cd ([point, point] | compas.geometry.Line) – XYZ coordinates of two points defining another line segment.

  • tol (float, optional) – A tolerance for membership verification.

Returns

tuple[[float, float, float], [float, float, float]] | tuple[None, None] – Two intersection points. If the segments intersect and the intersection points lie on the respective segments, the two points are identical. If the segments are skew and the apparent intersection points lie on the respective segments, the two points are different. In all other cases there are no intersection points.

Examples

The 2 intersection points of intersecting segments are identical.

>>> s1 = [0, 0, 0], [1, 0, 0]
>>> s2 = [0, 0, 0], [0, 1, 0]
>>> intersection_segment_segment(s1, s2)
([0.0, 0.0, 0.0], [0.0, 0.0, 0.0])

Unlike lines, segments don’t extend beyond their start and end points.

>>> s1 = [0, 0, 0], [1, 0, 0]
>>> s2 = [2, 0, 0], [0, 1, 0]
>>> intersection_segment_segment(s1, s2)
(None, None)

Skew segments have two different intersection points.

>>> s1 = [0, 0, 0], [1, 0, 0]
>>> s2 = [0, 0, 1], [0, 1, 1]
>>> intersection_segment_segment(s1, s2)
([0.0, 0.0, 0.0], [0.0, 0.0, 1.0])

Parallel segments don’t intersect.

>>> s1 = [0, 0, 0], [1, 0, 0]
>>> s2 = [0, 0, 0], [1, 0, 0]
>>> intersection_segment_segment(s1, s2)
(None, None)