OSDN Git Service

da
[psychlops/silverlight.git] / dev5 / psychlops / extension / standard / CIEColor.cs
index 50df53c..bf08e3a 100644 (file)
@@ -4,6 +4,45 @@ namespace Psychlops
 {\r
        namespace ColorSpaces\r
        {\r
+               public struct HSV\r
+               {\r
+                       public double H, S, V, A;\r
+\r
+                       public Color toRGB()\r
+                       {\r
+                               if (S == 0.0) return new Color(V, V, V, A);\r
+                               int hi = (int)Math.floor(H/60.0);\r
+                               double f = (H / 60.0) - (double)hi,\r
+                                          p = V*(1.0-S),\r
+                                          q = V*(1.0-f*S),\r
+                                          t = V*(1.0-(1.0-f)*S);\r
+                               if (hi == 0) { return new Color(V, t, p, A); }\r
+                               else if (hi == 1) { return new Color(q, V, p, A); }\r
+                               else if (hi == 2) { return new Color(p, V, t, A); }\r
+                               else if (hi == 3) { return new Color(p, q, V, A); }\r
+                               else if (hi == 4) { return new Color(t, p, V, A); }\r
+                               else if (hi == 5) { return new Color(V, p, q, A); }\r
+                               else return Color.transparent;\r
+                       }\r
+\r
+                       public void fromRGB(Color o) {\r
+                               double MAX = Math.max(Math.max(o.r, o.g), o.b);\r
+                               double MIN = Math.min(Math.min(o.r, o.g), o.b);\r
+                               double h;\r
+                               if(MAX==MIN) { h=0.0; }\r
+                               else if(o.r>o.g && o.r>o.b) { h=60.0*(o.g-o.b)/(MAX-MIN)+360.0; }\r
+                               else if(o.g>o.b) { h=60.0*(o.b-o.r)/(MAX-MIN)+120.0; }\r
+                               else { h=60.0*(o.r-o.g)/(MAX-MIN)+240.0; }\r
+                               h = Math.mod(h, 360.0);\r
+                               double v = MAX, s;\r
+                               if(MAX==MIN) { s=0.0; } else { s=(MAX-MIN)/MAX; }\r
+                               H = h;\r
+                               S = s;\r
+                               V = v;\r
+                               A = o.a;\r
+                       }\r
+               }\r
+\r
                /*\r
                 * CIE 1931\r
                 * R: 700 nm\r