From 17db4dc9965d7a4ca44d7d5c83e3513d58bb8d6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B0=D0=B2=D0=B5=D0=BB=D1=96=D0=B9=20=D0=A1=D0=B0?= =?UTF-8?q?=D0=B2=D1=91=D0=BD=D0=B0=D0=BA?= <1986developer@gmail.com> Date: Tue, 3 Jan 2023 18:32:30 +0300 Subject: [PATCH 1/2] WORKING FRACTAL!!!!!!!!!!!! --- CairoObjective/Text.cs | 20 +++++++++++--- FractalTreeGtk/CairoWindow.cs | 11 +++++--- FractalTreeGtk/Draw/Branch.cs | 4 ++- FractalTreeGtk/Draw/Fractal.cs | 49 +++++++++++++++++++++++----------- 4 files changed, 60 insertions(+), 24 deletions(-) diff --git a/CairoObjective/Text.cs b/CairoObjective/Text.cs index c1fb489..892a52e 100644 --- a/CairoObjective/Text.cs +++ b/CairoObjective/Text.cs @@ -4,7 +4,7 @@ public class Text { public static double DefaultFontSize = 20;//Default Font Size - + public static bool CenterText = true; public static void Make(string text, int pointX, int pointY, double size, Cairo.Color color) { Set.CheckContext(); @@ -12,7 +12,10 @@ context.SetSourceColor(color); context.SetFontSize(size); Cairo.TextExtents extents = context.TextExtents(text); + if(CenterText) context.MoveTo(pointX - extents.Width / 2, pointY + extents.Height / 2); + else + context.MoveTo(pointX, pointY); context.ShowText(text); } public static void Make(string text, int pointX, int pointY, Cairo.Color color) @@ -22,7 +25,10 @@ context.SetSourceColor(color); context.SetFontSize(DefaultFontSize); Cairo.TextExtents extents = context.TextExtents(text); - context.MoveTo(pointX - extents.Width / 2, pointY + extents.Height / 2); + if (CenterText) + context.MoveTo(pointX - extents.Width / 2, pointY + extents.Height / 2); + else + context.MoveTo(pointX, pointY); context.ShowText(text); } public static void Make(string text, int pointX, int pointY, double size) @@ -32,7 +38,10 @@ context.SetSourceColor(Set.Color); context.SetFontSize(size); Cairo.TextExtents extents = context.TextExtents(text); - context.MoveTo(pointX - extents.Width / 2, pointY + extents.Height / 2); + if (CenterText) + context.MoveTo(pointX - extents.Width / 2, pointY + extents.Height / 2); + else + context.MoveTo(pointX, pointY); context.ShowText(text); } public static void Make(string text, int pointX, int pointY) @@ -42,7 +51,10 @@ context.SetSourceColor(Set.Color); context.SetFontSize(DefaultFontSize); Cairo.TextExtents extents = context.TextExtents(text); - context.MoveTo(pointX - extents.Width / 2, pointY + extents.Height / 2); + if (CenterText) + context.MoveTo(pointX - extents.Width / 2, pointY + extents.Height / 2); + else + context.MoveTo(pointX, pointY); context.ShowText(text); } } diff --git a/FractalTreeGtk/CairoWindow.cs b/FractalTreeGtk/CairoWindow.cs index b039ac5..12c321e 100644 --- a/FractalTreeGtk/CairoWindow.cs +++ b/FractalTreeGtk/CairoWindow.cs @@ -34,15 +34,20 @@ namespace FractalTreeGtk private void Drawing_Drawn(object o, DrawnArgs args) { + long branches = 0; + Text.CenterText = false; args.Cr.Translate(AllocatedWidth / 2, AllocatedHeight); Set.Context = args.Cr; Set.Background(new Cairo.Color(0, 0, 0)); - foreach(CairoObjective.DrawObjects.Line[] lines in (CairoObjective.DrawObjects.Line[][])fractal.Fractallines) + foreach (CairoObjective.DrawObjects.Line[] lines in (CairoObjective.DrawObjects.Line[][])fractal.Fractallines) { - foreach(CairoObjective.DrawObjects.Line line in lines) + foreach (CairoObjective.DrawObjects.Line line in lines) { + branches++; Line.Make(line); + } } - Text.Make($"Levels: {fractallevels}", -(AllocatedWidth / 2) + 50, -20, new Cairo.Color(1,1,1)); + Text.Make($"Total Branches: {branches}", -(AllocatedWidth / 2), -30, new Cairo.Color(1, 1, 1)); + Text.Make($"Levels: {fractallevels}", -(AllocatedWidth / 2), -5, new Cairo.Color(1,1,1)); } } } diff --git a/FractalTreeGtk/Draw/Branch.cs b/FractalTreeGtk/Draw/Branch.cs index 8c18621..03aa9e6 100644 --- a/FractalTreeGtk/Draw/Branch.cs +++ b/FractalTreeGtk/Draw/Branch.cs @@ -5,9 +5,11 @@ namespace FractalTreeGtk.Draw internal class Branch : CairoObjective.DrawObjects.Line { public bool left; - public Branch(double x1, double y1, double x2, double y2, bool left) : base(x1, y1, x2, y2) + public double degree; + public Branch(double x1, double y1, double x2, double y2, bool left, double degree) : base(x1, y1, x2, y2) { this.left = left; + this.degree = degree; } } } diff --git a/FractalTreeGtk/Draw/Fractal.cs b/FractalTreeGtk/Draw/Fractal.cs index 7eeff9d..feff3bf 100644 --- a/FractalTreeGtk/Draw/Fractal.cs +++ b/FractalTreeGtk/Draw/Fractal.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel.DataAnnotations; using System.Threading; using System.Threading.Tasks; @@ -6,11 +7,11 @@ namespace FractalTreeGtk.Draw { internal class Fractal { - double Length = 50; - double deg = 0.3; + double Length = 100; + double MainDegree = 0.4; int levels; int level = 0; - double deltaLength = 2; + double deltaLength = 5; public Branch[][] Fractallines; public Fractal(int levels) { @@ -23,7 +24,7 @@ namespace FractalTreeGtk.Draw Fractallines[level] = new Branch[Convert.ToInt32(Math.Pow(2, level))]; for (int i = 0; i < Fractallines[level].Length; i++) { - Fractallines[level][i] = new Branch(0, 0, 0, -Length, true); + Fractallines[level][i] = new Branch(0, 0, 0, -Length, true, 0); } level++; NextLevel(); @@ -31,32 +32,48 @@ namespace FractalTreeGtk.Draw private void NextLevel() { Length -= deltaLength; - Fractallines[level] = new Branch[Convert.ToInt32(Math.Pow(2, level))]; int x = 0; for (int i = 0; i < Fractallines[level - 1].Length; i++) { + double Degree = Fractallines[level - 1][i].degree; if (Fractallines[level - 1][i].left) { + double leftdegree = MainDegree + Degree; + double rightdegree = -MainDegree + Degree; Fractallines[level][x] = new Branch( - Fractallines[level - 1][i].X2, Fractallines[level - 1][i].Y2, - -(Math.Sin(deg + deg * (level-1)) * Length) + Fractallines[level - 1][i].X2, -(Math.Cos(deg + deg * (level - 1)) * Length) + Fractallines[level - 1][i].Y2 - , true); + Fractallines[level - 1][i].X2, + Fractallines[level - 1][i].Y2, + -(Math.Sin(leftdegree) * Length) + Fractallines[level - 1][i].X2, + -(Math.Cos(leftdegree) * Length) + Fractallines[level - 1][i].Y2, + true, + leftdegree); Fractallines[level][++x] = new Branch( - Fractallines[level - 1][i].X2, Fractallines[level - 1][i].Y2, - -(Math.Sin(-deg + deg * (level-1)) * Length) + Fractallines[level - 1][i].X2, -(Math.Cos(-deg + deg * (level - 1)) * Length) + Fractallines[level - 1][i].Y2 - , false); + Fractallines[level - 1][i].X2, + Fractallines[level - 1][i].Y2, + -(Math.Sin(rightdegree) * Length) + Fractallines[level - 1][i].X2, + -(Math.Cos(rightdegree) * Length) + Fractallines[level - 1][i].Y2, + false, + rightdegree); } else { + double leftdegree = -(MainDegree - Degree); + double rightdegree = -(-MainDegree - Degree); Fractallines[level][x] = new Branch( - Fractallines[level - 1][i].X2, Fractallines[level - 1][i].Y2, - -(Math.Sin(deg - deg * (level - 1)) * Length) + Fractallines[level - 1][i].X2, -(Math.Cos(deg - deg * (level - 1)) * Length) + Fractallines[level - 1][i].Y2 - , true); + Fractallines[level - 1][i].X2, + Fractallines[level - 1][i].Y2, + -(Math.Sin(leftdegree) * Length) + Fractallines[level - 1][i].X2, + -(Math.Cos(leftdegree) * Length) + Fractallines[level - 1][i].Y2, + true, + leftdegree); Fractallines[level][++x] = new Branch( Fractallines[level - 1][i].X2, Fractallines[level - 1][i].Y2, - -(Math.Sin(-deg - deg * (level - 1)) * Length) + Fractallines[level - 1][i].X2, -(Math.Cos(-deg - deg * (level - 1)) * Length) + Fractallines[level - 1][i].Y2 - , false); + + -(Math.Sin(rightdegree) * Length) + Fractallines[level - 1][i].X2, + -(Math.Cos(rightdegree) * Length) + Fractallines[level - 1][i].Y2, + false, + rightdegree); } x++; } From 4c25bc17afc72c13bfe8ff3375ffc8a46e7027ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A1=D0=B0=D0=B2=D0=B5=D0=BB=D1=96=D0=B9=20=D0=A1=D0=B0?= =?UTF-8?q?=D0=B2=D1=91=D0=BD=D0=B0=D0=BA?= <1986developer@gmail.com> Date: Mon, 30 Jan 2023 00:24:30 +0300 Subject: [PATCH 2/2] Final --- FractalTreeGtk/CairoWindow.cs | 41 ++++++++++++++++++++++++---------- FractalTreeGtk/Draw/Fractal.cs | 28 ++++++++++++++--------- 2 files changed, 46 insertions(+), 23 deletions(-) diff --git a/FractalTreeGtk/CairoWindow.cs b/FractalTreeGtk/CairoWindow.cs index 12c321e..6dce440 100644 --- a/FractalTreeGtk/CairoWindow.cs +++ b/FractalTreeGtk/CairoWindow.cs @@ -1,7 +1,10 @@ using Gtk; using CairoObjective; -using GLib; using FractalTreeGtk.Draw; +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Diagnostics; namespace FractalTreeGtk { @@ -9,26 +12,30 @@ namespace FractalTreeGtk { static int fractallevels = 2; DrawingArea drawing = new DrawingArea(); - Fractal fractal = new Fractal(fractallevels); + Fractal fractal; public CairoWindow(string title) : base(title) { Fullscreen(); drawing.Drawn += Drawing_Drawn; Add(drawing); ShowAll(); KeyPressEvent += CairoWindow_KeyPressEvent; + CreateNewFractal(); + } + public void CreateNewFractal() + { + fractal = new Fractal(fractallevels, this); } - private void CairoWindow_KeyPressEvent(object o, KeyPressEventArgs args) { if(args.Event.Key == Gdk.Key.equal) { - fractal = new Fractal(++fractallevels); - QueueDraw(); + ++fractallevels; + CreateNewFractal(); } if (args.Event.Key == Gdk.Key.minus && fractallevels > 1) { - fractal = new Fractal(--fractallevels); - QueueDraw(); + --fractallevels; + CreateNewFractal(); } } @@ -41,13 +48,23 @@ namespace FractalTreeGtk Set.Background(new Cairo.Color(0, 0, 0)); foreach (CairoObjective.DrawObjects.Line[] lines in (CairoObjective.DrawObjects.Line[][])fractal.Fractallines) { - foreach (CairoObjective.DrawObjects.Line line in lines) { - branches++; - Line.Make(line); + try + { + foreach (CairoObjective.DrawObjects.Line line in lines) { + branches++; + Line.Make(line); + } + } + catch (NullReferenceException) + { + Trace.WriteLine("Hello Null"); + break; } } - Text.Make($"Total Branches: {branches}", -(AllocatedWidth / 2), -30, new Cairo.Color(1, 1, 1)); - Text.Make($"Levels: {fractallevels}", -(AllocatedWidth / 2), -5, new Cairo.Color(1,1,1)); + Text.Make($"Total Branches: {branches}", -(AllocatedWidth / 2) + 1, -29, 21, new Cairo.Color(0, 0, 0)); + Text.Make($"Levels: {fractallevels}", -(AllocatedWidth / 2) + 1, -4, 21, new Cairo.Color(0, 0, 0)); + Text.Make($"Total Branches: {branches}", -(AllocatedWidth / 2), -30, new Cairo.Color(0.1, 1, 0.1)); + Text.Make($"Levels: {fractallevels}", -(AllocatedWidth / 2), -5, new Cairo.Color(0.1,1,0.1)); } } } diff --git a/FractalTreeGtk/Draw/Fractal.cs b/FractalTreeGtk/Draw/Fractal.cs index feff3bf..87cde8a 100644 --- a/FractalTreeGtk/Draw/Fractal.cs +++ b/FractalTreeGtk/Draw/Fractal.cs @@ -7,31 +7,36 @@ namespace FractalTreeGtk.Draw { internal class Fractal { + public bool Drawing = true; + CairoWindow window; double Length = 100; double MainDegree = 0.4; int levels; int level = 0; double deltaLength = 5; public Branch[][] Fractallines; - public Fractal(int levels) + public Fractal(int levels, CairoWindow window) { - this.levels = levels; - Fractallines = new Branch[levels + 1][]; - CreateBranch(); + this.window = window; + this.levels = levels; + Fractallines = new Branch[levels + 1][]; + CreateBranch(); } private void CreateBranch() { - Fractallines[level] = new Branch[Convert.ToInt32(Math.Pow(2, level))]; - for (int i = 0; i < Fractallines[level].Length; i++) - { - Fractallines[level][i] = new Branch(0, 0, 0, -Length, true, 0); - } - level++; - NextLevel(); + Fractallines[level] = new Branch[Convert.ToInt32(Math.Pow(2, level))]; + for (int i = 0; i < Fractallines[level].Length; i++) + { + Fractallines[level][i] = new Branch(0, 0, 0, -Length, true, 0); + } + level++; + NextLevel(); } private void NextLevel() { + window.QueueDraw(); Length -= deltaLength; + window.QueueDraw(); Fractallines[level] = new Branch[Convert.ToInt32(Math.Pow(2, level))]; int x = 0; for (int i = 0; i < Fractallines[level - 1].Length; i++) @@ -82,6 +87,7 @@ namespace FractalTreeGtk.Draw { NextLevel(); } + else Drawing = false; } //private int SumOfBranches() //{