code: def planes_lines(plane_origins,
                   plane_normals,
                   line_origins,
                   line_directions):
      
  
      # check input types
      plane_origins = np.asanyarray(plane_origins, dtype=np.float64)
      plane_normals = np.asanyarray(plane_normals, dtype=np.float64)
      line_origins = np.asanyarray(line_origins, dtype=np.float64)
      line_directions = np.asanyarray(line_directions, dtype=np.float64)
  
      # vector from line to plane
      origin_vectors = plane_origins - line_origins
  
      projection_ori = util.diagonal_dot(origin_vectors, plane_normals)
      projection_dir = util.diagonal_dot(line_directions, plane_normals)
  
      valid = np.abs(projection_dir) > tol.merge
  
      distance = np.divide(projection_ori[valid],
                           projection_dir[valid])
  
      on_plane = line_directions[valid] * distance.reshape((-1, 1))
      on_plane += line_origins[valid]
  
      return on_plane, valid
docs: Given one line per plane, find the intersection points.
  
      Parameters
      -----------
      plane_origins : (n,3) float
          Point on each plane
      plane_normals : (n,3) float
          Normal vector of each plane
      line_origins : (n,3) float
          Point at origin of each line
      line_directions : (n,3) float
          Direction vector of each line
  
      Returns
      ----------
      on_plane : (n,3) float
          Points on specified planes
      valid : (n,) bool
          Did plane intersect line or not