Christmas contest 2005 :)
От: Кодт Россия  
Дата: 24.12.04 12:17
Оценка: 26 (3)
В прошлом году я закидывал тему нарисовать снежинку
Автор: Кодт
Дата: 31.12.03
.
Давайте в этом попробуем кое-что другое.

Как растут ледяные узоры на стекле?
Всё начинается с нескольких точек кристаллизации, из которых прорастают ледяные лучики. Затем от каждого лучика появляются ветки — прямо и ±60°. Когда ветка упирается в уже имеющийся ледяной узор, её рост прекращается.

Вот такая тема для скринсейвера Возьмётесь?
Перекуём баги на фичи!
Re: Christmas contest 2005 :)
От: IO Украина  
Дата: 24.12.04 12:59
Оценка: :)
Здравствуйте, Кодт, Вы писали:

К>В прошлом году я закидывал тему нарисовать снежинку
Автор: Кодт
Дата: 31.12.03
.

К>Давайте в этом попробуем кое-что другое.
Я даже боюсь представить, что мы нарисуем к 2010 году

К>Как растут ледяные узоры на стекле?

К>Всё начинается с нескольких точек кристаллизации, из которых прорастают ледяные лучики. Затем от каждого лучика появляются ветки — прямо и ±60°. Когда ветка упирается в уже имеющийся ледяной узор, её рост прекращается.

Что-то типа волнового алгоритма просится. Только двумерное пространство стекла топологически преобразуется — все точки проростания сводятся в одну (из нее начинается фронт волны). Т.е. расстояние между любыми такими точками равно нулю. А расстояние между остальными — минимуму из "прямого расстояния" и "расстояния через ближайшие точки проростания". Это как телепортеры на карте стратегии.

Конечно надо еще подумать насчет не дискретности пространства и переменной длины лучей.
Re: Christmas contest 2005 :)
От: Crab Украина  
Дата: 24.12.04 15:03
Оценка:
Здравствуйте, Кодт, Вы писали:

К>В прошлом году я закидывал тему нарисовать снежинку
Автор: Кодт
Дата: 31.12.03
.

К>Давайте в этом попробуем кое-что другое.

К>Как растут ледяные узоры на стекле?

К>Всё начинается с нескольких точек кристаллизации, из которых прорастают ледяные лучики. Затем от каждого лучика появляются ветки — прямо и ±60°. Когда ветка упирается в уже имеющийся ледяной узор, её рост прекращается.

К>Вот такая тема для скринсейвера Возьмётесь?


Что-то я не то с рекурсией делаю... rundll32 зависает при переключение скринсейверов

I'm the hero I'm back
With weapons and with magic spells
Re[2]: Christmas contest 2005 :)
От: Кодт Россия  
Дата: 24.12.04 15:11
Оценка:
Здравствуйте, Crab, Вы писали:

C>Что-то я не то с рекурсией делаю... rundll32 зависает при переключение скринсейверов


Ну если ты всё рисуешь в одном глубоком погружении, то конечно. А кто будет оконные события обрабатывать?
Тут нужно или делать машину состояний, или многопоточное (многофиберное?) приложение.
Перекуём баги на фичи!
Re[3]: Christmas contest 2005 :)
От: Crab Украина  
Дата: 24.12.04 15:32
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Crab, Вы писали:


C>>Что-то я не то с рекурсией делаю... rundll32 зависает при переключение скринсейверов


К>Ну если ты всё рисуешь в одном глубоком погружении, то конечно. А кто будет оконные события обрабатывать?

К>Тут нужно или делать машину состояний, или многопоточное (многофиберное?) приложение.

Вот максимум что у меня получилось.... http://www.rsdn.ru/File/30016/Scrnsave2.rar

Все равно красиво, но не по теме

I'm the hero I'm back
With weapons and with magic spells
Re: Christmas contest 2005 :)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.12.04 21:26
Оценка: 17 (2)
Здравствуйте, Кодт, Вы писали:

Вот, сойдёт? Хотя лично мне не нравиться.
http://www.rsdn.ru/File/2053/xmas.rar
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Christmas contest 2005 :)
От: XopoSHiy Россия http://cleancodegame.github.io/
Дата: 25.12.04 18:08
Оценка: 164 (16)
Здравствуйте, Кодт, Вы писали:

К>Как растут ледяные узоры на стекле?

К>Всё начинается с нескольких точек кристаллизации, из которых прорастают ледяные лучики. Затем от каждого лучика появляются ветки — прямо и ±60°. Когда ветка упирается в уже имеющийся ледяной узор, её рост прекращается.

Немного домыслено и подправлено, чтобы получилось покрасивее.

Только посколько ScreenSaver-ы писать не умею (и учиться не хочу :)), то это просто exe-шник похожий на scr.
http://www.rsdn.ru/File/19050/xMasFrost.rar (160 KB)

Реализован на вероятностном конечном автомате на трёх состояниях:
1. Растём
2. Отпочковываем вправо
3. Отпочковываем влево

Отпочковывание создаёт новый лучик.

Переход от 1 к 2 или 3 происходит с небольшой вероятностью.
Переход от 2 или 3 обратно к 1 — тоже.

Растут лучики с небольшим креном (они действително именно так растут — специально на окна трамвая смотрел :)).

Вот.
---
http://twitter.com/xoposhiy
http://xoposhiy.moikrug.ru
Re: Christmas contest 2005 :)
От: hemmul США  
Дата: 25.12.04 20:00
Оценка:
Здравствуйте, Кодт, Вы писали:

К>В прошлом году я закидывал тему нарисовать снежинку
Автор: Кодт
Дата: 31.12.03
.

К>Давайте в этом попробуем кое-что другое.

К>Как растут ледяные узоры на стекле?

К>Всё начинается с нескольких точек кристаллизации, из которых прорастают ледяные лучики. Затем от каждого лучика появляются ветки — прямо и ±60°. Когда ветка упирается в уже имеющийся ледяной узор, её рост прекращается.

К>Вот такая тема для скринсейвера Возьмётесь?


вот :shuffle:
никак не прочитал у NeHe туториал о том, как скринсейверы делать... так-что уж exe-шником если позолите
P.S. интересно а как сделать эффект запотевшего стекла...

vox clamantis in deserto
Re[2]: Christmas contest 2005 :)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.12.04 20:37
Оценка:
Здравствуйте, hemmul, Вы писали:

H>никак не прочитал у NeHe туториал о том, как скринсейверы делать...


Ищем в MSDN по строкам scrnsave.lib/scrnsave.h Надо написать 3 callback функции из которых одна это простая оконная процедура, а две другие могут быть пустыми.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Christmas contest 2005 :)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.12.04 20:39
Оценка:
Здравствуйте, hemmul, Вы писали:

H>вот :shuffle:


У меня всё размазалось и проц на 100% загрузился. Ограничений по разрешению нет? У меня рабочее 1600х1200 — не много?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Christmas contest 2005 :)
От: XopoSHiy Россия http://cleancodegame.github.io/
Дата: 25.12.04 20:50
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, hemmul, Вы писали:


H>>вот :shuffle:


A>У меня всё размазалось и проц на 100% загрузился. Ограничений по разрешению нет? У меня рабочее 1600х1200 — не много?


У меня всё нормально запустилось. Только ме-е-едленно. И лучики почти всегда друг-друга "пробивают" насквозь, вместо того, чтобы останавливаться.

А вообще, понятно, что идея в том голом виде, в котором она была предложена, не даёт красивой картинки... Надо её как-то развивать и домысливать. Например, случайности добавить.
---
http://twitter.com/xoposhiy
http://xoposhiy.moikrug.ru
Re[2]: Christmas contest 2005 :)
От: Пономарёв Иван Россия  
Дата: 25.12.04 20:57
Оценка:
Здравствуйте, hemmul, Вы писали:


H>вот :shuffle:



А у меня без MFC71.DLL работать отказывается
Re[4]: Christmas contest 2005 :)
От: hemmul США  
Дата: 26.12.04 08:07
Оценка:
Здравствуйте, XopoSHiy, Вы писали:

XSH>Здравствуйте, adontz, Вы писали:


A>>У меня всё размазалось и проц на 100% загрузился. Ограничений по разрешению нет? У меня рабочее 1600х1200 — не много?

многовато будет

XSH>У меня всё нормально запустилось. Только ме-е-едленно. И лучики почти всегда друг-друга "пробивают" насквозь, вместо того, чтобы останавливаться.

да, это точно — медленно потому что я пересечения каждого лучика со всеми отсальными по дереву проверяю (кроме его родителей и детей, но всё равно ясно что долго очень). а вот пробивают они друг друга насквозь не всегда: я сделал так, что если точка пересечения отстоит от конца луча менее чем на N поцентов — луч останавливается... если нет — продолжает ползти (т.е. это зачит, что если луч А въехал в бок лучу Б, то луч А остоновится, а Б продолжит ползти...)

