예제 #1
0
    public override void Initialize(MandalaElement sourceElement, Random random)
    {
        // Convert source to correct type
        ME_StarSpike source = (ME_StarSpike)sourceElement;

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

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

        svgPath.PathData = new SvgPathSegmentList();

        SvgMoveToSegment svgStartMove = new SvgMoveToSegment(source.InnerVertex1);

        svgPath.PathData.Add(svgStartMove);

        SvgArcSegment arc = new SvgArcSegment(source.InnerVertex1, source.CircleRadius, source.CircleRadius, 0, SvgArcSize.Small, SvgArcSweep.Negative, source.InnerVertex2);

        svgPath.PathData.Add(arc);

        SvgLineSegment line1 = new SvgLineSegment(source.InnerVertex2, source.OuterVertex);

        svgPath.PathData.Add(line1);

        SvgLineSegment line2 = new SvgLineSegment(source.OuterVertex, source.InnerVertex1);

        svgPath.PathData.Add(line2);

        source.SvgDocument.Children.Add(svgPath);

        return(new List <MandalaElement>()
        {
        });
    }
예제 #3
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++;
    }
예제 #4
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
        });
    }
    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);
    }