private static VBox[] MedianCutApply(IList <int> histo, VBox vbox) { if (vbox.Count(false) == 0) { return(null); } if (vbox.Count(false) == 1) { return(new[] { vbox.Clone(), null }); } // only one pixel, no split var rw = vbox.R2 - vbox.R1 + 1; var gw = vbox.G2 - vbox.G1 + 1; var bw = vbox.B2 - vbox.B1 + 1; var maxw = Math.Max(Math.Max(rw, gw), bw); // Find the partial sum arrays along the selected axis. var total = 0; var partialsum = new int[VboxLength]; // -1 = not set / 0 = 0 for (var l = 0; l < partialsum.Length; l++) { partialsum[l] = -1; } // -1 = not set / 0 = 0 var lookaheadsum = new int[VboxLength]; for (var l = 0; l < lookaheadsum.Length; l++) { lookaheadsum[l] = -1; } int i, j, k, sum, index; if (maxw == rw) { for (i = vbox.R1; i <= vbox.R2; i++) { sum = 0; for (j = vbox.G1; j <= vbox.G2; j++) { for (k = vbox.B1; k <= vbox.B2; k++) { index = GetColorIndex(i, j, k); sum += histo[index]; } } total += sum; partialsum[i] = total; } } else if (maxw == gw) { for (i = vbox.G1; i <= vbox.G2; i++) { sum = 0; for (j = vbox.R1; j <= vbox.R2; j++) { for (k = vbox.B1; k <= vbox.B2; k++) { index = GetColorIndex(j, i, k); sum += histo[index]; } } total += sum; partialsum[i] = total; } } else /* maxw == bw */ { for (i = vbox.B1; i <= vbox.B2; i++) { sum = 0; for (j = vbox.R1; j <= vbox.R2; j++) { for (k = vbox.G1; k <= vbox.G2; k++) { index = GetColorIndex(j, k, i); sum += histo[index]; } } total += sum; partialsum[i] = total; } } for (i = 0; i < VboxLength; i++) { if (partialsum[i] != -1) { lookaheadsum[i] = total - partialsum[i]; } } // determine the cut planes return(maxw == rw?DoCut('r', vbox, partialsum, lookaheadsum, total) : maxw == gw ? DoCut('g', vbox, partialsum, lookaheadsum, total) : DoCut('b', vbox, partialsum, lookaheadsum, total)); }