Подтвердить что ты не робот

Как программировать фрактал?

У меня нет опыта программирования фракталов. Конечно, я видел знаменитые изображения Мандельброта и т.д.

Можете ли вы предоставить мне простые алгоритмы для фракталов.

Язык программирования не имеет значения, но я больше всего знаком с actionscript, С#, Java.

Я знаю, что если я google фракталы, я получаю много (сложной) информации, но я хотел бы начать с простого алгоритма и играть с ним.

Предложения по улучшению основного алгоритма также приветствуются, например, как сделать их в этих прекрасных цветах и ​​т.д.

4b9b3361

Ответ 1

Программирование Мандельброта очень просто.
Мой код quick-n-dirty ниже (не обязательно без ошибок, но с хорошей схемой).

Вот набросок: Множество Мандельброта лежит в комплексной сетке полностью внутри круга с радиусом 2.

Итак, начните с сканирования каждой точки в этой прямоangularьной области. Каждая точка представляет комплексное число (x + yi). Выполните итерацию этого комплексного числа:

[new value] = [old-value]^2 + [original-value], отслеживая две вещи:

1.) количество итераций

2.) расстояние [нового значения] от источника.

Если вы достигли максимального числа итераций, все готово. Если расстояние от начала координат больше 2, все готово.

Когда закончите, раскрасьте оригинальный пиксель в зависимости от количества итераций, которые вы сделали. Затем перейдите к следующему пикселю.

public void MBrot()
{
    float epsilon = 0.0001; // The step size across the X and Y axis
    float x;
    float y;
    int maxIterations = 10; // increasing this will give you a more detailed fractal
    int maxColors = 256; // Change as appropriate for your display.

    Complex Z;
    Complex C;
    int iterations;
    for(x=-2; x<=2; x+= epsilon)
    {
        for(y=-2; y<=2; y+= epsilon)
        {
            iterations = 0;
            C = new Complex(x, y);
            Z = new Complex(0,0);
            while(Complex.Abs(Z) < 2 && iterations < maxIterations)
            {
                Z = Z*Z + C;
                iterations++;
            }
            Screen.Plot(x,y, iterations % maxColors); //depending on the number of iterations, color a pixel.
        }
    }
}

Некоторые детали опущены:

1.) Узнайте, что такое квадрат комплексного числа и как его рассчитать.

2.) Узнайте, как преобразовать прямоangularьную область (-2, 2) в координаты экрана.

Ответ 2

Вы действительно должны начать с набора Мандельброта и понять, что это на самом деле.

Идея этого относительно проста. Вы начинаете с функции комплексной переменной

f (z) = z 2 + C

где z - комплексная переменная, а C - комплексная постоянная. Теперь вы повторяете его, начиная с z = 0, то есть вычисляете z 1= f (0), z 2= f (z 1), z 3= f (z 2) и так далее. Множество тех констант C, для которых последовательность z 1, z 2, z 3 ,... ограничена, т.е. Не стремится к бесконечности, является множеством Мандельброта (черный цвет на рисунке на странице Википедии).

На практике, чтобы нарисовать набор Мандельброта, вы должны:

  • Выберите прямоугольник в комплексной плоскости (скажем, от точки -2-2i до точки 2 + 2i).
  • Покройте прямоугольник подходящей прямоугольной сеткой точек (скажем, 400x400 точек), которая будет отображаться в пикселях на вашем мониторе.
  • Для каждой точки/пикселя пусть C будет этой точкой, вычислите, скажем, 20 членов соответствующей итерированной последовательности z 1, z 2, z 3 ,... и проверьте, "уходит ли она в бесконечность". На практике во время итерации вы можете проверить, больше ли абсолютное значение одного из 20 слагаемых, чем 2 (если одно из слагаемых имеет значение, последующие слагаемые гарантированно будут неограниченными). Если некоторый z_k делает, последовательность "уходит в бесконечность"; в противном случае вы можете считать его ограниченным.
  • Если последовательность, соответствующая определенной точке C, ограничена, нарисуйте соответствующий пиксель на рисунке черным цветом (поскольку он принадлежит набору Мандельброта). В противном случае нарисуйте его другим цветом. Если вы хотите повеселиться и создать красивые сюжеты, нарисуйте их разными цветами в зависимости от величины абс (20-й член).

