code: def convex_hull_graham(P):
      P.sort()  # Sort the set of points
      L_upper = [P[0], P[1]]  # Initialize upper part
      # Compute the upper part of the hull
      for i in range(2, len(P)):
          L_upper.append(P[i])
          while len(L_upper) > 2 and not RightTurn(
              L_upper[-1], L_upper[-2], L_upper[-3]
          ):
              del L_upper[-2]
      L_lower = [P[-1], P[-2]]  # Initialize the lower part
      # Compute the lower part of the hull
      for i in range(len(P) - 3, -1, -1):
          L_lower.append(P[i])
          while len(L_lower) > 2 and not RightTurn(
              L_lower[-1], L_lower[-2], L_lower[-3]
          ):
              del L_lower[-2]
      del L_lower[0]
      del L_lower[-1]
      L = L_upper + L_lower  # Build the full hull
      return L
  
file_path: torch-points3d/torch_points3d/utils/box_utils.py
imports: import torch
  import numpy
  from scipy.spatial import ConvexHull
  from .geometry import euler_angles_to_rotation_matrix
label_desc: Use image node_id 9 for calling a global function with example usage: convex_hull_graham(P) and returns: L