Exemple #1
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(

                ),
            (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));

            if (quad.VC == null || !quad.VC.Persistant)
            {
                VirtualConnection.Connect(q4, q1, false, false, true);
                VirtualConnection.Connect(q3, q2, true, false, true);
            }

            return(new List <IShape> {
                q1, q2, q3, q4
            });
        }
Exemple #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(
                ("Floors", new ScalarAttribute(3f))
                ),
            (Start start) => {
            Vertex[] v1 = start.l2.Sections(0.3f, 0.65f);
            Vertex[] v2 = start.l4.Sections(0.35f, 0.7f);

            Floor f1 = new Floor(rules, start.Attributes.Copy(), (0, 2), (start.v1, start.v2, v1[1], v2[0]));
            Floor f2 = new Floor(rules, start.Attributes.Copy(), (0, 1), (v2[0], v1[1], v1[0], v2[1]));
            Floor f3 = new Floor(rules, start.Attributes.Copy(), (0, 0), (v2[1], v1[0], start.v3, start.v4));

            return(new List <IShape> {
                f1, f2, f3
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Floors", new ScalarAttribute(2f)),
                ("Wide", new ScalarAttribute(0f))
                ),
            (Start start) => {
            Vertex[] v1 = start.l1.Sections(4);
            Vertex[] v2 = start.l3.Sections(4);

            Attributes a = start.Attributes.Copy();
            a.Set("RoofSlanted", new ScalarAttribute(1f));

            Vertical s1 = new Vertical(rules, a.Copy(), (0, 0), (start.v1, v1[3], v2[0], start.v4));
            Vertical s2 = new Vertical(rules, start.Attributes.Copy(), (1, 0), (v1[3], v1[2], v2[1], v2[0]));
            Vertical s3 = new Vertical(rules, start.Attributes.Copy(), (2, 0), (v1[2], v1[1], v2[2], v2[1]));
            Vertical s4 = new Vertical(rules, start.Attributes.Copy(), (3, 0), (v1[1], v1[0], v2[3], v2[2]));
            Vertical s5 = new Vertical(rules, a.Copy(), (4, 0), (v1[0], start.v2, start.v3, v2[3]));

            VirtualConnection.Connect(s1, s5, true, false, true);

            return(new List <IShape> {
                s1, s2, s3, s4, s5
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Floors", new ScalarAttribute(2f)),
                ("Wide", new ScalarAttribute(1f))
                ),
            (Start start) => {
            Vertex[] v1 = start.l1.Sections(10);
            Vertex[] v2 = start.l3.Sections(10);

            Vertical s1  = new Vertical(rules, start.Attributes.Copy(), (0, 0), (start.v1, v1[9], v2[0], start.v4));
            Vertical s2  = new Vertical(rules, start.Attributes.Copy(), (1, 0), (v1[9], v1[8], v2[1], v2[0]));
            Vertical s3  = new Vertical(rules, start.Attributes.Copy(), (2, 0), (v1[8], v1[7], v2[2], v2[1]));
            Vertical s4  = new Vertical(rules, start.Attributes.Copy(), (3, 0), (v1[7], v1[6], v2[3], v2[2]));
            Vertical s5  = new Vertical(rules, start.Attributes.Copy(), (4, 0), (v1[6], v1[5], v2[4], v2[3]));
            Vertical s6  = new Vertical(rules, start.Attributes.Copy(), (5, 0), (v1[5], v1[4], v2[5], v2[4]));
            Vertical s7  = new Vertical(rules, start.Attributes.Copy(), (6, 0), (v1[4], v1[3], v2[6], v2[5]));
            Vertical s8  = new Vertical(rules, start.Attributes.Copy(), (7, 0), (v1[3], v1[2], v2[7], v2[6]));
            Vertical s9  = new Vertical(rules, start.Attributes.Copy(), (8, 0), (v1[2], v1[1], v2[8], v2[7]));
            Vertical s10 = new Vertical(rules, start.Attributes.Copy(), (9, 0), (v1[1], v1[0], v2[9], v2[8]));
            Vertical s11 = new Vertical(rules, start.Attributes.Copy(), (10, 0), (v1[0], start.v2, start.v3, v2[9]));

            return(new List <IShape> {
                s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Vertical vertical) => {
            Vertex[] v1 = vertical.l2.Sections(0.3f, 0.65f);
            Vertex[] v2 = vertical.l4.Sections(0.35f, 0.7f);

            Section s1 = new Section(rules, vertical.Attributes.Copy(), (0, 2), (vertical.v1, vertical.v2, v1[1], v2[0]));
            Section s2 = new Section(rules, vertical.Attributes.Copy(), (0, 1), (v2[0], v1[1], v1[0], v2[1]));
            Roof r     = new Roof(rules, vertical.Attributes.Copy(), (0, 0), (v2[1], v1[0], vertical.v3, vertical.v4));

            return(new List <IShape> {
                s1, s2, r
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSlanted", new ScalarAttribute(1f))
                ),
            (Vertical vertical) => {
            Vertex[] v1 = vertical.l2.Sections(0.3f, 0.65f);
            Vertex[] v2 = vertical.l4.Sections(0.35f, 0.7f);

            Section s = new Section(rules, vertical.Attributes.Copy(), (0, 2), (vertical.v1, vertical.v2, v1[1], v2[0]));
            Roof r    = new Roof(rules, vertical.Attributes.Copy(), (0, 1), (v2[0], v1[1], v1[0], v2[1]));

            return(new List <IShape> {
                s, r
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSlanted", new ScalarAttribute(1f))
                ),
            (Roof roof) => {
            Vertex v = roof.l2.Bisect();
            Triad t  = new Triad(rules, roof.Attributes.Copy(), (0, 0), (v, roof.v1, roof.v2));

            return(new List <IShape> {
                t
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSize", new ScalarAttribute(1f)),
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Roof roof) => {
            Vertex v1 = roof.l2.Bisect(0.6f);
            Vertex v2 = roof.l4.Bisect(0.4f);

            Quad q = new Quad(rules, roof.Attributes.Copy(), (0, 0), (roof.v2, v1, v2, roof.v1));

            return(new List <IShape> {
                q
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSize", new ScalarAttribute(2f)),
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Roof roof) => {
            Vertex v1 = roof.l2.Bisect(0.7f);
            Vertex v2 = roof.l4.Bisect(0.3f);

            Quad q = new Quad(rules, roof.Attributes.Copy(), (0, 0), (roof.v2, v1, v2, roof.v1));

            return(new List <IShape> {
                q
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("RoofSize", new ScalarAttribute(3f)),
                ("RoofSlanted", new ScalarAttribute(0f))
                ),
            (Roof roof) => {
            Vertex v1 = roof.l2.Bisect(0.8f);
            Vertex v2 = roof.l4.Bisect(0.2f);

            Quad q = new Quad(rules, roof.Attributes.Copy(), (0, 0), (roof.v2, v1, v2, roof.v1));

            return(new List <IShape> {
                q
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Sections", new ScalarAttribute(5f))
                ),
            (Floor floor) => {
            Vertex[] v1 = floor.l1.Sections(4);
            Vertex[] v2 = floor.l3.Sections(4);

            Section s1 = new Section(rules, floor.Attributes.Copy(), (0, 0), (floor.v1, v1[3], v2[0], floor.v4));
            Section s2 = new Section(rules, floor.Attributes.Copy(), (1, 0), (v1[3], v1[2], v2[1], v2[0]));
            Section s3 = new Section(rules, floor.Attributes.Copy(), (2, 0), (v1[2], v1[1], v2[2], v2[1]));
            Section s4 = new Section(rules, floor.Attributes.Copy(), (3, 0), (v1[1], v1[0], v2[3], v2[2]));
            Section s5 = new Section(rules, floor.Attributes.Copy(), (4, 0), (v1[0], floor.v2, floor.v3, v2[3]));

            return(new List <IShape> {
                s1, s2, s3, s4, s5
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Sections", new ScalarAttribute(4f))
                ),
            (Floor floor) => {
            Vertex[] v1 = floor.l1.Sections(3);
            Vertex[] v2 = floor.l3.Sections(3);

            Section s1 = new Section(rules, floor.Attributes.Copy(), (0, 0), (floor.v1, v1[2], v2[0], floor.v4));
            Section s2 = new Section(rules, floor.Attributes.Copy(), (1, 0), (v1[2], v1[1], v2[1], v2[0]));
            Section s3 = new Section(rules, floor.Attributes.Copy(), (2, 0), (v1[1], v1[0], v2[2], v2[1]));
            Section s4 = new Section(rules, floor.Attributes.Copy(), (4, 0), (v1[0], floor.v2, floor.v3, v2[2]));

            return(new List <IShape> {
                s1, s2, s3, s4
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Door", new ScalarAttribute(0f)),
                ("Corn", new ScalarAttribute(1f)),
                ("Bar", new ScalarAttribute(1f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l2.Sections(0.1f, 0.85f);
            Vertex[] v2 = section.l4.Sections(0.15f, 0.9f);

            Attributes a = section.Attributes.Copy();
            a.Set("Corn", new ScalarAttribute(0f));
            a.Set("Bar", new ScalarAttribute(0f));

            Attributes b = a.Copy();
            b.Set("R", new ScalarAttribute(255f));
            b.Set("G", new ScalarAttribute(255f));
            b.Set("B", new ScalarAttribute(255f));

            Cornice c = new Cornice(rules, b.Copy(), (0, 0), (section.v1, section.v2, v1[1], v2[0]));
            Section s = new Section(rules, a, (0, 1), (v2[0], v1[1], v1[0], v2[1]));
            Bar bar   = new Bar(rules, b.Copy(), (0, 2), (v2[1], v1[0], section.v3, section.v4));

            return(new List <IShape> {
                c, s, bar
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Door", new ScalarAttribute(0f)),
                ("Corn", new ScalarAttribute(1f)),
                ("Bar", new ScalarAttribute(0f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l2.Sections(0.1f);
            Vertex[] v2 = section.l4.Sections(0.9f);

            Attributes a = section.Attributes.Copy();
            a.Set("Corn", new ScalarAttribute(0f));
            a.Set("Bar", new ScalarAttribute(0f));

            Attributes b = a.Copy();
            b.Set("R", new ScalarAttribute(255f));
            b.Set("G", new ScalarAttribute(255f));
            b.Set("B", new ScalarAttribute(255f));

            Section s = new Section(rules, a, (0, 0), (section.v1, section.v2, v1[0], v2[0]));
            Cornice c = new Cornice(rules, b, (0, 1), (v2[0], v1[0], section.v3, section.v4));

            return(new List <IShape> {
                s, c
            });
        }
            );

        rules.AddRule(
            new Attributes(
                ("Corn", new ScalarAttribute(0f)),
                ("Bar", new ScalarAttribute(0f)),
                ("Door", new ScalarAttribute(0f)),
                ("Sections", new ScalarAttribute(4f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l1.Sections(0.25f, 0.75f);
            Vertex[] v2 = section.l3.Sections(0.25f, 0.75f);

            Line l1 = new Line(v1[0], v2[1]);
            Line l2 = new Line(v1[1], v2[0]);

            Vertex[] v3 = l1.Sections(0.1f, 0.82f);
            Vertex[] v4 = l2.Sections(0.1f, 0.82f);

            Quad q1 = new Quad(rules, section.Attributes.Copy(), (0, 0), (section.v1, section.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, section.Attributes.Copy(), (0, 2), (v1[0], v2[1], section.v3, section.v2));

            Quad q3 = new Quad(rules, section.Attributes.Copy(), (0, 3), (v2[0], v4[0], v3[0], v2[1]));
            Quad q4 = new Quad(rules, section.Attributes.Copy(), (0, 4), (v1[1], v4[1], v3[1], v1[0]));

            Attributes a = section.Attributes.Copy();
            a.Set("R", new ScalarAttribute(255f));
            a.Set("G", new ScalarAttribute(255f));
            a.Set("B", new ScalarAttribute(255f));

            Window w = new Window(rules, a, (1, 0), (v4[0], v4[1], v3[1], v3[0]));

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

        rules.AddRule(
            new Attributes(
                ("Corn", new ScalarAttribute(0f)),
                ("Bar", new ScalarAttribute(0f)),
                ("Door", new ScalarAttribute(0f)),
                ("Sections", new ScalarAttribute(5f)),
                ("Stairs", new ScalarAttribute(0f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l1.Sections(0.2f, 0.8f);
            Vertex[] v2 = section.l3.Sections(0.2f, 0.8f);

            Line l1 = new Line(v1[0], v2[1]);
            Line l2 = new Line(v1[1], v2[0]);

            Vertex[] v3 = l1.Sections(0.1f, 0.82f);
            Vertex[] v4 = l2.Sections(0.1f, 0.82f);

            Quad q1 = new Quad(rules, section.Attributes.Copy(), (0, 0), (section.v1, section.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, section.Attributes.Copy(), (0, 2), (v1[0], v2[1], section.v3, section.v2));

            Quad q3 = new Quad(rules, section.Attributes.Copy(), (0, 3), (v2[0], v4[0], v3[0], v2[1]));
            Quad q4 = new Quad(rules, section.Attributes.Copy(), (0, 4), (v1[1], v4[1], v3[1], v1[0]));

            Window w = new Window(rules, section.Attributes.Copy(), (1, 0), (v4[0], v4[1], v3[1], v3[0]));

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

        rules.AddRule(
            new Attributes(
                ("Stairs", new ScalarAttribute(1f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l1.Sections(0.15f, 0.85f);
            Vertex[] v2 = section.l3.Sections(0.15f, 0.85f);

            Quad q1 = new Quad(rules, section.Attributes.Copy(), (0, 0), (section.v1, section.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, section.Attributes.Copy(), (0, 2), (v1[0], v2[1], section.v3, section.v2));

            Window w = new Window(rules, section.Attributes.Copy(), (1, 0), (v2[0], v1[1], v1[0], v2[1]));

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

        rules.AddRule(
            new Attributes(
                ("Door", new RangeAttribute(1f, 2f))
                ),
            (Section section) => {
            Vertex[] v1 = section.l2.Sections(0.20f, 0.25f);
            Vertex[] v2 = section.l4.Sections(0.75f, 0.8f);

            Line l = new Line(v1[1], v2[0]);

            Vertex[] v3 = l.Sections(0.07f, 0.93f);
            Vertex[] v4 = section.l1.Sections(0.07f, 0.93f);


            // Upper area
            Door door  = new Door(rules, section.Attributes.Copy(), (1, 0), (v4[1], v4[0], v3[1], v3[0]));
            Quad mid   = new Quad(rules, section.Attributes.Copy(), (2, 0), (v2[0], v1[1], v1[0], v2[1]));
            Quad upper = new Quad(rules, section.Attributes.Copy(), (3, 0), (v2[1], v1[0], section.v3, section.v4));

            // Sides
            Quad side1 = new Quad(rules, section.Attributes.Copy(), (0, 1), (section.v1, v2[0], v3[0], v4[1]));
            Quad side2 = new Quad(rules, section.Attributes.Copy(), (1, 1), (section.v2, v4[0], v3[1], v1[1]));

            return(new List <IShape> {
                door, mid, upper, side1, side2
            });
        }
            );

        rules.AddRule(
            new Attributes(

                ),
            (Window window) => {
            Vertex[] v1 = window.l1.Sections(0.05f, 0.95f);
            Vertex[] v2 = window.l3.Sections(0.05f, 0.95f);

            Line l1 = new Line(v1[0], v2[1]);
            Line l2 = new Line(v1[1], v2[0]);

            Vertex[] v3 = l1.Sections(0.1f, 0.9f);
            Vertex[] v4 = l2.Sections(0.1f, 0.9f);

            Quad q1 = new Quad(rules, window.Attributes.Copy(), (0, 0), (window.v1, window.v4, v2[0], v1[1]));
            Quad q2 = new Quad(rules, window.Attributes.Copy(), (0, 2), (v1[0], v2[1], window.v3, window.v2));

            Quad q3 = new Quad(rules, window.Attributes.Copy(), (0, 3), (v2[0], v4[0], v3[0], v2[1]));
            Quad q4 = new Quad(rules, window.Attributes.Copy(), (0, 4), (v1[1], v4[1], v3[1], v1[0]));

            Glass g = new Glass(rules, window.Attributes.Copy(), (1, 0), (v4[0], v4[1], v3[1], v3[0]));

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