// 参照光源はD65光源 CIE 1931 standard observer 2°
        static LabStar XYZtoLabStar(XYZ xyz)
        {
            float refX = 95.047f;
            float refY = 100.000f;
            float refZ = 108.883f;

            var x = xyz.x / refX;
            var y = xyz.y / refY;
            var z = xyz.z / refZ;

            if (x > 0.008856f)
            {
                x = (float)Math.Pow(x, 1.0f / 3.0f);
            }
            else
            {
                x = (7.787f * x) + (16.0f / 116.0f);
            }
            if (y > 0.008856f)
            {
                y = (float)Math.Pow(y, 1.0f / 3.0f);
            }
            else
            {
                y = (7.787f * y) + (16.0f / 116.0f);
            }
            if (z > 0.008856f)
            {
                z = (float)Math.Pow(z, 1.0f / 3.0f);
            }
            else
            {
                z = (7.787f * z) + (16.0f / 116.0f);
            }

            var lab = new LabStar();

            lab.L = (116.0f * y) - 16.0f;
            lab.a = 500.0f * (x - y);
            lab.b = 200.0f * (y - z);
            return(lab);
        }
        private void Window_Loaded(object sender, RoutedEventArgs eventArgs)
        {
#if DISP_ASTAR_LSTAR
            // a*L*平面。L軸は0~100なので
            float originOffsetX = 400;
            float originOffsetY = 800;

            labelAxisA.Content = "a*→";
            labelAxisA.Margin  = new Thickness(700, 200, 0, 0);
            labelAxisB.Content = "↑L*";
            labelAxisB.Margin  = new Thickness(400, 100, 0, 0);
            labelOrigin.Margin = new Thickness(400, 766, 0, 0);
#else
            // a*b*平面
            float originOffsetX = 400;
            float originOffsetY = 400;
            labelAxisA.Content = "a*";
            labelAxisA.Margin  = new Thickness(763, 400, 0, 0);
            labelAxisB.Content = "b*";
            labelAxisB.Margin  = new Thickness(400, 6, 0, 0);
            labelOrigin.Margin = new Thickness(400, 400, 0, 0);
#endif

            rectangleV.Height = canvas1.Height;
            rectangleV.Margin = new Thickness(originOffsetX, 0, 0, 0);

            rectangleH.Width  = canvas1.Width;
            rectangleH.Margin = new Thickness(0, originOffsetY, 0, 0);

            var rgbHash = new HashSet <int>();

            var colors = new List <ColorPatch> [SEGMENT_NUM];
            for (int i = 0; i < SEGMENT_NUM; ++i)
            {
                colors[i] = new List <ColorPatch>();
            }
            for (int i = 0; i < colorTable.Length / 3; ++i)
            {
                byte r = colorTable[i * 3];
                byte g = colorTable[i * 3 + 1];
                byte b = colorTable[i * 3 + 2];
                var  c = Color.FromRgb(r, g, b);

                RGB rgb = new RGB();
                rgb.Set(r, g, b);
                LabStar lab = XYZtoLabStar(RGBtoXYZ(rgb));

                var cp = new ColorPatch();
                cp.id  = i;
                cp.rgb = rgb;
                cp.lab = lab;

                colors[i / COLOR_NUM_PER_SEGMENT].Add(cp);

                Ellipse e = new Ellipse();
                e.Fill   = new SolidColorBrush(c);
                e.Height = 16;
                e.Width  = 16;

#if DISP_ASTAR_LSTAR
                // a*L*平面
                var pos = new Thickness((lab.a) * 10 + originOffsetX, (-lab.L) * 10 + originOffsetY, 0, 0);
#else
                // a*b*平面
                var pos = new Thickness((lab.a) * 10 + originOffsetX, (-lab.b) * 10 + originOffsetY, 0, 0);
#endif

                e.Margin = pos;
                canvas1.Children.Add(e);
                Canvas.SetZIndex(e, -1);

                bool collision = false;
                int  hashValue = r * 65536 + g * 256 + b;
                if (rgbHash.Contains(hashValue))
                {
                    collision = true;
                }
                rgbHash.Add(hashValue);

                Label l = new Label();
                l.Content    = string.Format("{0}", i + 1);
                l.FontSize   = 8;
                l.Foreground = new SolidColorBrush(Colors.White);

                l.Margin = pos;
                if (collision)
                {
                    l.Margin = new Thickness(pos.Left, pos.Top + l.FontSize, pos.Right, pos.Bottom);
                }

                canvas1.Children.Add(l);
            }

            for (int segment = 0; segment < SEGMENT_NUM; ++segment)
            {
                for (int i = 0; i < COLOR_NUM_PER_SEGMENT; ++i)
                {
                    var cpFrom = colors[segment].ElementAt(i);
                    var cpSort = new Dictionary <float, ColorPatch>();
                    for (int j = 0; j < COLOR_NUM_PER_SEGMENT; ++j)
                    {
                        if (i == j)
                        {
                            continue;
                        }
                        var cpTo = colors[segment].ElementAt(j);
                        cpSort.Add(cpFrom.lab.DistanceSquared(cpTo.lab), cpTo);
                    }

                    var sorted = (from entry in cpSort orderby entry.Key ascending select entry).ToDictionary(pair => pair.Key, pair => pair.Value);
                    var e      = sorted.GetEnumerator();
                    e.MoveNext();
                    cpFrom.neighbor = e.Current.Value;
                    e.MoveNext();
                    cpFrom.neighbor2 = e.Current.Value;
                    e.MoveNext();
                    cpFrom.neighbor3 = e.Current.Value;
                }
            }

            Console.WriteLine("graph g {");
            Console.WriteLine("    graph [bgcolor=\"#484848\"]");
            Console.WriteLine("    node [style=filled, fontsize=32, fontcolor=white]");
            Console.WriteLine("    edge [fontsize=32, fontcolor=white]");
            Console.WriteLine("    rankdir=LR;");

            for (int segment = 0; segment < SEGMENT_NUM; ++segment)
            {
                Console.WriteLine("    subgraph cluster{0} {{", segment);
                Console.WriteLine("        style=invis;");

                for (int i = 0; i < COLOR_NUM_PER_SEGMENT; ++i)
                {
                    var cp = colors[segment].ElementAt(i);

                    string shape = "color=\"#484848\", shape=ellipse";
                    if (i == 0 || i == COLOR_NUM_PER_SEGMENT - 1)
                    {
                        shape = ", color=white, shape=doublecircle";
                    }

                    Console.WriteLine("        {4} [fillcolor=\"#{0:x2}{1:x2}{2:x2}\"{3}];",
                                      (int)(cp.rgb.r),
                                      (int)(cp.rgb.g),
                                      (int)(cp.rgb.b),
                                      shape,
                                      cp.id + 1); //< ★★★★★ 要注意 1足して表示 ★★★★★
                }

                for (int i = 0; i < COLOR_NUM_PER_SEGMENT; ++i)
                {
                    var cp = colors[segment].ElementAt(i);
                    WriteLink(segment * COLOR_NUM_PER_SEGMENT, colors[segment], cp.id, cp.neighbor.id, "style=bold,  ");
                    WriteLink(segment * COLOR_NUM_PER_SEGMENT, colors[segment], cp.id, cp.neighbor2.id, "             ");
                    WriteLink(segment * COLOR_NUM_PER_SEGMENT, colors[segment], cp.id, cp.neighbor3.id, "style=dotted,");
                }
                Console.WriteLine("    }");
            }


            Console.WriteLine("}");
        }
 public float Distance(LabStar rhs)
 {
     return((float)Math.Sqrt(DistanceSquared(rhs)));
 }
 public float DistanceSquared(LabStar rhs)
 {
     return((L - rhs.L) * (L - rhs.L) +
            (a - rhs.a) * (a - rhs.a) +
            (b - rhs.b) * (b - rhs.b));
 }
