예제 #1
0
파일: Run.cs 프로젝트: ohomola/gears
        public override object DoRun()
        {
            List <IAnswer> answers = new List <IAnswer>();

            var remainingSteps = Interpreter2.Plan.Count() - Interpreter.Iterator.Index;
            int count          = Math.Min(remainingSteps, Count);

            for (int i = 0; i < count; i++)
            {
                ConsoleView.Render(ConsoleColor.DarkGray, $"Starting step {Interpreter.Iterator.Index + 1})\t{Interpreter.Iterator.Current}");

                var answer = Interpreter2.Please(string.Empty);
                answers.Add(answer);

                //ConsoleView.Render(ConsoleColor.DarkGray, $"Finished step {Interpreter.Iterator.Index })\t{Interpreter.Iterator.Previous}\n{Interpreter.Iterator.Previous.Status}");
                ConsoleView.Render(Interpreter.Please("status"));

                if (UserInteropAdapter.IsKeyDown(Keys.Escape))
                {
                    Interpreter.IsDebugMode = true;
                    return("Escape pressed. Interrupting...");
                }
            }

            if (answers.Any(x => x is INegativeAnswer))
            {
                var baseAnswer = new ExceptionAnswer($"Ran {count} step{(count == 1 ? "" : "s")}.");
                baseAnswer.Children = answers;
                return(baseAnswer);
            }
            else
            {
                var baseAnswer = new SuccessAnswer($"Ran {count} step{(count == 1 ? "" : "s")}.");
                baseAnswer.Children = answers;
                return(baseAnswer);
            }
        }
