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 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_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); }