From 9f8568031d705f64bd1401dd20f24c282c48ea18 Mon Sep 17 00:00:00 2001 From: HOSOKAWA Kenchi Date: Fri, 7 Jan 2011 20:47:34 +0900 Subject: [PATCH] CIEColor.cs --- dev4/PsychlopsSilverlight4.csproj | 1 + dev4/psychlops/extention/standard/CIEColor.cs | 108 ++++++++++++++++++++++++++ test4/PsychlopsMain.cs | 5 ++ test4/PsychlopsSilverlight4test.csproj | 9 ++- 4 files changed, 120 insertions(+), 3 deletions(-) create mode 100644 dev4/psychlops/extention/standard/CIEColor.cs diff --git a/dev4/PsychlopsSilverlight4.csproj b/dev4/PsychlopsSilverlight4.csproj index 2ee575b..e2f0ade 100644 --- a/dev4/PsychlopsSilverlight4.csproj +++ b/dev4/PsychlopsSilverlight4.csproj @@ -87,6 +87,7 @@ + diff --git a/dev4/psychlops/extention/standard/CIEColor.cs b/dev4/psychlops/extention/standard/CIEColor.cs new file mode 100644 index 0000000..50df53c --- /dev/null +++ b/dev4/psychlops/extention/standard/CIEColor.cs @@ -0,0 +1,108 @@ +using System; + +namespace Psychlops +{ + namespace ColorSpaces + { + /* + * CIE 1931 + * R: 700 nm + * G: 546.1 nm + * B: 435.8 nm + * White Point: Illuminant E + */ + public struct CIERGB + { + public double R, G, B; + + public CIEXYZ convertToCIEXYZ() + { + double[,] b = + { + { 0.49, 0.31, 0.20 }, + { 0.17697, 0.81240, 0.01063 }, + { 0.00, 0.01, 0.99 } + }; + + CIEXYZ v; + + v.X = b[0, 0] * R + b[0, 1] * G + b[0, 2] * B; + v.Y = b[1, 0] * R + b[1, 1] * G + b[1, 2] * B; + v.Z = b[2, 0] * R + b[2, 1] * G + b[2, 2] * B; + + return v; + } + } + + /* + * CIE 1931 + */ + public struct CIEXYZ + { + public double X, Y, Z; + + public CIExyY convertToCIExyY() + { + CIExyY v; + + double denominator = X + Y + Z; + v.x = X / denominator; + v.y = Y / denominator; + v.Y = Y; + + return v; + } + } + + public struct CIExyY + { + public double x, y, Y; + + public CIEXYZ convertToCIEXYZ() + { + CIEXYZ v; + + v.X = Y / y * x; + v.Y = Y; + v.Z = Y / y * (1 - x - y); + + return v; + } + + // Yn = 1.0 when RGB of white point is { 1, 1, 1 } + public CIELuv convertToCIELuv(double Yn = 1.0) + { + + CIELuv v; + + double denominator = (-2 * x + 12 * y + 3); + double up = 4 * x / denominator; + double vp = 9 * y / denominator; + + double Yd = Y / Yn; + v.L = Yd > System.Math.Pow(6 / 29, 3) ? 116 * System.Math.Pow(Yd, 3) : System.Math.Pow(29 / 3, 3) * Yd; + v.u = 13 * v.L * (up - 0.2009); + v.v = 13 * v.L * (vp - 0.4610); + + return v; + } + } + + /* L*u*v* + * CIE 1976 + * standard illuminant C + */ + public struct CIELuv + { + public double L, u, v; + + } + + public struct CIELab + { + public double L, a, b; + + } + + } +} \ No newline at end of file diff --git a/test4/PsychlopsMain.cs b/test4/PsychlopsMain.cs index ad9a4c1..71d18a5 100644 --- a/test4/PsychlopsMain.cs +++ b/test4/PsychlopsMain.cs @@ -9,6 +9,9 @@ namespace PsychlopsSilverlightApp public void psychlops_main() { + Psychlops.ColorSpaces.CIERGB rgb = new Psychlops.ColorSpaces.CIERGB { R = 1, G = 1, B = 1 }; + var xyz = rgb.convertToCIEXYZ(); + Canvas window = new Canvas(300,300); Rectangle figure = new Rectangle(); @@ -38,6 +41,8 @@ namespace PsychlopsSilverlightApp figure.shift(motion_dir * 1, motion_dir * 0); figure.draw(); + + window.msg(xyz.Y.ToString(), 100, 100); window.flip(); frame++; diff --git a/test4/PsychlopsSilverlight4test.csproj b/test4/PsychlopsSilverlight4test.csproj index 44c62e0..9d816f2 100644 --- a/test4/PsychlopsSilverlight4test.csproj +++ b/test4/PsychlopsSilverlight4test.csproj @@ -62,9 +62,6 @@ 4 - - ..\dev4\Bin\Release\PsychlopsSilverlight4.dll - @@ -111,6 +108,12 @@ + + + {58F3CEF1-8123-4105-9525-B7E2C7F188AC} + PsychlopsSilverlight4 + +