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; }