Pull to refresh

Comments 41

А что станет с прямой линией?

p.s. понимаю, глупый вопрос
Ну да, прямая линия заменяется на прямую линию, потом снова… Ничего увлекательного. )
Именно поэтому не стоило её делать по умолчанию. Пришлось поломать голову, прежде чем дошло, что надо добавить нодов, чтобы что-то получилось.
У меня от этой штуки Firefox умер, когда я поменял «Fractal iterations» на 5 (два раза пробовал).
Как можно этого избежать?
Странно, я тестировал на Firefox под убунтой. На какой версии падает, на какой платформе, сколько точек было в базовой линии?
20 точек. Видимо происходит расчет (одно из ядер ЦП загружено на 100%), но вешается весь браузер.
Firefox 22.0, Window 7 Enterprise 64-bit, Intel Core i5-2540M 2.60 GHz, 16 GB RAM

Расчеты могут быть требовательны к ресурсам, но хотелось бы иметь возможность их прервать не убивая браузер. :-)
Ну да, 20 точек в 5 степени — 3.2 миллиона точек. С одной стороны много, с другой стороны — современные компьютеры умеют и не такое. Можно вычисления вынести отдельно и добавить кнопочку cancel. Тоже забавная задача, может сегодня вечером займусь. А может html canvas не готов к такому количеству lineTo.
В убунте фокс наверняка 64битный, а в винде нет. Он случайно в лимит в 2гб рамы не стукается?
Убрал рекурсию. Добавил прогресс бар и кнопку отмены. Теперь рисует не более 10 тысяч отрезков за раз. Вешать браузер не должно. :)
Знаю, что скажу бред, но фрактал из шапки чем-то напоминает Game Of Life.
Что-то в Хроме никаких фракталов не видно. Просто пустой квадрат.
Shift + левая кнопка мыши на базовой линии — добавление новой вершины;
Ctrl + ЛКМ на вершине — удаление вершины;
ЛКМ на вершине — перемещение;
ЛКМ на сегменте — использование отражения на данном сегменте;
ЛКМ на пустом месте — передвижение всей фигуры целиком.
Значит перерисовка на JS вообще не запускается. Хотя я уже на двух компах проверил работу в Хроме, на обоих удачно. Эх, сложная это штука — веб-дев.
Интересно. У меня сейчас запущена эта же версия Хрома, правда на старенькой WinXP. Все работает. Может нет доступа к frac.js?
Обновите -> откройте другую вкладку -> верните текущую. Мне помогло :-)
Chrome 28 Win8
Интересно.
А что если на каждой итерации брать не первоначальную фигуру в качестве продолжения фрактала, а фигуру, получающуюся на n-1 итерации? Конечно, он будет очень быстро расти, но какая при этом будет образовываться форма?
Если я правильно понимаю, то будет та же фигура, просто 1, 2, 4, 8, 16-й шаги и так далее.
Да, действительно. Не подумав написал.
Кстати, чтобы самому ничего не скачивать, можно было бы сразу в jsfiddle.net разместить для демонстрации (правда там почему-то не работает). Также у вас есть небольшие ошибки в скрипте.
Ну да. Я проверил с помощью JSHint на jsfiddle. Пропущена точка с запятой в getBaselineSegmentIndex и прочие мелочи.
Для того, чтобы имитировать класс, вам следовало бы определять методы внутри прототипа конструктора, например так:
fracObject.prototype.redraw = function () { ... };
fracObject.prototype.getBaseline = function () { ... };
fracObject.prototype.getInverse = function () { ... };

Экземпляр класса fracObject инстанцировать с помощью оператора new
document.body.onload = function() {
   var frac = new fracObject();
   ...
};

Ну и производить инициализацию внутри конструктора. Правда в таком случае, в отличии от вашего, свойства будут доступны снаружи.
function fracObject() {
   this.baseline = [ { x: 50, y: 450 }, { x: 550, y: 450 } ];
   this.normalized = [];
   this.fracDepth = 0;
   ...
};