Поразительный факт о фракталах состоит в том, как мы можем получить чрезвычайно сложный набор (в частности, границу набора Мандельброта) из простых и, очевидно, безобидных требований.

Наслаждайтесь!

Ответ 3

Если комплексные числа дают вам головную боль, существует широкий диапазон фракталов, которые можно сформулировать с использованием L-системы. Для этого требуется взаимодействие нескольких слоев, но каждый из них интересен в своем собственном праве.

Сначала вам нужна черепаха. "Вперед", "Назад", "Влево", "Вправо", "Пен-ап", ​​ "Пэн-вниз" Есть много веселых форм, которые можно сделать с графикой черепах, используя геометрию черепахи, даже без L-системы, управляющей им. Найдите "графику ЛОГОСА" или "Черепашную графику". Полная LOGO система фактически Lisp, используя unparenthesized Cambridge Polish. Но вам не нужно идти так далеко, чтобы получить красивые картинки, используя концепцию черепахи.

Затем вам понадобится слой для выполнения L-системы. L-системы связаны с Post-systems и Системы Semi-Thue, и, как и virii, они оседлали границу Тьюринга. Концепция переписывается по строкам. Он может быть реализован как макрорасширение или процедура с дополнительными элементами управления для привязки рекурсии. Если вы используете макрорасширение (как в примере ниже), вам все равно потребуется процедура, предназначенная для сопоставления символов командам черепахи и процедуры для итерации по строке или массиву для запуска программы кодированных черепах. Для набора процедур ограниченной рекурсии (например,) вы вставляете команды черепахи в процедуры и либо добавляете проверки уровня рекурсии к каждой процедуре, либо учитываете ее обработчика.

Вот пример дерева Пифагора в постскриптуме с использованием макроразложения и очень сокращенного набора команд черепахи. Для некоторых примеров в python и mathematica см. Мой вызов кода для гольфа.

ps l-system pythagoras tree luser-droog

Ответ 4

В конце каждой главы есть замечательная книга под названием " Хаос и фракталы", в которой есть простой пример кода, который реализует какой-то фрактал или другой пример. Давным-давно, когда я читал эту книгу, я конвертировал каждую программу-пример (на некотором базовом диалекте) в Java-апплет, работающий на веб-странице. Апплеты здесь: http://hewgill.com/chaos-and-fractals/

Один из примеров - простая реализация Мандельброта.

Ответ 5

Еще один отличный фрактал для изучения - фрактальный треугольник Серпинского.

В принципе, нарисуйте три угла треугольника (желательно односторонний, но любой треугольник будет работать), затем запустите точку P в одном из этих углов. Переместите P на полпути к любому из трех углов в случайном порядке и нарисуйте там точку. Снова переместите P на полпути к произвольному углу, нарисуйте и повторите.

Вы думаете, что случайное движение создаст случайный результат, но на самом деле это не так.

Ссылка: http://en.wikipedia.org/wiki/Sierpinski_triangle

Ответ 6

Треугольник Серпинского и кривая Коха представляют собой специальные типы фракталов пламени. Фракталы пламени - это очень обобщенный тип итерированной функциональной системы, поскольку он использует нелинейные функции.

Алгоритм IFS: es выглядит следующим образом:

Start with a random point.

Повторите следующие много раз (по крайней мере, миллион, в зависимости от размера конечного изображения):

Apply one of N predefined transformations (matrix transformations or similar) to the point. An example would be that multiply each coordinate with 0.5. Plot the new point on the screen.

Если точка находится за пределами экрана, вместо этого произвольно выберите новую, расположенную внутри экрана.

Если вам нужны красивые цвета, пусть цвет зависит от последнего использованного преобразования.

Ответ 7

Я бы начал с чего-то простого, например Koch Snowflake. Это простой процесс взятия строки и ее преобразования, а затем повторение процесса рекурсивно, пока он не выглядит аккуратным.

