Esempio n. 1
0
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_Stripe source = (ME_Stripe)sourceElement;

        Colour = new SvgColourServer(Color.FromArgb(random.Next(256), random.Next(256), random.Next(256)));
    }
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Ring source = (ME_Ring)sourceElement;

        // Get Circle radius
        float circleRadius = source.Width / 2;

        // Create SvgElement and add it to SvgDocument
        List <MandalaElement> elements = new List <MandalaElement>();

        float angleStep = 360f / NumCircles;

        for (int i = 0; i < NumCircles; i++)
        {
            float  angle   = i * angleStep;
            float  centerX = source.Center.X + (float)((source.InnerRadius + source.Width / 2) * Math.Sin(DegreeToRadian(angle)));
            float  centerY = source.Center.Y + (float)((source.InnerRadius + source.Width / 2) * Math.Cos(DegreeToRadian(angle)));
            PointF center  = new PointF(centerX, centerY);

            DrawCircle(source.SvgDocument, center, circleRadius);

            elements.Add(new ME_Circle(source.SvgDocument, source.Depth + 1, (Alternating && i % 2 == 1) ? RingId2 : RingId1, center, circleRadius, angle, false));
        }

        return(elements);
    }
Esempio n. 3
0
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_Circle source = (ME_Circle)sourceElement;

        // Get # corners
        NumCorners = random.Next(MaxCorners - MinCorners + 1) + MinCorners;

        // Get Radius (keep doing until shape is concave)
        float innerAngle = 361;

        while (innerAngle > 180)
        {
            float minInnerRadius = source.Radius * MinInnerRadius;
            float maxInnerRadius = source.Radius;
            InnerRadius = (float)random.NextDouble() * (maxInnerRadius - minInnerRadius) + minInnerRadius;

            float  angleStep = 360f / (NumCorners * 2);
            PointF outer1    = FindPointOnCircle(source.Center, source.Radius, 0);
            PointF inner     = FindPointOnCircle(source.Center, InnerRadius, angleStep);
            PointF outer2    = FindPointOnCircle(source.Center, source.Radius, angleStep * 2);

            innerAngle = FindAngleBetweenTwoLineSegments(inner, outer1, outer2);
        }

        // Element ids
        StarId   = MandalaElement.ElementId++;
        SectorId = MandalaElement.ElementId++;
    }
    public static void UpdateInfoBox()
    {
        Main.ElementGrid.Children.Clear();
        Main.ElementGrid.RowDefinitions.Clear();
        int row = 0;

        foreach (KeyValuePair <int, List <MandalaElement> > kvp in Elements)
        {
            Main.ElementGrid.RowDefinitions.Add(new RowDefinition()
            {
                Height = new System.Windows.GridLength(20)
            });
            System.Windows.Controls.TextBox Text = new System.Windows.Controls.TextBox();
            Text.SetValue(Grid.RowProperty, row);
            Text.SetValue(Grid.ColumnProperty, 0);
            Text.MouseEnter += HighlightMandalaElement;
            Text.MouseLeave += UnhighlightMandalaElement;
            Text.IsReadOnly  = true;

            MandalaElement elem = kvp.Value[0];

            string text = elem.Id + "\t" + elem.Type + (elem.Type == MandalaElementType.StarSpike || elem.Type == MandalaElementType.CircleSector ? "\t" : "\t\t") + (int)elem.Area + "\t(" + (elem.Area / Size).ToString("0.00%") + ")";
            Text.Text = text;

            Main.ElementGrid.Children.Add(Text);
            row++;
        }
    }