XSH>А вообще, понятно, что идея в том голом виде, в котором она была предложена, не даёт красивой картинки... Надо её как-то развивать и домысливать. Например, случайности добавить.

vox clamantis in deserto
Re: Christmas contest 2005 :)
От: Пономарёв Иван Россия  
Дата: 26.12.04 08:29
Оценка:
Ну, как-то так

пока -- только для единственного центра кристаллизации.

Идея такова: имеется очередь "лучиков" на связном списке. Проходимся по списку, для каждого "лучика" проверяем, не пересекся ли он с другими. Если пересекся, то корректируем его длину и отрисовываем. Если не пересекся -- то отрисовываем, а также добавляем 2 лучика (его продолжение и отпочковавшийся) в конец очереди.

Думаю, надо 1. доработать модель, выдающую случайные длины "прямого" и "отпочкованного" лучиков. 2. Сделать для нескольких центров кристаллизации 3. Что-то придумать, чтобы не тестировать текущий лучик на пересечение со всем списком, а только с той частью, где пересечение наиболее вероятно
Re[2]: update :)
От: Пономарёв Иван Россия  
Дата: 26.12.04 10:54
Оценка:
новая версия

1. Подчищен код и убрана утечка памяти

2. Добавлена имитация возникновения новых центров кристаллизации

3. Длина лучиков стала поменьше (соответственно, лучиков стало больше и программа -- медленнее).

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

Ну и ещё -- извиниться за exe, а не scr формат
Re[3]: update :)
От: XopoSHiy Россия http://cleancodegame.github.io/
Дата: 26.12.04 11:51
Оценка: 12 (1)
Здравствуйте, Пономарёв Иван, Вы писали:

ПИ>новая версия :user:


ПИ>1. Подчищен код и убрана утечка памяти :shuffle:

ПИ>2. Добавлена имитация возникновения новых центров кристаллизации
ПИ>3. Длина лучиков стала поменьше (соответственно, лучиков стало больше и программа -- медленнее).

Несколько придирчевых замечаний:
1. Не обрабатываются оконные сообщения (Вставь куда-нибудь Application.ProcessMessages — и всё пройдёт)
2. Если на форму бросить TImage и рисовать на его канве, а не на канве формы, то рисунок будет сохраняться при перерисовке формы (т.е. после Alt+Tab, Alt+Tab)
3. Чего-то они отпочковываются только в одну сторону... смотрится как что-то закручивающееся :)
4. Центры кристалицайии не всегда в пределах окна.
5. Поставь Position у формы в какое-нибудь приличное значение, типа poScreenCenter, а то она появляется у меня где-то наполовину за краем экрана :)
6. Мне показалось, или лучики всё таки иногда пересекаются?

Как избавится от тормозов:
Первый вариант: можно использовать для хранения лучиков не простой список, а что-нибудь типа квадродерева. Но это муторно и лениво.

Второй вариант — как это у меня сделано: лучик каждый раз растёт на 1 пиксель и перед тем как пиксель поставить, он проверяет окрестность на свободность. Эта проверка — банальное сравнение цвета пикселя с цветом фона. Таким образом проверка "можно ли лучику вырасти" осуществляется за O(1), а не за O(n), как у тебя.
Для сравнения, квадродеревья дадут сложность что-то около O(log(n)) для этой операции.

PS. Я всё жду, когда же тут появится вариант, который:
а) имеет какое-нибудь отношениие к модели роста инея на стекле
б) будет красиво смотреться в качестве ScreenSaver-а.
---
http://twitter.com/xoposhiy
http://xoposhiy.moikrug.ru
Re[4]: update :)
От: hemmul США  
Дата: 26.12.04 14:20
Оценка:
Здравствуйте, XopoSHiy, Вы писали:

XSH>Как избавится от тормозов:

XSH>Первый вариант: можно использовать для хранения лучиков не простой список, а что-нибудь типа квадродерева. Но это муторно и лениво.
так и делаем-с...

XSH>Второй вариант — как это у меня сделано: лучик каждый раз растёт на 1 пиксель и перед тем как пиксель поставить, он проверяет окрестность на свободность. Эта проверка — банальное сравнение цвета пикселя с цветом фона. Таким образом проверка "можно ли лучику вырасти" осуществляется за O(1), а не за O(n), как у тебя.

класс! где Вы раньше были?

