private static VBox[] MedianCutApply(IReadOnlyList <int> histo, VBox vbox) { switch (vbox.Count(false)) { case 0: return(null); case 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 partialsum.Fill(-1); // -1 = not set / 0 = 0 var lookaheadsum = new int[VboxLength]; lookaheadsum.Fill(-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)); }