Esempio n. 5
0
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_CircleSector source = (ME_CircleSector)sourceElement;

        SvgPath svgPath = new SvgPath()
        {
            Fill        = Colour,
            StrokeWidth = 0
        };

        svgPath.PathData = new SvgPathSegmentList();

        SvgMoveToSegment svgStartMove = new SvgMoveToSegment(source.InnerVertex);

        svgPath.PathData.Add(svgStartMove);

        SvgLineSegment line = new SvgLineSegment(source.InnerVertex, source.OuterVertex1);

        svgPath.PathData.Add(line);

        SvgArcSegment arc = new SvgArcSegment(source.OuterVertex1, source.OuterRadius, source.OuterRadius, 0, SvgArcSize.Small, SvgArcSweep.Negative, source.OuterVertex2);

        svgPath.PathData.Add(arc);

        source.SvgDocument.Children.Add(svgPath);

        return(new List <MandalaElement>()
        {
        });
    }
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_Ring source = (ME_Ring)sourceElement;

        // # circles
        int maxCircles = GetMaxNumCircles(source);

        if (maxCircles < MinCircles)
        {
            NumCircles = 0;                          // Don't draw any circles if minimum is not possible
        }
        else
        {
            if (random.Next(2) == 1)
            {
                NumCircles = maxCircles;
            }
            else
            {
                NumCircles = random.Next(maxCircles - MinCircles) + MinCircles;
            }
        }

        // Creating element ids
        Alternating = random.Next(2) == 1;
        if (NumCircles % 2 == 1)
        {
            Alternating = false;
        }
        RingId1 = MandalaElement.ElementId++;
        RingId2 = MandalaElement.ElementId++; // only used for alternating
    }
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_CircleSector source = (ME_CircleSector)sourceElement;

        // Element ids
        CircleId = MandalaElement.ElementId++;
    }
Esempio n. 8
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++;
    }
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_Star source = (ME_Star)sourceElement;

        // Get Radius
        float minWidth = source.OuterRadius * MinWidth;
        float maxWidth = source.OuterRadius * MaxWidth;

        Width = (float)random.NextDouble() * (maxWidth - minWidth) + minWidth;

        // Element ids
        StarId = MandalaElement.ElementId++;
    }
 public static void AddElement(MandalaElement element)
 {
     if (Elements.ContainsKey(element.Id))
     {
         Elements[element.Id].Add(element);
     }
     else
     {
         Elements.Add(element.Id, new List <MandalaElement>()
         {
             element
         });
     }
 }
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_CircleSector source = (ME_CircleSector)sourceElement;

        float radiusStep = source.Width / NumStripes;

        List <MandalaElement> elements = new List <MandalaElement>();

        for (int i = 0; i < NumStripes; i++)
        {
            float  radius     = source.InnerRadius + (i + 1) * radiusStep;
            PointF startPoint = FindLineCircleIntersections(source.Center, radius, source.InnerVertex, source.OuterVertex1)[0];
            PointF endPoint   = FindLineCircleIntersections(source.Center, radius, source.InnerVertex, source.OuterVertex2)[0];
            if (i < NumStripes - 1)
            {
                DrawArc(source.SvgDocument, source.Center, radius, startPoint, endPoint);
            }

            float  lastRadius     = radius - radiusStep;
            PointF lastStartPoint = FindLineCircleIntersections(source.Center, lastRadius, source.InnerVertex, source.OuterVertex1)[0];
            PointF lastEndPoint   = FindLineCircleIntersections(source.Center, lastRadius, source.InnerVertex, source.OuterVertex2)[0];

            // Add Stripe Elements
            if (i > 0)
            {
                int       id     = (Alternating && i % 2 == 1) ? StripeId2 : StripeId1;
                ME_Stripe stripe = new ME_Stripe(source.SvgDocument, source.Depth + 1, id, source.Center, lastRadius, radius, lastStartPoint, lastEndPoint, startPoint, endPoint);
                elements.Add(stripe);
            }
        }

        // Add Sector Element when only 2 stripes
        if (NumStripes == MinStripes)
        {
            float  sectorRadius = source.InnerRadius + radiusStep;
            PointF outer1       = FindLineCircleIntersections(source.Center, sectorRadius, source.InnerVertex, source.OuterVertex1)[0];
            PointF outer2       = FindLineCircleIntersections(source.Center, sectorRadius, source.InnerVertex, source.OuterVertex2)[0];
            float  angle        = FindAngleBetweenTwoLineSegments(source.Center, outer1, outer2);
            float  angleDiff    = (source.EndAngle - source.StartAngle) - angle;

            float startPointAngle = source.StartAngle + angleDiff / 2;
            float endPointAngle   = startPointAngle + angle;

            ME_CircleSector sector = new ME_CircleSector(source.SvgDocument, source.Depth + 1, SectorId, source.Center, source.InnerRadius, sectorRadius, startPointAngle, endPointAngle);
            elements.Add(sector);
        }

        return(elements);
    }
    public override bool CanApply(MandalaElement sourceElement)
    {
        if (sourceElement.Type != MandalaElementType.Ring)
        {
            return(false);
        }
        else
        {
            return(true); // ?
        }
        ME_Ring source = (ME_Ring)sourceElement;

        // Ring has to be thinner than innerradius
        return(source.Width < source.InnerRadius);
    }
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_Star source = (ME_Star)sourceElement;

        Alternating = random.Next(2) == 1;
        if (source.Corners % 2 == 1)
        {
            Alternating = false;
        }

        // Element ids
        CircleId = MandalaElement.ElementId++;
        SpikeId1 = MandalaElement.ElementId++;
        SpikeId2 = MandalaElement.ElementId++;
    }
