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 RgbLinearInterpolate(Color start, Color end, int colorCount)
{
List ret = new List();
// 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 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 ret = new List();
if (colorCount == 0)
return ret;
int size = (colorCount + 1) / 2;
List 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));
}
}
}