docstr: Linearly interpolate a vertex where an isosurface cuts an edge
  between the two endpoint vertices, based on their values
  
  Args:
      isolevel: the isosurface value to use as the threshold to determine
          whether points are within a volume.
      edge: edge (ID) to interpolate
      cube: current cube vertices
      vol: 3D scalar field
  
  Returns:
      interpolated vertex: position of the interpolated vertex on the edge
docstr_tok: ["Linearly","interpolate","a","vertex","where","an","isosurface","cuts","an","edge","between","the","two","endpoint","vertices",",","based","on","their","values","Args",":","isolevel",":","the","isosurface","value","to","use","as","the","threshold","to","determine","whether","points","are","within","a","volume",".","edge",":","edge","(","ID",")","to","interpolate","cube",":","current","cube","vertices","vol",":","3D","scalar","field","Returns",":","interpolated","vertex",":","position","of","the","interpolated","vertex","on","the","edge"]
code: def vert_interp(
      self,
      isolevel: float,
      edge: int,
      vol: torch.Tensor,
  ) -> List:
      """
      Linearly interpolate a vertex where an isosurface cuts an edge
      between the two endpoint vertices, based on their values
  
      Args:
          isolevel: the isosurface value to use as the threshold to determine
              whether points are within a volume.
          edge: edge (ID) to interpolate
          cube: current cube vertices
          vol: 3D scalar field
  
      Returns:
          interpolated vertex: position of the interpolated vertex on the edge
      """
      v1, v2 = EDGE_TO_VERTICES[edge]
      p1, p2 = self.verts[v1], self.verts[v2]
      val1, val2 = (
          vol[p1[2]][p1[1]][p1[0]],
          vol[p2[2]][p2[1]][p2[0]],
      )
      point = None
      if abs(isolevel - val1) < EPS:
          point = p1
      elif abs(isolevel - val2) < EPS:
          point = p2
      elif abs(val1 - val2) < EPS:
          point = p1
  
      if point is None:
          mu = (isolevel - val1) / (val2 - val1)
          x1, y1, z1 = p1
          x2, y2, z2 = p2
          x = x1 + mu * (x2 - x1)
          y = y1 + mu * (y2 - y1)
          z = z1 + mu * (z2 - z1)
      else:
          x, y, z = point
      return [x, y, z]
  
file_path: pytorch3d/pytorch3d/ops/marching_cubes.py
imports: from typing import List, Optional, Tuple
  import torch
  from pytorch3d import _C
  from pytorch3d.ops.marching_cubes_data import EDGE_TO_VERTICES, FACE_TABLE, INDEX
  from pytorch3d.transforms import Translate
  from torch.autograd import Function
label_desc: Use image node_id 3 for calling the Cube obj's underlying member method code with example usage: obj.vert_interp(isolevel, edge, vol) and returns: list