Фракталы в GraphABC


#1

Интереса ради переписал несколько алгоритмов фракталов для PascalABC.NET. Для удобства поместил их в модуль. Ссылка на Я-Диск.

В текущей версии реализованы Треугольник Серпинского со случайными вершинами, Кривая дракона и классический папоротник Барнсли.


#2

Для удобства программисты обычно кладут свои проекты на github и т.п. Там и объём бесконечный и сразу удобная система контроля версий.

Что касается модуля:

  1. Он даже не компилируется. Ну допустим если добавить uses, end. и убрать не используемые переменные:

  2. Из всех 3 обещанных видов фракталов - там только папоротник, в 2 вариантах.


#3

Не пересохранил файл после первого сохранения. Вечером перезалью то, что хотел выложить.

UPD: Залил нужный файл по той же ссылке.


#4

@Geluos, попробуйте сгруппировать фракталы в классы (если Ваша цель научиться проектировать архитектуры приложений). Например, есть главный класс Fractal, содержащий общие свойства фракталов. От него наследуются классы-потомки, которые определяют соответственно треугольник Серпинского, фрактал-папоротник и другие. Также можно сделать классы-рендеры фракталов, которые специализируются на отрисовке фракталов, в то время как сами классы фракталов только хранят сами свойства фракталов. Таким образом, будет соблюдён принцип SOLID - Single responsibility principle, а также сами классы фракталов будут реализовывать паттерн Factory Method (в том случае, если будут возвращать объект-рендер посредством, например, интерфейсной ссылки).

public interface IRenderable
{
    IRender Render { get; }
}

public interface IRender
{
    void Draw();
}

public abstract class Fractal
{
}

public class ConcreteFractalA : Fractal, IRenderable
{
    public IRender Render => new RenderA(this);
}

public class ConcreteFractalB : Fractal, IRenderable
{
    public IRender Render => new RenderB(this);
}

public abstract class Render : IRender
{
    public Render(IRenderable target)
    {
    }

    public abstract void Draw();
}

public class RenderA : Render
{
    public RenderA(IRenderable target) : base(target)
    {
    }

    public override void Draw()
    {
    }
}

public class RenderB : Render
{
    public RenderB(IRenderable target) : base(target)
    {
    }

    public override void Draw()
    {
    }
}

internal class Program
{
    private static void Main(string[] args)
    {
    }
}

Ссылки: