Exemplo n.º 1
0
        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("}");
        }