Beispiel #1
0
        private IInterpolation GetInterpolator(ColorMap map, double mult)
        {
            var size   = map.FixedMap.Length;
            var points = new List <Tuple <int, double> >(map.FixedMap.Length);

            for (var oldColor = 0; oldColor < size; oldColor++)
            {
                if (map.Contains(oldColor))
                {
                    points.Add(Tuple.Create(oldColor, map.Average(oldColor)));
                }
            }
            var xValues = new double[points.Count];
            var yValues = new double[points.Count];

            for (var i = 0; i < points.Count; i++)
            {
                var point = points[i];
                xValues[i] = point.Item1;
                yValues[i] = point.Item2;
            }

            if (xValues.Length == 1)
            {
                return(GetInterpolator(Interpolation, new[] { xValues[0], xValues[0] }, new[] { yValues[0], yValues[0] }, mult));
            }
            return(GetInterpolator(Interpolation, xValues, yValues, mult));
        }
Beispiel #2
0
        private void Interpolate(ColorMap map, int min, int max, int srcBits, int refBits)
        {
            var interpolator = GetInterpolator(map);

            if (interpolator == null)
            {
                return;
            }

            var firstOldColor = map.First();
            var lastOldColor  = map.Last();
            var mult          = Math.Pow(2, refBits - srcBits);

            for (var oldColor = 0; oldColor < map.FixedMap.Length; oldColor++)
            {
                if (oldColor < firstOldColor || oldColor > lastOldColor)
                {
                    map.Add(oldColor, oldColor * mult);
                }
                else if (!map.Contains(oldColor))
                {
                    var interpolated = interpolator.Interpolate(oldColor);
                    interpolated = Math.Min(max, Math.Max(min, interpolated));
                    map.Add(oldColor, interpolated);
                }
            }
        }
Beispiel #3
0
        private void Interpolate(ColorMap map, int min, int max, int srcBits, int refBits)
        {
            var mult         = Math.Pow(2, refBits - srcBits);
            var interpolator = GetInterpolator(map, mult);

            if (interpolator == null)
            {
                return;
            }

            var firstOldColor = map.First();
            var lastOldColor  = map.Last();

            for (var oldColor = 0; oldColor < map.FixedMap.Length; oldColor++)
            {
                if (oldColor < firstOldColor || oldColor > lastOldColor)
                {
                    map.AddReal(oldColor, oldColor * mult);
                }
                else if (!map.Contains(oldColor))
                {
                    var interpolated = interpolator.Interpolate(oldColor);
                    interpolated = Math.Min(max, Math.Max(min, interpolated));
                    map.AddReal(oldColor, interpolated);
                }
                else if (map.FixedMap[oldColor] < 0)
                {
                    var m       = map.DynamicMap[oldColor];
                    var weights = m.Values.Sum();
                    if (weights < 1 - double.Epsilon)
                    {
                        var interpolated = interpolator.Interpolate(oldColor);
                        interpolated = Math.Min(max, Math.Max(min, interpolated));
                        map.AddReal(oldColor, interpolated, 1 - weights);
                        continue;
                        var coef = 1 / weights;
                        foreach (var color in m.Keys.ToArray())
                        {
                            m[color] *= coef;
                        }
                    }
                }
            }
        }