示例#1
0
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_Empty source = (ME_Empty)sourceElement;

        // Get Radius
        float minRadius = source.SvgDocument.Width * MinRadius;
        float maxRadius = source.SvgDocument.Width * MaxRadius;

        Radius = (float)random.NextDouble() * (maxRadius - minRadius) + minRadius;

        // Element ids
        CircleId = MandalaElement.ElementId++;
    }
示例#2
0
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Empty source = (ME_Empty)sourceElement;

        SvgPath svgPath = new SvgPath()
        {
            Fill        = new SvgColourServer(Color.Black),
            StrokeWidth = 0
        };

        svgPath.PathData = new SvgPathSegmentList();


        float            startX       = 420;
        float            startY       = 420;
        PointF           startPoint   = new PointF(startX, startY);
        SvgMoveToSegment svgStartMove = new SvgMoveToSegment(startPoint);

        svgPath.PathData.Add(svgStartMove);

        float          x2   = 500;
        float          y2   = 500;
        PointF         p2   = new PointF(x2, y2);
        SvgLineSegment line = new SvgLineSegment(startPoint, p2);

        svgPath.PathData.Add(line);

        float         x3  = 500;
        float         y3  = 300;
        PointF        p3  = new PointF(x3, y3);
        SvgArcSegment arc = new SvgArcSegment(p2, 50, 50, 0, SvgArcSize.Small, SvgArcSweep.Negative, p3);

        svgPath.PathData.Add(arc);

        source.SvgDocument.Children.Add(svgPath);

        return(new List <MandalaElement>()
        {
        });
    }
示例#3
0
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Empty source = (ME_Empty)sourceElement;

        // Take Center
        float  centerX = source.SvgDocument.Width / 2;
        float  centerY = source.SvgDocument.Height / 2;
        PointF center  = new PointF(centerX, centerY);

        // Create SvgElement and add it to SvgDocument
        DrawCircle(source.SvgDocument, center, Radius);

        // Create Mandala Elements and return them
        ME_Circle circle = new ME_Circle(source.SvgDocument, source.Depth + 1, CircleId, center, Radius, 0, true);

        return(new List <MandalaElement>()
        {
            circle
        });
    }
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Empty source = (ME_Empty)sourceElement;

        // Take Center
        float  centerX = source.SvgDocument.Width / 2;
        float  centerY = source.SvgDocument.Height / 2;
        PointF center  = new PointF(centerX, centerY);

        // Create SvgElement and add it to SvgDocument
        Random random     = new Random();
        float  startAngle = random.Next(360);
        float  endAngle   = (startAngle + random.Next(360 - (int)startAngle));

        DrawArc(source.SvgDocument, center, 0.4f * source.SvgDocument.Width, startAngle, endAngle);
        Console.WriteLine(startAngle + ", " + endAngle);

        return(new List <MandalaElement>()
        {
        });
    }
    public static SvgDocument GenerateMandala(MainWindow main)
    {
        Random Random = new Random();

        Elements = new Dictionary <int, List <MandalaElement> >();

        Main = main;

        int maxDepth = Random.Next(MaxDepth - MinDepth) + MinDepth;

        StrokeWidth = Random.Next(MaxStrokeWidth - MinStrokeWidth) + MinStrokeWidth;

        SvgDocument SvgDocument = SvgHandler.NewSvgDocument(1000, 1000);

        List <MandalaElement> elements = new List <MandalaElement>();
        ME_Empty startElement          = new ME_Empty(SvgDocument, 0, MandalaElement.ElementId++);

        Size = startElement.Area;
        elements.Add(startElement);

        XmlTextWriter writer = new XmlTextWriter("asdasdas.svg", Encoding.UTF8);

        SvgDocument.Write(writer);

        MandalaElement nextElement;

        while (elements.Count > 0)
        {
            // Get next element and elements with the same id
            nextElement = elements[0];
            List <MandalaElement> nextElementGroup = elements.Where(x => x.Id == nextElement.Id).ToList();
            nextElementGroup.Add(nextElement);

            // Remove elements with same id from queue
            elements = elements.Except(nextElementGroup).ToList();

            // Find which rules can be applied to elements
            List <MandalaLanguageRule> ruleCandidates = MandalaLanguageRules.Where(x => x.CanApply(nextElement)).ToList();

            if (ruleCandidates.Count > 0)
            {
                // Chose a applicable rule at random and initialize it
                MandalaLanguageRule chosenRule = ruleCandidates[Random.Next(ruleCandidates.Count)];
                chosenRule.Initialize(nextElement, Random);

                // Apply (draw) rule to all elements in group
                foreach (MandalaElement element in nextElementGroup)
                {
                    List <MandalaElement> resultShapes = chosenRule.Apply(element);

                    // Add outcoming shapes to the recursive queue
                    foreach (MandalaElement shape in resultShapes)
                    {
                        //if (shape.Depth < maxDepth) elements.Add(shape);
                        if (shape.Area > MinAreaToReproduce)
                        {
                            elements.Add(shape);
                        }
                    }
                }
            }
            else
            {
                Console.WriteLine("No rules found for shape: " + nextElement.Type);
            }
        }
        XmlTextWriter writer2 = new XmlTextWriter("testSvg.svg", Encoding.UTF8);

        SvgDocument.Write(writer2);
        UpdateInfoBox();



        return(SvgDocument);
    }