forked from zodiacon/AsyncMandelbrotColor
-
Notifications
You must be signed in to change notification settings - Fork 0
/
ColorRainbow.cs
72 lines (64 loc) · 2.23 KB
/
ColorRainbow.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Xml.Linq;
namespace AsyncMandelbrot {
class GradientGenerator {
public double PhaseRed { get; set; }
public double PhaseBlue { get; set; }
public double PhaseGreen { get; set; }
public double FreqRed { get; set; }
public double FreqGreen { get; set; }
public double FreqBlue { get; set; }
public double MaxAngle { get; set; }
public Color[] GenerateColors(int number) {
var colors = new List<Color>(number);
double step = MaxAngle / number;
for(int i = 0; i < number; ++i) {
var r = (Math.Sin(FreqRed * i * step + PhaseRed) + 1) * .5;
var g = (Math.Sin(FreqGreen * i * step + PhaseGreen) + 1) * .5;
var b = (Math.Sin(FreqBlue * i * step + PhaseBlue) + 1) * .5;
colors.Add(Color.FromRgb((byte)(r * 255), (byte)(g * 255), (byte)(b * 255)));
}
return colors.ToArray();
}
public GradientGenerator() {
FreqRed = FreqBlue = FreqGreen = 1;
MaxAngle = Math.PI * 2;
}
}
static class ColorGradientPersist {
public static GradientGenerator Read(Stream stm) {
var xml = XElement.Load(stm);
return new GradientGenerator {
FreqRed = (double)xml.Attribute("FreqRed"),
FreqGreen = (double)xml.Attribute("FreqGreen"),
FreqBlue = (double)xml.Attribute("FreqBlue"),
PhaseRed = (double)xml.Attribute("PhaseRed"),
PhaseGreen = (double)xml.Attribute("PhaseGreen"),
PhaseBlue = (double)xml.Attribute("PhaseBlue"),
MaxAngle = (double)xml.Attribute("MaxAngle"),
};
}
public static void Write(GradientGenerator generator, Stream stm) {
var xml = new XElement("Gradient",
new XAttribute("FreqRed", generator.FreqRed),
new XAttribute("FreqGreen", generator.FreqGreen),
new XAttribute("FreqBlue", generator.FreqBlue),
new XAttribute("PhaseRed", generator.PhaseRed),
new XAttribute("PhaseGreen", generator.PhaseGreen),
new XAttribute("PhaseBlue", generator.PhaseBlue),
new XAttribute("MaxAngle", generator.MaxAngle));
xml.Save(stm);
}
}
static class Extensions {
public static int ToInt(this Color color) {
return (color.A << 24) | (color.B << 16) | (color.G << 8) | color.R;
}
}
}