Beispiel #5
0
 public float DistanceSquared(LabStar rhs)
 {
     return (L - rhs.L) * (L - rhs.L) +
         (a - rhs.a) * (a - rhs.a) +
         (b - rhs.b) * (b - rhs.b);
 }
Beispiel #6
0
 public float Distance(LabStar rhs)
 {
     return (float)Math.Sqrt(DistanceSquared(rhs));
 }
Beispiel #7
0
        // 参照光源はD65光源 CIE 1931 standard observer 2°
        static LabStar XYZtoLabStar(XYZ xyz)
        {
            float refX = 95.047f;
            float refY = 100.000f;
            float refZ = 108.883f;

            var x = xyz.x / refX;
            var y = xyz.y / refY;
            var z = xyz.z / refZ;

            if (x > 0.008856f) { x = (float)Math.Pow(x, 1.0f / 3.0f); } else { x = (7.787f * x) + (16.0f / 116.0f); }
            if (y > 0.008856f) { y = (float)Math.Pow(y, 1.0f / 3.0f); } else { y = (7.787f * y) + (16.0f / 116.0f); }
            if (z > 0.008856f) { z = (float)Math.Pow(z, 1.0f / 3.0f); } else { z = (7.787f * z) + (16.0f / 116.0f); }

            var lab = new LabStar();
            lab.L = (116.0f * y) - 16.0f;
            lab.a = 500.0f * (x - y);
            lab.b = 200.0f * (y - z);
            return lab;
        }