def intersect (self, line):
     """intersect(line) -> Point | None

     Returns the point at which the line segment and Plane intersect
     or None if they do not intersect.
     """
     eps   = 1e-8
     d     = (line.q - line.p)
     dn    = d.dot(self.n)
     point = None

     if abs(dn) >= eps:
       mu = self.n.dot(self.p - line.p) / dn
       if mu >= 0 and mu <= 1:
         point = line.p + mu * d

     return point
intersect(line) -> Point | None

     Returns the point at which the line segment and Plane intersect
     or None if they do not intersect.