У бета-версии обнаружилось приличное количество мелких ошибок и недочетов, сейчас выкладываю новую версию, от балды названную 0.91.
В ней исправлены баги, улучшена отрисовка фракталов, доведена до ума английская версия интерфейса (какой язык использовать - определяется настройками локализации в системе) а также появились "зачатки автокада" - какие-никакие возможности нарисовать фрактал строго, а не на глазок.
А именно, когда мы выделяем одиночный объект, в панели свойств отображаются его имя, координаты, цвет, коэф. смешения цветов и альфа (прозрачность). В прошлой версии координаты выражались в целых числах, от -231 до 231-1, а теперь - в вещественных, причем желательно держаться диапазона -1..+1. Вся прелесть в том, что, задавая координаты, можно писать не только числа, но и выражения, что-то типа -1+sqrt(3)/2, или bp1.x+1. Здесь bp1 - имя первой базовой точки, данное по умолчанию (можно его поменять на что-то более осмысленное). Если выражение программе "не нравится" - оно выделяется красным, а наведя на него мышку, можно узнать, что же с ним не так, объяснения довольно подробные - то ли скобка лишняя, то ли объект не найден, а может быть указанного свойства у объекта не существует.
Все это позволяет достаточно легко подравнять базовые точки и вектора и нарисовать треугольник Серпинского, кривую Коха, дракон Хартера-Хэтуэя ровно "по учебнику".
Выражения можно вводить не только в панели свойств. Выбирая разрешение картинки, можно написать 1920*3 на 1080*3 - мелочь, а приятно.
Еще фракталы (они все полупрозрачные, можно попробовать их наложить на разный фон) [Spoiler (click to open)]
Кривая Коха. Забавно: моя учительница физики была убеждена, что Koch - это женщина, видимо потому что имя Хельге похоже на женское. Вот все размышляли, как правильно склонять "Кох", чтобы в женском роде. Но на самом деле, это все-таки мужик, Нильс Фабиан Хельге фон Кох.
Дракон Хартера-Хэтуэя цвета "золотой осени". Цвета подчеркивают его самоподобие на разных масштабах.
Полный список исправлений. [Spoiler (click to open)] Исправленные баги - Если перейти в режим просмотра или смешанный режим, когда не нарисовано еще ни одной линии, попросту ничего не будет нарисовано, раньше выскакивала ошибка; - изменение свойств объектов срабатывает всегда, раньше при щелчке мыши по рабочей области (так что снимается выделение) панель свойств обнуляется, не успев изменить последнее измененное поле; - исправлен баг с нахождением хэш-функции документа после выполнения каждой команды. Сейчас эти хэш-функции используются в отладочных целях. При путешествиях по дереву undo проверяется совпадение хэша, т.е что после выполнения команды и последующей отмены документ не изменился ни на бит. Если хэш не совпал - команда не является строго обратимой и нужно искать в ней косяк. Поскольку иногда посчитать хэш - операция затратная, он вычислялся в отдельном потоке и все было нормально, пока "во времени" путешествовал пользователь, но когда все дерево стало просматриваться при открытии проекта, начались Race conditions. Вот они-то и исправлены. - Окончен перевод интерфейса на английский язык, язык выбирается в соответствии с настройками локализации (в v. 0.9 уже был перевод на английский, но после очередного исправления съехали номера ресурсов и кое-где строки перепутались. Сейчас все правильно); Исправленные недочеты - увеличены области, ткнув на которые можно изменять размеры объектов (раньше они были слишком маленькими, сложно было по ним попасть); - короткие линии и векторы рисуются пожирнее, чтобы их было видно; - элементы на панели свойств перерисовываются реже, только при необходимости; - правильные имена и пути объектов в журнале undo - ровно те, которые были при выполнении команды. Сделано это весьма необычным способом - при загрузке проекта мы путешествуем по всем состояниям документа и восстанавливаем имена и пути. Действительно, зачем хранить лишнюю информацию в файле, если у нас машина времени? - на панели свойств отображаются координаты с плавающей точкой, в рабочую область вписан квадрат -1 < x,y < +1 - вместо "холостых итераций", на которых наугад выбранная точка должна "втянуться в аттрактор", мы попросту берем неподвижную точку первого преобразования за начальную, а потом начинам игры порядка и хаоса, сразу показывая точки на экране. Это самую чуточку быстрее и элегантнее - переопределено понятие цвета вектора/линии, раньше наблюдалось насыщение цвета, слишком "кислотные" цвета, сейчас помягче. - более корректная работа инструмента "добавить базовую точку". Если одна точка уже есть, а другой еще нет - он добавляет вторую, после чего переключается на инструмент "добавить вектор". Если же мы выбрали инструмент "добавить базовую точку", когда их уже две - он сначала поставит на выбранное место первую точку, затем вторую, а только потом переключится. - если мы нарисовали слишком длинный вектор/прямую, так что вместо сжимающего отображения он выражает "разжимающее", он становится жирно-красным и в построении фрактала не участвует (иначе неминуемо переполнение) - улучшен рендеринг изображения, но все равно фракталы получаются "жирноваты", с потерей мелких деталей. Чтобы их сохранить, нужно изначально строить фрактал в более высоком разрешении, а потом уже снижать его в 2-3 раза. Soon. Нововведения - введено автосохранение в файл current_project.txt, лежащий в папке с программой, каждые 10 секунд, отдельным потоком, чтобы не мешать работе; - соответственно, current_project.txt не рассматривается как надежное место для хранения - если при запуске программы оттуда считался проект, он не считается сохраненным и при создании или открытии проекта будет предупреждение - данные могут пропасть; - во всех текстовых полях допустимы не только числа, но и выражения, об этом уже было сказано. Todo Остался неисправленным баг с поворотом - если он осуществляется тычком правой кнопкой мыши в любом месте рабочей области, то изображается поворот вокруг непонятно какой оси, но при отпускании он повернет вокруг центра выделенных объектов.
Если хотите, могу записать еще один ролик на ютубе, где это демонстрируется. Научиться бы еще не сопеть в микрофон и говорить хоть самую малость пожизнерадостнее)
На этой неделе с братом разбирались в функциональном анализе, пожалуй, смогу теперь написать математическое обоснование, что пользователь задает достаточно данных, чтобы однозначно определить фрактал, а программа строит именно его, насколько позволяет разрешение картинки. Там все просто - вводим пространство непустых компактных подмножеств ℜ5 с Хаусдорфовой метрикой и доказываем, что оно является полным метрическим пространством. Если так, то у любого сжимающего отображения будет одна и только одна неподвижная точка - это и есть наш фрактал. Остается еще показать, что, ставя в соответствие каждой точке изображения набор преобразованных точек, мы получим именно сжимающее отображение в Хаусдорфовой метрике - и дело в шляпе.