Created
March 8, 2017 15:08
-
-
Save KrabCode/3958f19fb3c15fe1a600ddcfde9bc9fd to your computer and use it in GitHub Desktop.
Tree generator core
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
BRANCH DEFINITION | |
using System; | |
using System.Collections.Generic; | |
using System.Drawing; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace Fractal | |
{ | |
class Branch | |
{ | |
public Point Origin { get; set; } | |
public Point End { get; set; } | |
public Pen Pen { get; set; } | |
public List<Branch> Children { get; set; } | |
public double Angle { get; set; } | |
private double _childDeviation { get; set; } | |
private int _childCount { get; set; } | |
private double _length { get; set; } | |
public Branch(Point origin, Point end, Pen pen, double childDeviation, int childCount) | |
{ | |
Origin = origin; | |
End = end; | |
Pen = pen; | |
Angle = AngleMath.GetAngleInDegrees(Origin, End); | |
Children = new List<Branch>(); | |
_childDeviation = childDeviation; | |
_length = AngleMath.GetDistance(Origin, End); | |
_childCount = childCount; | |
} | |
public void Populate() | |
{ | |
double minAngle = Angle - _childDeviation; | |
double childAngleStep = _childDeviation * 2 / _childCount; | |
while (Children.Count <= _childCount) | |
{ | |
double childEndAngle = minAngle + (childAngleStep * Children.Count); | |
Point childEndPoint = AngleMath.GetPointOnEdgeOfCircle(End.X, End.Y, _length, childEndAngle); | |
Branch child = new Branch(End, childEndPoint, Pen, _childDeviation, _childCount); | |
Children.Add(child); | |
} | |
} | |
} | |
} | |
LOGIC | |
using System; | |
using System.Collections.Generic; | |
using System.Drawing; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace Fractal | |
{ | |
public class Logic | |
{ | |
public delegate EventHandler RedrawEvent(object sender, RedrawEventArgs e); | |
public event RedrawEvent RedrawImage; | |
private Bitmap _offscreen; | |
private bool busy; | |
public void Start(int width, int height, double childDeviation, int detail, int childCount, int penOpacity, int size) | |
{ | |
if(!busy) | |
{ | |
int levelOfDetail = 0; | |
int maxLevelOfDetail = detail; | |
busy = true; | |
_offscreen = new Bitmap(width, height); | |
Graphics g = Graphics.FromImage(_offscreen); | |
List<Branch> branchesToPopulate = new List<Branch>(); | |
Pen blackPen = new Pen(new SolidBrush(Color.FromArgb(penOpacity,Color.Black))); | |
SolidBrush backgroundBrush = new SolidBrush(Color.White); | |
Branch root = new Branch(new Point(width / 2, height / 2 + size), new Point(width / 2, height / 2 - size), blackPen, childDeviation, childCount); | |
root.Populate(); | |
g.FillRectangle(backgroundBrush, 0, 0, width, height); | |
g.DrawLine(blackPen, root.Origin, root.End); | |
foreach (Branch child in root.Children) | |
{ | |
branchesToPopulate.Add(child); | |
} | |
while (levelOfDetail < maxLevelOfDetail) | |
{ | |
int branchesToPopulateCount = branchesToPopulate.Count; | |
for (int i = 0; i < branchesToPopulateCount; i++) | |
{ | |
if (branchesToPopulate[i].Children.Count == 0) | |
{ | |
branchesToPopulate[i].Populate(); | |
foreach (Branch babyBranch in branchesToPopulate[i].Children) | |
{ | |
branchesToPopulate.Add(babyBranch); | |
} | |
} | |
} | |
levelOfDetail++; | |
} | |
foreach (Branch b in branchesToPopulate) | |
{ | |
g.DrawLine(blackPen, b.Origin, b.End); | |
} | |
RedrawImage(this, new RedrawEventArgs(_offscreen)); | |
levelOfDetail = 0; | |
busy = false; | |
} | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment