Mega Code Archive

 
Categories / C# / 2D Graphics
 

Rgb Linear Interpolate

using System; using System.Collections.Generic; using System.Windows.Media; using System.Reflection; using System.Globalization; namespace NASA.BeAMartian.Utils {     public class ColorUtils     {         public static List<Color> RgbLinearInterpolate(Color start, Color end, int colorCount)         {             List<Color> ret = new List<Color>();             // linear interpolation lerp (r,a,b) = (1-r)*a + r*b = (1-r)*(ax,ay,az) + r*(bx,by,bz)             for (int n = 0; n < colorCount; n++)             {                 double r = (double)n / (double)(colorCount - 1);                 double nr = 1.0 - r;                 double A = (nr * start.A) + (r * end.A);                 double R = (nr * start.R) + (r * end.R);                 double G = (nr * start.G) + (r * end.G);                 double B = (nr * start.B) + (r * end.B);                 ret.Add(Color.FromArgb((byte)A, (byte)R, (byte)G, (byte)B));             }             return ret;         }         public static List<Color> RgbLinearInterpolate(Color start, Color middle, Color end, int colorCount)         {             if (colorCount % 2 == 0)                 throw new ArgumentException("colorCount should be and odd number. Currently it is: " + colorCount);             List<Color> ret = new List<Color>();             if (colorCount == 0)                 return ret;             int size = (colorCount + 1) / 2;             List<Color> res = ColorUtils.RgbLinearInterpolate(start, middle, size);             if (res.Count > 0)                 res.RemoveAt(res.Count - 1);             ret.AddRange(res);             ret.AddRange(ColorUtils.RgbLinearInterpolate(middle, end, size));             return ret;         }         public static Color HsvToRgb(double h, double s, double v)         {             int hi = (int)Math.Floor(h / 60.0) % 6;             double f = (h / 60.0) - Math.Floor(h / 60.0);             double p = v * (1.0 - s);             double q = v * (1.0 - (f * s));             double t = v * (1.0 - ((1.0 - f) * s));             Color ret;             switch (hi)             {                 case 0:                     ret = ColorUtils.GetRgb(v, t, p);                     break;                 case 1:                     ret = ColorUtils.GetRgb(q, v, p);                     break;                 case 2:                     ret = ColorUtils.GetRgb(p, v, t);                     break;                 case 3:                     ret = ColorUtils.GetRgb(p, q, v);                     break;                 case 4:                     ret = ColorUtils.GetRgb(t, p, v);                     break;                 case 5:                     ret = ColorUtils.GetRgb(v, p, q);                     break;                 default:                     ret = Color.FromArgb(0xFF, 0x00, 0x00, 0x00);                     break;             }             return ret;         }         public static Color GetRgb(double r, double g, double b)         {             return Color.FromArgb(255, (byte)(r * 255.0), (byte)(g * 255.0), (byte)(b * 255.0));         }     } }