Что-то супер простое, как взять 2 очка (строка) и добавить третью точку (сделать угол), а затем повторить на каждом новом созданном разделе.

fractal(p0, p1){
    Pmid = midpoint(p0,p1) + moved some distance perpendicular to p0 or p1;
    fractal(p0,Pmid);
    fractal(Pmid, p1);
}

Ответ 8

У меня есть набор учебников и кода, написанных на С# на blog, чтобы создать довольно много фракталов, включая Mandelbrot, Julia, Серпинского, Плазмы, Ферна и Ньютона-Рапсона. У меня также есть полный источник для всех фракталов, упомянутых в учебниках, доступных для загрузки из того же места.

Ответ 9

Я думаю, вы не видите фракталов как алгоритм или что-то программировать. Фракталы - это концепция! Это математическая концепция повторяющегося шаблона.

Поэтому вы можете создать фрактал разными способами, используя разные подходы, как показано на рисунке ниже.

enter image description here

Выберите подход, а затем исследуйте, как его реализовать. Эти четыре примера были реализованы с использованием Marvin Framework. Исходные коды доступны здесь

Ответ 10

Набор mandelbrot генерируется путем многократной оценки функции до ее переполнения (некоторый определенный предел), а затем проверки того, сколько времени потребовалось для переполнения.

псевдокод:

MAX_COUNT = 64 // if we haven't escaped to infinity after 64 iterations, 
               // then we're inside the mandelbrot set!!!

foreach (x-pixel)
  foreach (y-pixel)
    calculate x,y as mathematical coordinates from your pixel coordinates
    value = (x, y)
    count = 0
    while value.absolutevalue < 1 billion and count < MAX_COUNT
        value = value * value + (x, y)
        count = count + 1

    // the following should really be one statement, but I split it for clarity
    if count == MAX_COUNT 
        pixel_at (x-pixel, y-pixel) = BLACK
    else 
        pixel_at (x-pixel, y-pixel) = colors[count] // some color map. 

Примечания:

Значение представляет собой комплексное число. комплексное число (a + bi) квадратично, чтобы дать (aa-b * b + 2 * abi). Вам придется использовать сложный тип или включать этот расчет в ваш цикл.

Ответ 11

Здесь простой и понятный код в Java для mandelbrot и других фрактальных примеров

http://code.google.com/p/gaima/wiki/VLFImages

Просто загрузите BuildFractal.jar, чтобы протестировать его на Java и выполните команду:

java -Xmx1500M -jar BuildFractal.jar 1000 1000 по умолчанию MANDELBROT

Исходный код также доступен для загрузки/изучения/редактирования/расширения.

Ответ 12

Ну, простые и графически привлекательные не идут рука об руку. Если вы серьезно относитесь к программированию фракталов, я предлагаю прочитать на итерированных функциональных системах и достижения, которые были сделаны в их рендеринге.

http://flam3.com/flame_draves.pdf

Ответ 13

Люди, находящиеся выше, используют поиск средних точек для sierpinski и Koch, я бы более рекомендовал копировать фигуры, масштабировать их, а затем переводить их для достижения "фрактального" эффекта. Псевдокод в Java для sierpinski будет выглядеть примерно так:

public ShapeObject transform(ShapeObject originalCurve)
    {
        Make a copy of the original curve
        Scale x and y to half of the original
        make a copy of the copied shape, and translate it to the right so it touches the first copied shape
        make a third shape that is a copy of the first copy, and translate it halfway between the first and second shape,and translate it up
        Group the 3 new shapes into one
        return the new shape
    }

Ответ 14

Иногда я программирую фракталы для удовольствия и как вызов. Здесь вы можете найти здесь. Код написан в Javascript, используя библиотеку P5.js и может быть прочитан непосредственно из исходного кода HTML.

Для тех, кого я видел, алгоритмы довольно просты, просто найдите основной элемент, а затем повторите его снова и снова. Я делаю это с помощью рекурсивных функций, но это можно сделать по-другому.