Esempio n. 14
0
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_StarSpike source = (ME_StarSpike)sourceElement;

        float spikeLength    = FindDistance(source.Tangent, source.OuterVertex);
        float splitRangeRel  = 1 - MinDistanceInside - MinDistanceOutside;
        float splitRadiusRel = (float)random.NextDouble() * splitRangeRel + MinDistanceInside;

        SplitRadius = source.CircleRadius + spikeLength * splitRadiusRel;


        // Element ids
        SpikeId  = MandalaElement.ElementId++;
        StripeId = MandalaElement.ElementId++;
    }
Esempio n. 15
0
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Ring source = (ME_Ring)sourceElement;

        List <MandalaElement> elements = new List <MandalaElement>();

        // Create SvgElement and add it to SvgDocument
        float  angleStep = 360f / NumStripes;
        PointF lastStartPoint = new PointF(0, 0), lastEndPoint = new PointF(0, 0);

        for (int i = 0; i < NumStripes; i++)
        {
            float angle = i * angleStep;

            float  startX     = source.Center.X + (float)(source.InnerRadius * Math.Sin(DegreeToRadian(angle)));
            float  startY     = source.Center.Y + (float)(source.InnerRadius * Math.Cos(DegreeToRadian(angle)));
            PointF startPoint = new PointF(startX, startY);
            float  endX       = source.Center.X + (float)(source.OuterRadius * Math.Sin(DegreeToRadian(angle)));
            float  endY       = source.Center.Y + (float)(source.OuterRadius * Math.Cos(DegreeToRadian(angle)));
            PointF endPoint   = new PointF(endX, endY);

            DrawLine(source.SvgDocument, startPoint, endPoint);

            int id = (Alternating && i % 2 == 1) ? StripeId2 : StripeId1;
            if (i > 0)
            {
                ME_Stripe stripe = new ME_Stripe(source.SvgDocument, source.Depth + 1, id, source.Center, source.InnerRadius, source.OuterRadius, lastStartPoint, startPoint, lastEndPoint, endPoint);
                elements.Add(stripe);
            }
            else
            {
                float lastAngle = 360f - angleStep;
                lastStartPoint = new PointF(source.Center.X + (float)(source.InnerRadius * Math.Sin(DegreeToRadian(lastAngle))),
                                            source.Center.Y + (float)(source.InnerRadius * Math.Cos(DegreeToRadian(lastAngle))));
                lastEndPoint = new PointF(source.Center.X + (float)(source.OuterRadius * Math.Sin(DegreeToRadian(lastAngle))),
                                          source.Center.Y + (float)(source.OuterRadius * Math.Cos(DegreeToRadian(lastAngle))));
                ME_Stripe stripe = new ME_Stripe(source.SvgDocument, source.Depth + 1, id, source.Center, source.InnerRadius, source.OuterRadius, lastStartPoint, startPoint, lastEndPoint, endPoint);
                elements.Add(stripe);
            }

            lastStartPoint = startPoint;
            lastEndPoint   = endPoint;
        }

        return(elements);
    }