예제 #2
0
    public static (List <List <IShape> >, List <(IShape, List <IShape>)>) Run(int min, int max, uint times)
    {
        Rules rules = new Rules();

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(0f))
                ),
            (Quad quad) => {
            Vertex b1 = quad.l1.Bisect();
            Vertex b2 = quad.l2.Bisect();
            Vertex b3 = quad.l3.Bisect();
            Vertex b4 = quad.l4.Bisect();

            Vertex c = (b1 + b2 + b3 + b4) / 4f;

            Quad q4 = new Quad(rules, quad.Attributes.Copy(), (0, 0), (b4, c, b3, quad.v4));
            Quad q1 = new Quad(rules, quad.Attributes.Copy(), (1, 0), (quad.v1, b1, c, b4));
            Quad q3 = new Quad(rules, quad.Attributes.Copy(), (0, 1), (c, b2, quad.v3, b3));
            Quad q2 = new Quad(rules, quad.Attributes.Copy(), (1, 1), (b1, quad.v2, b2, c));

            return(new List <IShape> {
                q1, q2, q3, q4
            });
        });

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(1f))
                ),
            (Quad quad) => {
            Vertex th = quad.l1.Bisect();

            Triad t1 = new Triad(rules, quad.Attributes.Copy(), (quad.v1, th, quad.v4));
            Triad t2 = new Triad(rules, quad.Attributes.Copy(), (quad.v4, th, quad.v3));
            Triad t3 = new Triad(rules, quad.Attributes.Copy(), (th, quad.v2, quad.v3));

            return(new List <IShape> {
                t1, t2, t3
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(2f))
                ),
            (Quad quad) => {
            Vertex[] v1 = quad.l1.Sections(2);
            Vertex[] v2 = quad.l3.Sections(2);

            Attributes na = quad.Attributes.Copy();
            na.Set("Wave", new ScalarAttribute(3f));

            Quad q1 = new Quad(rules, na.Copy(), (quad.v1, v1[1], v2[0], quad.v4));
            Quad q2 = new Quad(rules, na.Copy(), (v1[1], v1[0], v2[1], v2[0]));
            Quad q3 = new Quad(rules, na.Copy(), (v1[0], quad.v2, quad.v3, v2[1]));

            return(new List <IShape> {
                q1, q2, q3
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(3f))
                ),
            (Quad quad) => {
            return(new List <IShape>());
        }
            );

        rules.AddRule(
            new Attributes(
                ("Wave", new ScalarAttribute(4f))
                ),
            (Quad quad) => {
            Vertex[] v1 = quad.l1.Sections(2);
            Vertex[] v2 = quad.l2.Sections(2);
            Vertex[] v3 = quad.l3.Sections(2);
            Vertex[] v4 = quad.l4.Sections(2);

            Vertex c1 = v1[1] * 0.75f + v2[0] * 0.25f;
            Vertex c2 = v1[1] * 0.25f + v2[0] * 0.75f;
            Vertex c3 = v3[1] * 0.75f + v4[0] * 0.25f;
            Vertex c4 = v3[1] * 0.25f + v4[0] * 0.75f;

            Attributes qa = quad.Attributes.Copy();
            qa.Set("Wave", new ScalarAttribute(3f));

            // Quads
            // Quad q1 = new Quad(rules, qa.Copy(), (v1[0], c1, c4, v4[1]));
            // Quad q2 = new Quad(rules, qa.Copy(), (c1, v1[1], v2[0], c2));
            // Quad q3 = new Quad(rules, qa.Copy(), (v3[0], c3, c2, v2[1]));
            // Quad q4 = new Quad(rules, qa.Copy(), (v4[0], c4, c3, v3[1]));
            // Quad q5 = new Quad(rules, qa.Copy(), (c1, c2, c3, c4));

            // Triangles
            Triad t1 = new Triad(rules, qa.Copy(), (quad.v1, v1[1], v4[0]));
            Triad t2 = new Triad(rules, qa.Copy(), (v1[1], v1[0], c1));
            Triad t3 = new Triad(rules, qa.Copy(), (v1[0], quad.v2, v2[1]));
            Triad t4 = new Triad(rules, qa.Copy(), (c2, v2[1], v2[0]));
            Triad t5 = new Triad(rules, qa.Copy(), (v3[1], v2[0], quad.v3));
            Triad t6 = new Triad(rules, qa.Copy(), (v3[0], c3, v3[1]));
            Triad t7 = new Triad(rules, qa.Copy(), (quad.v4, v4[1], v3[0]));
            Triad t8 = new Triad(rules, qa.Copy(), (v4[1], v4[0], c4));

            // return new List<IShape> {q1, q2, q3, q4, t1, t2, t3, t4, t5, t6, t7, t8};
            return(new List <IShape> {
                t1, t2, t3, t4, t5, t6, t7, t8
            });
        }
            );

        rules.AddRule(null, (Triad triad) => {
            return(new List <IShape>());
        });

        Quad start = new Quad(
            rules,
            new Attributes(
                ("Wave", new ScalarAttribute(0f))
                ),
            (new Vertex(min, max),
             new Vertex(max, max),
             new Vertex(max, min),
             new Vertex(min, min))
            );

        // Define the control grammar
        Control control = new Control();

        // Add a simple control grammar that evokes WFC1
        control.Grammar.AddRule("S", ((0, 0), "WFC1"));

        // Add a WFC
        control.AddWFC("WFC1");
        control.WFC["WFC1"].AddRule("A", ("Wave", 0f, "S"), 1f, "B", "C");
        control.WFC["WFC1"].AddRule("B", ("Wave", 1f, ""), 1f, "A", "C", "D");
        control.WFC["WFC1"].AddRule("C", ("Wave", 2f, ""), 1f, "A", "B", "D");
        control.WFC["WFC1"].AddRule("D", ("Wave", 4f, ""), 1f, "B", "C");

        start.Control.Add("S");

        // List<IShape> shapes = Interpreter.Interpret(start, 10);
        List <List <IShape> > shapes = Interpreter2.Interpret(start, rules, control, times);

        return(shapes, rules.RuleExamples(100f));
    }
