private static Color? GetColor(double main, double x, double y) { ColorVector color = new ColorVector(x, main, y); color.ConvertXyzToLinearSRgb(); if (color.IsCanonical()) { color.ConvertLinearSRgbToSRgb(); return color.ToColor(); } else { return null; } }
private static Color? GetColor(double saturation, double hue, double bigY) { double angle = 2.0 * Math.PI * hue; double scale = bigY / (double)WhitePoints.D65Y; double d65BigX = (double)WhitePoints.D65X * scale; double d65BigZ = (double)WhitePoints.D65Z * scale; ColorVector color = new ColorVector(d65BigX + saturation * Math.Cos(angle), bigY, d65BigZ + saturation * Math.Sin(angle)); color.ConvertXyzToLinearSRgb(); if (color.IsCanonical()) { color.ConvertLinearSRgbToSRgb(); return color.ToColor(); } else { return null; } }
private static void Generate(IReadOnlyList<ColorVector> colors, double scaleY) { BitmapGenerator.Generate($@"E:\Rainbows\{scaleY:0.0000}", "rainbow-{0:0.000}.png", 101, colors.Count, 16, (double main, int x, int y) => { main = 0.14 + main / 100; ColorVector color = colors[x]; color.Component1 *= scaleY; color.Component2 *= scaleY; color.Component3 *= scaleY; ColorVector gray = new ColorVector((double)WhitePoints.D65X, (double)WhitePoints.D65Y, color.Component2); gray.ConvertXyyToXyz(); double offsetX = color.Component1 - gray.Component1; double offsetZ = color.Component3 - gray.Component3; color.Component1 = gray.Component1 + main * offsetX; color.Component3 = gray.Component3 + main * offsetZ; color.ConvertXyzToLinearSRgb(); if (color.IsCanonical()) { color.ConvertLinearSRgbToSRgb(); return color.ToColor(); } else { return null; } }); }