code: def discrete_mean_curvature_measure(mesh, points, radius):
      
  
      points = np.asanyarray(points, dtype=np.float64)
      if not util.is_shape(points, (-1, 3)):
          raise ValueError('points must be (n,3)!')
  
      # axis aligned bounds
      bounds = np.column_stack((points - radius,
                                points + radius))
  
      # line segments that intersect axis aligned bounding box
      candidates = [list(mesh.face_adjacency_tree.intersection(b))
                    for b in bounds]
  
      mean_curv = np.empty(len(points))
      for i, (x, x_candidates) in enumerate(zip(points, candidates)):
          endpoints = mesh.vertices[mesh.face_adjacency_edges[x_candidates]]
          lengths = line_ball_intersection(
              endpoints[:, 0],
              endpoints[:, 1],
              center=x,
              radius=radius)
          angles = mesh.face_adjacency_angles[x_candidates]
          signs = np.where(mesh.face_adjacency_convex[x_candidates], 1, -1)
          mean_curv[i] = (lengths * angles * signs).sum() / 2
  
      return mean_curv
docs: Return the discrete mean curvature measure of a sphere centered
      at a point as detailed in 'Restricted Delaunay triangulations and normal
      cycle', Cohen-Steiner and Morvan.
  
      Parameters
      ----------
      points : (n,3) float, list of points in space
      radius : float, the sphere radius
  
      Returns
      --------
      mean_curvature: (n,) float, discrete mean curvature measure.