Exemple #1
0
        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));
        }