예제 #3
0
    public static (List <List <IShape> >, List <(IShape, List <IShape>)>) Run(int min, int max, uint times)
    {
        Rules rules = new Rules();

        rules.AddRule(
            new Attributes(
                ("Diamond", new ScalarAttribute(1f))
                ),
            (Quad quad) => {
            Vertex nv1 = quad.l1.Bisect(0.5f);
            Vertex nv2 = quad.l2.Bisect(0.5f);
            Vertex nv3 = quad.l3.Bisect(0.5f);
            Vertex nv4 = quad.l4.Bisect(0.5f);

            // A quad with the vertices as bipartitions of original's edges
            Attributes attrs = new Attributes(quad.Attributes);
            if (quad.Attributes.Get("Angle").Start == 1f)
            {
                attrs.Set("Angle", new ScalarAttribute(0f));
            }


            else
            {
                attrs.Set("Angle", new ScalarAttribute(1f));
            }

            Quad q = new Quad(
                rules,
                attrs,
                (1, 0),
                (nv1, nv2, nv3, nv4)
                );

            // Triangles
            Triad t1 = new Triad(rules, quad.Attributes.Copy(), (0, 0), (nv1, quad.v2, nv2));
            Triad t2 = new Triad(rules, quad.Attributes.Copy(), (0, 1), (nv2, quad.v3, nv3));
            Triad t3 = new Triad(rules, quad.Attributes.Copy(), (0, 2), (nv3, quad.v4, nv4));
            Triad t4 = new Triad(rules, quad.Attributes.Copy(), (0, 3), (nv4, quad.v1, nv1));

            return(new List <IShape> {
                q, t1, t2, t3, t4
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Angle", new ScalarAttribute(0f))
                ),

            (Quad quad) => {
            Vertex[] nv1 = quad.l1.Sections(3);
            Vertex[] nv2 = quad.l3.Sections(3);

            Quad q1 = new Quad(rules, quad.Attributes.Copy(), (0, 0), (quad.v1, nv1[2], nv2[0], quad.v4));
            Quad q2 = new Quad(rules, quad.Attributes.Copy(), (1, 0), (nv1[2], nv1[1], nv2[1], nv2[0]));
            Quad q3 = new Quad(rules, quad.Attributes.Copy(), (2, 0), (nv1[1], nv1[0], nv2[2], nv2[1]));
            Quad q4 = new Quad(rules, quad.Attributes.Copy(), (3, 0), (nv1[0], quad.v2, quad.v3, nv2[2]));

            return(new List <IShape> {
                q1, q2, q3, q4
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Angle", new ScalarAttribute(1f))
                ),

            (Quad quad) => {
            Vertex nv1 = quad.l1.Bisect(0.5f);
            Vertex nv2 = quad.l3.Bisect(0.5f);

            Quad q1 = new Quad(rules, quad.Attributes.Copy(), (0, 0), (quad.v1, nv1, nv2, quad.v4));
            Quad q2 = new Quad(rules, quad.Attributes.Copy(), (1, 0), (nv1, quad.v2, quad.v3, nv2));

            return(new List <IShape> {
                q1, q2
            });
        }
            );

        rules.AddRule(null, (Triad triad) => {
            return(new List <IShape> {
                new Epsilon()
            });
        });

        rules.AddRule(null, (Triad triad) => {
            return(new List <IShape>());
        });

        Quad start = new Quad(
            rules,
            new Attributes(
                ("Angle", new ScalarAttribute(0f)),
                ("Diamond", new ScalarAttribute(0f))
                ),
            (new Vertex(min, max),
             new Vertex(max, max),
             new Vertex(max, min),
             new Vertex(min, min))
            );

        start.Control.Add("A");

        // Define the control grammar
        Control control = new Control();

        control.Grammar.AddRule("A", new string[] { "N", "Y", "Y" });
        control.Grammar.AddRule("N", ((~0u, 0), "Diamond", 0f, ""));
        control.Grammar.AddRule("Y", ((1, 0), "Diamond", 1f, "A"));
        control.Grammar.AddRule("Y", ((2, 0), "Diamond", 1f, "A"));

        // List<IShape> shapes = Interpreter.Interpret(start, 10);
        List <List <IShape> > shapes = Interpreter2.Interpret(start, rules, control, times);

        return(shapes, null);
    }