100 lines
4.0 KiB
C#
Raw Normal View History

2023-01-03 00:17:18 +03:00
using System;
namespace FractalTreeGtk.Draw
{
internal class Fractal
{
2024-08-30 16:48:26 +03:00
private readonly CairoWindow _window;
private double Length { get; set; } = new Random().Next(70, 90);
private int MaxLevels { get; set; }
private int CurrentLevel { get; set; } = 0;
public bool IsDrawing { private set; get; }
private double Degree => new Random().Next(30, 50) / 100f;
private double DeltaLength => new Random().Next(0, 50) / 100f;
public Branch[][] FractalLines { get; }
public Fractal(int maxLevels, CairoWindow window)
{
2024-08-30 16:48:26 +03:00
_window = window;
MaxLevels = maxLevels;
FractalLines = new Branch[maxLevels + 1][];
2023-01-30 00:24:30 +03:00
CreateBranch();
}
2024-08-30 16:48:26 +03:00
private void CreateBranch()
{
2024-08-30 16:48:26 +03:00
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();
}
2024-08-30 16:48:26 +03:00
private void NextLevel()
{
2024-08-30 16:48:26 +03:00
_window.QueueDraw();
var len = DeltaLength;
if (Length < DeltaLength)
Length = DeltaLength;
else
Length -= DeltaLength;
_window.QueueDraw();
FractalLines[CurrentLevel] = new Branch[Convert.ToInt32(Math.Pow(2, CurrentLevel))];
int x = 0;
2024-08-30 16:48:26 +03:00
for (int i = 0; i < FractalLines[CurrentLevel - 1].Length; i++)
{
2024-08-30 16:48:26 +03:00
double degree = FractalLines[CurrentLevel - 1][i].Degree;
if (FractalLines[CurrentLevel - 1][i].IsLeft)
2023-01-03 00:17:18 +03:00
{
2024-08-30 16:48:26 +03:00
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,
2023-01-03 18:32:30 +03:00
true,
leftdegree);
2024-08-30 16:48:26 +03:00
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,
2023-01-03 18:32:30 +03:00
false,
rightdegree);
2023-01-03 00:17:18 +03:00
}
else
{
2024-08-30 16:48:26 +03:00
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,
2023-01-03 18:32:30 +03:00
true,
leftdegree);
2024-08-30 16:48:26 +03:00
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);
2023-01-03 00:17:18 +03:00
}
2024-08-30 16:48:26 +03:00
x++;
}
2024-08-30 16:48:26 +03:00
CurrentLevel++;
if (CurrentLevel <= MaxLevels)
{
NextLevel();
}
2024-08-30 16:48:26 +03:00
else IsDrawing = false;
}
}
2024-08-30 16:48:26 +03:00
}