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)); }
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); } } }
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; } } } } }