Конструкторы, кстати, принято именовать с большой буквы.
Как пользоваться конструкторами и прототипами я прочитал… Потом еще раз прочитал… Потом решил, что пойму это как-нибудь в следующий раз, а пока сделаю функцию, которая создает два объекта: один возвращает, а второй замыкает. Так что fracObject — это именно функция и маленькая буква здесь к месту.
Возможно уже завтра озарение настигнет меня и я пойму, что все сделал неправильно.
в сафари под макосью очень печально медленно
Есть проблема: можно добавить одну ноду и вытянуть её так, что длина рёбер будет больше, чем расстояние между концами ломаной. Условие «as needed» никогда не сработает, т.к.отображение получилось несжимающее, и вообще говоря это уже не фрактал.

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

Разумно было бы ограничивать не число итераций, а останавливать разбиение ребра, когда его длина становится равной 1 px, т.е. более тонкую картинку уже невозможно отобразить.
«as needed» как раз повторяет итерации до тех пор, пока длина очередного отрезка не станет меньше 3 px. Но при этом не более 10 итераций в глубину, что позволяет остановиться в случае несжимающих отображений. Так что алгоритмически обработка в любом случае конечна. Но увы, конечная не значит быстрая. То, что программка при достаточном числе узлов и итераций может ввести в кому браузер мы уже выяснили, да…
На Mac клик с зажатым Ctrl считается кликом правой кнопкой мыши. К сожалению, похоже, быстро сделать обработку Cmd не получится, поэтому, наверное, самым легким решением будет добавить altKey параллельно с ctrlKey. Спасибо :)
Попробовал добавить alt. На линуксе alt+click перемещает окна, на винде — никак не реагирует. )
Попробуйте использовать e.keyCode. Вот всевозможные коды для клавиши cmd: 91, 93, 157, 224. Первые два для webkit, остальные, к сожалению, уже не помню от чего.
Было бы здорово, если бы предусматривалась возможность генерировать фракталы, которые задаются не базовыми линиями, а сжимающими отображениями. Скажем, изначально есть прямоугольник, мы его сжимаем и двигаем, получаем другой прямоугольник. Потом возвращаемся к изначальному, снова сжимаем и двигаем. Таким образом мы задаем систему сжатий. Потом, как гласит фрактальная геометрия, если взять любой компакт (к примеру, любую точку), и применять к ней эти отображения (сжатия и сдвиги), потом применять их к тем точкам, которые получились, и так далее — то будет вырисовываться фрактал. А ускориться можно согласно теории хаоса на фракталах — возмем просто случайную последовательность из индексов сжимающих отображений и будем применять к точке, должен получиться тот же фрактал.
Классная идея с рисованием в браузере!
Сразу вспомнил студенчество и свою подобную десктопную программу в качестве курсовика. Только я делал задание начальной аксиомы и правил трансформации в виде текста. Плюс для красоты некоторых фракталов реализовал полутона.
image

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

Если кому интересно — вот программа с примерами разных фракталов в каталоге Samples.
Фрактал, это когда фигура повторяет сама себя, каким образом тогда в «мозайке» из прямоугольника получился квадрат в центре?
Во-первых, у вас неверное определение фрактала. Бывают нерегулярные фракталы.
Во-вторых, ничего удивительного нет в «квадрате из прямоугольника». Вон, из ломаной же получаются картинки вроде той, что выше.
Для фракталов на базе L-систем можно. Вообще зависит от «навороченности» правила и возможных поддерживаемых конструкций рисования. Их может быть достаточно много.
en.wikipedia.org/wiki/L-system#Example_7:_Fractal_plant

Example 7: Fractal plant
variables: X F
constants: + − [ ]
start: X
rules: (X → F-[[X]+X]+F[+FX]-X), (F → FF)
angle: 25°
Here, F means «draw forward», — means «turn left 25°», and + means «turn right 25°». X does not correspond to any drawing action and is used to control the evolution of the curve. [ corresponds to saving the current values for position and angle, which are restored when the corresponding ] is executed.

Sign up to leave a comment.

Articles