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); }
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++; } }
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++; }
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++; }
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_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); }
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 }); }
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++; }
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); }
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++; }
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_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);
public override bool CanApply(MandalaElement sourceElement) { return(sourceElement.Type == MandalaElementType.Empty); }