vox clamantis in deserto
Re[4]: update :)
От: Пономарёв Иван Россия  
Дата: 26.12.04 20:31
Оценка:
Здравствуйте, XopoSHiy.

Спасибо за конструктивные замечания! Отвечаю.


XSH>1. Не обрабатываются оконные сообщения (Вставь куда-нибудь Application.ProcessMessages — и всё пройдёт)


Да вставлено, вставлено всё равно он ждет, когда метод отрисовки закончится. Я думаю, что в следующей версии надо выносить отрисовку в отдельную нить. Так, чтобы можно было выбрать "STOP" и "PAUSE"

XSH>2. Если на форму бросить TImage и рисовать на его канве, а не на канве формы, то рисунок будет сохраняться при перерисовке формы (т.е. после Alt+Tab, Alt+Tab)


Можно, я знаю. Но TImage -- он хранит свой битмап в памяти. Я из соображений минимизации ресурсов сделал отрисовку на форме. Ведь, если это будет скринсейвер -- то не всё ли равно?


XSH>3. Чего-то они отпочковываются только в одну сторону... смотрится как что-то закручивающееся



Да. Пока только в одну сторону. Я уже думал о том, что надо бы в обе стороны, причем сделать, как у тебя -- лучик "хранит" информацию о том, куда он почкуется, и переход на другую сторону осуществляется с малой вероятностью. Я, наверное, так сделаю в следующей версии (наряду с пунктом 1)


XSH>4. Центры кристалицайии не всегда в пределах окна.


У меня немного некорректно там передается информация о размерах окна, это я подправлю.


XSH>5. Поставь Position у формы в какое-нибудь приличное значение, типа poScreenCenter, а то она появляется у меня где-то наполовину за краем экрана


Справедливое замечание. Но делалось-то всё как? На самую что ни на есть скорую руку, лишь бы работало


XSH>6. Мне показалось, или лучики всё таки иногда пересекаются?


Нет, не показалось. Объясняю, почему. У меня программа ищет (аналитически!) для каждого лучика тот лучик, который с ним пересекается. Когда находится первый, поиск прекращается. При этом, могут существовать лучики, с которыми текущий пересекается раньше. Чтобы этого избежать, я не должен прекращать поиск на первом попавшемся лучике, а проработать всю очередь до конца. Если б то была серьёзная программа для научных исследований, я б так и сделал... А пока... пока моя прога не работает достаточно быстро, я решил забить на этот эффект.

XSH>Как избавится от тормозов:

XSH>Первый вариант: можно использовать для хранения лучиков не простой список, а что-нибудь типа квадродерева. Но это муторно и лениво.

Би-дерево -- знаю, а вот квадро... Век живи -- век учись, как говорится Попробую что-нибудь на эту тему почитать. Или может напишешь в двух словах, как это (применительно к данной задаче)? На самом деле, первое, что я хочу попробовать -- это сделать список двусвязным и проходить его при поиске не с начала, а с конца. Ведь наиболее вероятно, что лучик пересекается с тем, который недавно был отрисован и находится рядом в очереди. Возможно, это так -- надо эксериментировать.

XSH>Второй вариант — как это у меня сделано: лучик каждый раз растёт на 1 пиксель и перед тем как пиксель поставить, он проверяет окрестность на свободность. Эта проверка — банальное сравнение цвета пикселя с цветом фона. Таким образом проверка "можно ли лучику вырасти" осуществляется за O(1), а не за O(n), как у тебя.


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

XSH>Для сравнения, квадродеревья дадут сложность что-то около O(log(n)) для этой операции.


Можешь написать в двух словах идею?

XSH>PS. Я всё жду, когда же тут появится вариант, который:

XSH>а) имеет какое-нибудь отношениие к модели роста инея на стекле
XSH>б) будет красиво смотреться в качестве ScreenSaver-а.

Что ж, ждем вместе
Re[5]: update :)
От: Пономарёв Иван Россия  
Дата: 26.12.04 20:43
Оценка: :)
Хемуль!

Так где мне всё-таки взять MFC71.DLL, чтоб заценить Вашу работу? Ну не работаю я в MSVC++
Re[6]: update :)
От: adontz Грузия http://adontz.wordpress.com/
Дата: 26.12.04 21:34
Оценка:
Здравствуйте, Пономарёв Иван, Вы писали:

ПИ>Так где мне всё-таки взять MFC71.DLL, чтоб заценить Вашу работу? Ну не работаю я в MSVC++


Почту дай — кину
A journey of a thousand miles must begin with a single step © Lau Tsu
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.