98 lines
3.9 KiB
C#

using System;
namespace FractalTreeGtk.Draw
{
internal class Fractal
{
private readonly CairoWindow _window;
private double Length { get; set; } = new Random().Next(70, 90);
private int MaxLevels { get; }
private int CurrentLevel { get; set; }
private double Degree => new Random().Next(30, 50) / 100f;
private double DeltaLength => new Random().Next(0, 20) / (float)Math.Log2(CurrentLevel+1);
public Branch[][] FractalLines { get; }
public Fractal(int maxLevels, CairoWindow window)
{
_window = window;
MaxLevels = maxLevels;
FractalLines = new Branch[maxLevels + 1][];
CreateBranch();
}
private void CreateBranch()
{
FractalLines[CurrentLevel] = new Branch[Convert.ToInt32(Math.Pow(2, CurrentLevel))];
for (int i = 0; i < FractalLines[CurrentLevel].Length; i++)
{
FractalLines[CurrentLevel][i] = new Branch(0, 0, 0, -Length, true, 0);
}
CurrentLevel++;
NextLevel();
}
private void NextLevel()
{
_window.QueueDraw();
var len = DeltaLength;
if (Length < 0)
Length = DeltaLength;
else
Length -= DeltaLength;
_window.QueueDraw();
FractalLines[CurrentLevel] = new Branch[Convert.ToInt32(Math.Pow(2, CurrentLevel))];
int x = 0;
for (int i = 0; i < FractalLines[CurrentLevel - 1].Length; i++)
{
double degree = FractalLines[CurrentLevel - 1][i].Degree;
if (FractalLines[CurrentLevel - 1][i].IsLeft)
{
double leftdegree = Degree + degree;
double rightdegree = -Degree + degree;
FractalLines[CurrentLevel][x] = new Branch(
FractalLines[CurrentLevel - 1][i].X2,
FractalLines[CurrentLevel - 1][i].Y2,
-(Math.Sin(leftdegree) * Length) + FractalLines[CurrentLevel - 1][i].X2,
-(Math.Cos(leftdegree) * Length) + FractalLines[CurrentLevel - 1][i].Y2,
true,
leftdegree);
FractalLines[CurrentLevel][++x] = new Branch(
FractalLines[CurrentLevel - 1][i].X2,
FractalLines[CurrentLevel - 1][i].Y2,
-(Math.Sin(rightdegree) * Length) + FractalLines[CurrentLevel - 1][i].X2,
-(Math.Cos(rightdegree) * Length) + FractalLines[CurrentLevel - 1][i].Y2,
false,
rightdegree);
}
else
{
double leftdegree = -(Degree - degree);
double rightdegree = -(-Degree - degree);
FractalLines[CurrentLevel][x] = new Branch(
FractalLines[CurrentLevel - 1][i].X2,
FractalLines[CurrentLevel - 1][i].Y2,
-(Math.Sin(leftdegree) * Length) + FractalLines[CurrentLevel - 1][i].X2,
-(Math.Cos(leftdegree) * Length) + FractalLines[CurrentLevel - 1][i].Y2,
true,
leftdegree);
FractalLines[CurrentLevel][++x] = new Branch(
FractalLines[CurrentLevel - 1][i].X2, FractalLines[CurrentLevel - 1][i].Y2,
-(Math.Sin(rightdegree) * Length) + FractalLines[CurrentLevel - 1][i].X2,
-(Math.Cos(rightdegree) * Length) + FractalLines[CurrentLevel - 1][i].Y2,
false,
rightdegree);
}
x++;
}
CurrentLevel++;
if (CurrentLevel <= MaxLevels)
{
NextLevel();
}
}
}
}