Esempio n. 16
0
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Circle source = (ME_Circle)sourceElement;

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

        // Create Mandala Elements and return them
        ME_Circle circle = new ME_Circle(source.SvgDocument, source.Depth + 1, CircleId, source.Center, Radius, source.AngleFromCenter, source.Centered);;
        ME_Ring   ring   = new ME_Ring(source.SvgDocument, source.Depth + 1, RingId, source.Center, Radius, source.Radius);

        return(new List <MandalaElement>()
        {
            circle, ring
        });
    }
Esempio n. 17
0
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_Ring source = (ME_Ring)sourceElement;

        // Get # of Stripes
        int factor = random.Next(MaxFactor - MinFactor) + MinFactor;

        NumStripes = 1;
        for (int i = 0; i < factor; i++)
        {
            NumStripes *= 2;
        }

        Alternating = random.Next(2) == 1;

        // Element ids
        StripeId1 = MandalaElement.ElementId++;
        StripeId2 = MandalaElement.ElementId++;
    }
Esempio n. 18
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>()
        {
        });
    }
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Star source = (ME_Star)sourceElement;

        // Draw Star
        float angle       = source.AngleFromCenter;
        float widthFactor = (source.OuterRadius - Width) / source.OuterRadius;
        float innerRadius = source.InnerRadius * widthFactor;
        float outerRadius = source.OuterRadius - Width;

        PointF[] vertices = DrawStar(source.SvgDocument, source.Center, innerRadius, outerRadius, source.Corners, angle);

        List <MandalaElement> elements = new List <MandalaElement>();
        // Create Star Element
        ME_Star star = new ME_Star(source.SvgDocument, source.Depth + 1, StarId, source.Center, innerRadius, outerRadius, source.Corners, angle, source.Centered, vertices);

        elements.Add(star);

        return(elements);
    }
Esempio n. 20
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 override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_CircleSector source = (ME_CircleSector)sourceElement;

        // # Stripes
        if (random.Next(2) == 1)
        {
            NumStripes = MinStripes;
        }
        else
        {
            NumStripes = random.Next(MaxStripes - MinStripes + 2) + MinStripes;
        }

        Alternating = random.Next(2) == 1;

        // Element ids
        SectorId  = MandalaElement.ElementId++;
        StripeId1 = MandalaElement.ElementId++;
        StripeId2 = MandalaElement.ElementId++;
    }
Esempio n. 23
0
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_StarSpike source = (ME_StarSpike)sourceElement;

        // Find intersection points
        PointF intersection1 = FindLineCircleIntersections(source.CircleCenter, SplitRadius, source.InnerVertex1, source.OuterVertex)[0];
        PointF intersection2 = FindLineCircleIntersections(source.CircleCenter, SplitRadius, source.InnerVertex2, source.OuterVertex)[0];
        float  angle         = FindAngleBetweenTwoLineSegments(source.CircleCenter, intersection1, intersection2);
        float  startAngle    = source.Angle - angle / 2;
        float  endAngle      = source.Angle + angle / 2;

        DrawArc(source.SvgDocument, source.CircleCenter, SplitRadius, startAngle, endAngle);

        // Create elements
        ME_StarSpike spike  = new ME_StarSpike(source.SvgDocument, source.Depth + 1, SpikeId, source.CircleCenter, SplitRadius, source.Angle, intersection1, intersection2, source.OuterVertex);
        ME_Stripe    stripe = new ME_Stripe(source.SvgDocument, source.Depth + 1, StripeId, source.CircleCenter, source.CircleRadius, SplitRadius, source.InnerVertex1, source.InnerVertex2, intersection1, intersection2);

        return(new List <MandalaElement>()
        {
            spike, stripe
        });
    }
Esempio n. 24
0
    public override List <MandalaElement> Apply(MandalaElement sourceElement)
    {
        // Convert source to correct type
        ME_Circle source = (ME_Circle)sourceElement;

        // Draw Star
        float angle;

        if (source.Centered)
        {
            angle = 180;
        }
        else
        {
            angle = source.AngleFromCenter;
        }
        PointF[] vertices = DrawStar(source.SvgDocument, source.Center, InnerRadius, source.Radius, NumCorners, angle);

        List <MandalaElement> elements = new List <MandalaElement>();
        // Create Star Element
        ME_Star star = new ME_Star(source.SvgDocument, source.Depth + 1, StarId, source.Center, InnerRadius, source.Radius, NumCorners, angle, source.Centered, vertices);

        elements.Add(star);

        // Create Sectors
        float angleStep = 360f / NumCorners;

        for (int i = 0; i < NumCorners; i++)
        {
            float           startAngle = angle + i * angleStep;
            float           endAngle   = startAngle + angleStep;
            ME_CircleSector sector     = new ME_CircleSector(source.SvgDocument, source.Depth + 1, SectorId, source.Center, InnerRadius, source.Radius, startAngle, endAngle);
            elements.Add(sector);
        }

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

        // Take Center
        float radius = source.InnerRadius;

        DrawCircle(source.SvgDocument, source.Center, radius);

        List <MandalaElement> elements = new List <MandalaElement>();

        // Add circle element
        ME_Circle circle = new ME_Circle(source.SvgDocument, source.Depth + 1, CircleId, source.Center, radius, source.AngleFromCenter, source.Centered);

        elements.Add(circle);

        // Add star spike elements
        float angleStep = 360f / source.Corners;

        for (int i = 0; i < source.Corners; i++)
        {
            int   cornerId = i * 2;
            float angle    = source.AngleFromCenter + i * angleStep;
            int   id       = (Alternating && i % 2 == 1) ? SpikeId2 : SpikeId1;

            ME_StarSpike spike = new ME_StarSpike(source.SvgDocument, source.Depth + 1, id, source.Center, source.InnerRadius, angle,
                                                  source.Vertices[cornerId == 0 ? (source.Vertices.Length - 1) : (cornerId - 1)],
                                                  source.Vertices[(cornerId + 1) % source.Vertices.Length],
                                                  source.Vertices[cornerId]
                                                  );
            elements.Add(spike);
        }

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


        float sin    = (float)(Math.Sin(DegreeToRadian(source.InnerAngle / 2)));
        float radius = ((-source.InnerRadius * sin) + (source.OuterRadius * sin)) / (sin + 1);

        float  circleAngle = (source.StartAngle + source.EndAngle) / 2;
        PointF tangent     = FindPointOnCircle(source.Center, source.OuterRadius, circleAngle);

        List <PointF> intersect = FindLineCircleIntersections(tangent, radius, source.InnerVertex, tangent);
        PointF        center    = intersect[1];

        DrawCircle(source.SvgDocument, center, radius);

        ME_Circle circle = new ME_Circle(source.SvgDocument, source.Depth + 1, CircleId, center, radius, circleAngle, false);

        return(new List <MandalaElement>()
        {
            circle
        });
    }
 public override bool CanApply(MandalaElement sourceElement)
 {
     return(sourceElement.Type == MandalaElementType.CircleSector);
 }
 public abstract bool CanApply(MandalaElement sourceElement);
 public abstract void Initialize(MandalaElement sourceElement, Random random);
Esempio n. 30
0
 public override bool CanApply(MandalaElement sourceElement)
 {
     return(sourceElement.Type == MandalaElementType.Empty);
 }