skspatial.objects.Cylinder.intersect_line

Cylinder.intersect_line(line: Line, n_digits: Optional[int] = None, infinite: bool = True) Tuple[Point, Point][source]

Intersect the cylinder with a 3D line.

By default, this method treats the cylinder as infinite along its axis (i.e., without caps).

Parameters:
lineLine

Input 3D line.

n_digitsint, optional

Additional keywords passed to round(). This is used to round the coefficients of the quadratic equation.

infinitebool

If True, the cylinder is treated as infinite along its axis (i.e., without caps).

Returns:
point_a, point_b: Point

The two intersection points of the line with the cylinder, if they exist.

Raises:
ValueError

If the line is not 3D. If the line does not intersect the cylinder at one or two points.

References

https://mrl.cs.nyu.edu/~dzorin/rendering/lectures/lecture3/lecture3.pdf

Examples

>>> from skspatial.objects import Line, Cylinder
>>> cylinder = Cylinder([0, 0, 0], [0, 0, 1], 1)
>>> line = Line([0, 0, 0], [1, 0, 0])

Intersection with an infinite cylinder.

>>> cylinder.intersect_line(line)
(Point([-1.,  0.,  0.]), Point([1., 0., 0.]))
>>> line = Line([1, 2, 3], [1, 2, 3])
>>> point_a, point_b = cylinder.intersect_line(line)
>>> point_a.round(3)
Point([-0.447, -0.894, -1.342])
>>> point_b.round(3)
Point([0.447, 0.894, 1.342])
>>> cylinder.intersect_line(Line([0, 0], [1, 2]))
Traceback (most recent call last):
...
ValueError: The line must be 3D.
>>> cylinder.intersect_line(Line([0, 0, 2], [0, 0, 1]))
Traceback (most recent call last):
...
ValueError: The line does not intersect the cylinder.
>>> cylinder.intersect_line(Line([2, 0, 0], [0, 1, 1]))
Traceback (most recent call last):
...
ValueError: The line does not intersect the cylinder.

Intersection with a finite cylinder.

>>> point_a, point_b = cylinder.intersect_line(Line([0, 0, 0], [0, 0, 1]), infinite=False)
>>> point_a
Point([0., 0., 0.])
>>> point_b
Point([0., 0., 1.])
>>> cylinder = Cylinder([0, 0, 0], [0, 0, 5], 1)
>>> point_a, point_b = cylinder.intersect_line(Line([0, 0, 0], [1, 0, 1]), infinite=False)
>>> point_a
Point([0., 0., 0.])
>>> point_b
Point([1., 0., 1.])