docs: def lock(self):
          """
          Precomputes some parameters to run faster specific methods like
          Surface.classify. This method is automatically launched before shadows
          computation.
  		
          :returns: None
          """
          if self.locked: return
          from pyny3d.utils import bool2index
          # seed
          self.seed = self.get_seed()
          
          # map
          self.map = self.get_map()
  
          # map2polygons schedule
          m2p = [[], [], 0] # [polygons, holes, sop]
          index, points = self.get_map()
                  
          ## points
          bool_1 = index[:, 1] == -1
          m2p[2] = bool2index(bool_1)
          index_1 = bool2index(np.logical_not(bool_1)) # remain
          index = index[index_1]
          
          ## new index
          index_bool = np.diff(index[:, 2]*1e12
                              +index[:, 1]*1e8 
                              +index[:, 0]*1e4) != 0
          
          ## Dissemination loop
          dif = np.arange(index_bool.shape[0], dtype=int)[index_bool]+1
          dif = np.append(dif, index_bool.shape[0]+1)
          i = 0
          for j in dif:
              if index[i, 2] < 0: # hole
                  m2p[1].append(index_1[np.arange(i, j)])
              if index[i, 2] >= 0: # polygon
                  m2p[0].append(index_1[np.arange(i, j)])
              i = j
          self.explode_map_schedule = m2p
  
          # Sort areas
          areas = []
          for poly in self.explode()[0]:
              areas.append(Polygon(poly, False).get_area())
          self.sorted_areas = np.argsort(np.array(areas))[::-1]
          
          # Lock
          self.locked = True