private static double CalculateOptimalSplit(List<RenderItem> items, BoundingBox bb, double totalSurface, out double maxHeur, int dim)
 {
     SortedSet<AddRemoveEvent> events = new SortedSet<AddRemoveEvent>(GenerateEvents(items, dim));
     IEnumerator<AddRemoveEvent> aree = events.GetEnumerator();
     HashSet<int> activ = new HashSet<int>();
     HashSet<int> torem = new HashSet<int>();
     AddRemoveEvent are;
     double x0, x1;
     int nleft = 0x00;
     int ntotal = items.Count;
     double lsf = 0.0d;
     bb.GetDimensionBounds(dim, out x0, out x1);
     maxHeur = double.PositiveInfinity;
     double xheu = double.NaN, heu;
     while(aree.MoveNext()) {
         are = aree.Current;
         double x = are.X;
         int index = are.Index;
         if(are.Add) {
             if(!torem.Remove(index)) {
                 activ.Add(index);
             }
         }
         else {
             nleft++;
             lsf += items[index].Surface();
             if(!activ.Remove(index)) {
                 torem.Add(index);
             }
         }
         if(x0 < x && x < x1) {
             double lssf = 0.0d;
             foreach(int id in activ) {
                 lssf += items[id].SplitSurface(x, dim);
             }
             heu = (nleft+activ.Count)*(lsf+lssf)+(ntotal-nleft)*(totalSurface-lsf-lssf);
             if(heu < maxHeur) {
                 maxHeur = heu;
                 xheu = x;
             }
         }
     }
     if(double.IsNaN(xheu)) {
         return 0.5d*(x0+x1);
     }
     return xheu;
 }