ScreenToGif.Encoding.NeuQuant.Learn C# (CSharp) Method

Learn() private method

Main Learning Loop.
private Learn ( ) : void
return void
        private void Learn()
        {
            int i;
            int step;

            if (_lengthCount < MinPictureBytes)
                _samplefac = 1;

            _alphadec = 30 + ((_samplefac - 1) / 3);

            var p = _thepicture;
            var pix = 0;
            var lim = _lengthCount;

            var samplepixels = _lengthCount / (3 * _samplefac);
            var delta = samplepixels / NumCycles;
            var alpha = InitAlpha;
            var radius = InitRadius;

            var rad = radius >> RadiusBiasShift;
            if (rad <= 1)
                rad = 0;
            for (i = 0; i < rad; i++)
                _radPower[i] =
                    alpha * (((rad * rad - i * i) * RadBias) / (rad * rad));

            //Console.WriteLine("Beginning 1D learning: Initial radius= " + rad);

            if (_lengthCount < MinPictureBytes)
                step = 3;
            else if ((_lengthCount % Prime1) != 0)
                step = 3 * Prime1;
            else
            {
                if ((_lengthCount % Prime2) != 0)
                    step = 3 * Prime2;
                else
                {
                    if ((_lengthCount % Prime3) != 0)
                        step = 3 * Prime3;
                    else
                        step = 3 * Prime4;
                }
            }

            i = 0;
            while (i < samplepixels)
            {
                #region Get Blue-Green-Red

                var b = (p[pix + 0] & 0xff) << Netbiasshift;
                var g = (p[pix + 1] & 0xff) << Netbiasshift;
                var r = (p[pix + 2] & 0xff) << Netbiasshift;

                #endregion

                var bestBias = Contest(b, g, r);

                Altersingle(alpha, bestBias, b, g, r);

                if (rad != 0)
                    AlterNeighbour(rad, bestBias, b, g, r);

                pix += step;
                if (pix >= lim)
                    pix -= _lengthCount;

                i++;
                if (delta == 0)
                    delta = 1;

                if (i % delta == 0)
                {
                    alpha -= alpha / _alphadec;
                    radius -= radius / RadiusDec;
                    rad = radius >> RadiusBiasShift;

                    if (rad <= 1)
                        rad = 0;

                    for (bestBias = 0; bestBias < rad; bestBias++)
                        _radPower[bestBias] =
                            alpha * (((rad * rad - bestBias * bestBias) * RadBias) / (rad * rad));
                }
            }

            //Console.WriteLine("Finished 1D learning: alpha= " + ((float)alpha) / InitAlpha);
        }