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

Security Warning: этот ответ не соответствует лучшим рекомендациям по безопасности. Эвакуация неадекватна для предотвращения SQL-инъекции , вместо этого используйте подготовленные операторы . Используйте стратегию, изложенную ниже, на свой страх и риск. (Кроме того, mysql_real_escape_string() был удален в PHP 7.)

Вы могли бы сделать что-то основное:

$safe_variable = mysql_real_escape_string($_POST["user-input"]);
mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");

Это не решит каждую проблему, но это очень хороший ступень. Я оставил очевидные элементы, такие как проверка существования переменной, числа (числа, буквы и т. Д.).

76
задан user151019 8 March 2017 в 10:37
поделиться

9 ответов

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

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

Так, запустите путем сканирования каждой точки в той прямоугольной области. Каждая точка представляет Комплексное число (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.) Фигура, как перевести (-2,2) прямоугольный регион к координатам экрана.

57
ответ дан meJustAndrew 24 November 2019 в 11:18
поделиться

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

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

f (z) = z <глоток> 2 + C

, где z является комплексом , переменная и C является комплексом постоянный . Теперь Вы выполняете итерации его начинающий с z = 0, т.е. Вы вычисляете z1 = f (0), z2 = f (z1), z3 = f (z2) и так далее. Набор тех констант C, для которого z1 последовательности, z2, z3... , ограничил , т.е. это не переходит к бесконечности, Множество Мандельброта (черный набор в числе на странице Wikipedia).

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

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

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

Обладают!

27
ответ дан Stormblessed 24 November 2019 в 11:18
поделиться

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

Один из образцов является простой реализацией Mandelbrot.

8
ответ дан Greg Hewgill 24 November 2019 в 11:18
поделиться

Другой превосходный фрактал для изучения является Фракталом Треугольника Серпинского.

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

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

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

6
ответ дан abelenky 24 November 2019 в 11:18
поделиться

Я запустил бы с чего-то простого, как Снежинка Коха . Это - простой процесс провожения строки и преобразования его, затем повторяя процесс рекурсивно, пока это не выглядит аккуратным-o.

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

fractal(p0, p1){
    Pmid = midpoint(p0,p1) + moved some distance perpendicular to p0 or p1;
    fractal(p0,Pmid);
    fractal(Pmid, p1);
}
5
ответ дан Dave Baghdanov 24 November 2019 в 11:18
поделиться

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

Псевдокод:

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) в квадрате для предоставления ( a-b*b+2*abi). Необходимо будет использовать составной тип или включать то вычисление в цикл.

3
ответ дан Jimmy 24 November 2019 в 11:18
поделиться

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

http://flam3.com/flame_draves.pdf

2
ответ дан Algorias 24 November 2019 в 11:18
поделиться

Вот codepen, который я записал для фрактала Mandelbrot использование плоскости JavaScript и HTML.

, Надо надеяться, легко понять код.

самая сложная часть является масштабом, и переведите системы координат. Также сложный делает палитру радуги.

function mandel(x,y) {
  var a=0; var b=0;
  for (i = 0; i<250; ++i) {
    // Complex z = z^2 + c
    var t = a*a - b*b;
    b = 2*a*b;
    a = t;
    a = a + x;
    b = b + y;
    var m = a*a + b*b;
    if (m > 10)  return i;
  }
  return 250;
}

enter image description here

0
ответ дан 24 November 2019 в 11:18
поделиться

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

Алгоритм для IFS: es следующий:

Начать со случайной точки.

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

Применить одно из N предопределенные преобразования (матричные преобразования или аналогичные) до точки. Примером может служить умножение каждой координаты на 0,5. Нанесите новую точку на экран.

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

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

6
ответ дан 24 November 2019 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: