public VirtualPixel1D FadeToUsingHSV(int position, Color color, double brightness, TimeSpan duration)
{
if (position < 0 || position >= this.pixelCount)
throw new ArgumentOutOfRangeException();
if (this.color[position].GetBrightness() == 0)
{
this.color[position] = color;
this.brightness[position] = 0;
}
if (color.GetBrightness() == 0)
{
color = this.color[position];
brightness = 0;
}
var startHSV = new HSV(this.color[position]);
var endHSV = new HSV(color);
double startBrightness = this.brightness[position];
// 10 steps per second
int steps = (int)(duration.TotalMilliseconds / 100);
double fadePosition = 0;
for (int i = 0; i < steps; i++)
{
double newBrightness = startBrightness + (brightness - startBrightness) * fadePosition;
double hue = startHSV.Hue + (endHSV.Hue - startHSV.Hue) * fadePosition;
double sat = startHSV.Saturation + (endHSV.Saturation - startHSV.Saturation) * fadePosition;
double val = startHSV.Value + (endHSV.Value - startHSV.Value) * fadePosition;
Color newColor = HSV.ColorFromHSV(hue, sat, val);
SetColor(position, newColor, newBrightness);
System.Threading.Thread.Sleep(100);
fadePosition += 1.0 / (steps - 1);
}
return this;
}