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))); }
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>() { }); }
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++; }
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); }