Клеточные автоматы ч.2 - Conway's Game of Life (С++ WinAPI)
Запись от bedvit размещена 01.03.2019 в 21:15
Обновил(-а) bedvit 05.02.2021 в 18:56 (13/05/2019 Актуализация версии: Life v1.9.0.0)
Обновил(-а) bedvit 05.02.2021 в 18:56 (13/05/2019 Актуализация версии: Life v1.9.0.0)
Решил сделать свой велик. Программа Life Видео и новые версии программы на сайте. Продукт написан на С++, GUI на WinAPI. Предыдущая часть: Клеточные автоматы ч.1 - Conway's Game of Life in Excel Основные параметры: 1. Размер игрового поля 2^32 на +2^32 клеток (рамка примерно 4,3*4,3 млрд. клеток) - поле закольцовано по X, Y координатам. 2. Масштаб от 32 пикселей - одна клетка, до 1 млр. клеток на один пиксель (можно загрузить целиком самый большой космический корабль "Gemini", размером рамки в 4 млн. клеток, посмотреть в подробностях - по ссылке есть загрузочный шаблон в архиве и даже увидеть всю игровую вселенную на экране) 3. Замедление хода в мс.(микросекунда=1/1000 сек.) 4. Шаг поколений. В один ход (ход - отрисовка инфо на экране) рассчитываем указанное количество поколений. Параметр нужен для того, что бы посмотреть динамику жизни при скорости выше 60-65 поколений в секунду. Предполагаю, потому как, WinAPI (WM_PAINT) не может отрисовать более 60Гц в секунду (частота обновления экрана). 5. Быстрая отрисовка в WinAPI через CreateDIBSection, с прямым доступом через DIB к битам Bitmap (следующий этап - Dirext3D, пока в разработке). 6. Кнопка "Начало координат" - перемещение в начало координат (левая верхняя точка пользовательского окна - координаты: 0.0). Работает при расчете жизни. Если вдруг потерялись Эта же позиция отрисовывается при запуске программы и при создании нового поля. Загрузка всех шаблонов происходит тоже в начало координат. 7. Горячие кнопки 8. Сочетание кнопок для действий - новый холст, открыть и сохранить файл - стандартные (к примеру, сохранить CTRL+S) 9. Чтение и запись формата RLE, форматы 10. Рисуем/Удаляем левой кнопкой 11. Таскаем холст - правой 12. Масштабирование - колесико мышки 14/03/2019 Обновление версии: Life v1.4.0.0 (1.4.0.4) - Обновлен интерфейс и сетка игрового поля. - Оптимизирован алгоритм расчета и отрисовки - теперь быстрее на 30%. - Добавлены команды: 13. "Инфо.панель" - информация о настройках, игровом поле. 14. "Показать ареал" - показать весь ареал (клетки, где была и есть жизнь) на экране. 15. "Автомасштаб" - автомасштабирование ареала до размеров экрана. 16. "Ареал по живым" - сужения ареала только до живых клеток. И замеченного: у меня, версия х32 работает на 30% быстрее, чем х64 (win7 x64), что на первый взгляд, кажется парадоксальным (в профилировщике видно, что в версии х64 больше ресурсов уходит на поиск - "std::unordered_map::find") В комбинации "Автомасштаб" и "Ареал по живым" дают интересный эффект - можно смотреть движение одиночных фигур в пространстве, к примеру космические корабли (для более качественного просмотра, можно замедлить движение, см.п.3). В архиве, прилагаю для теста, несколько простых шаблонов в формате RLE. На рис. "Желудь" ("Acorn"), "Фабрика космических кораблей" ("p416 60P5H2V0 gun"), "Космический корабль" ("p15 pre-pulsar spaceship") (по ссылкам есть шаблоны, которые можно загрузить в программу) 15/04/2019 Обновление версии: Life v1.5.0.0 - Завершение проекта 1. Оптимизирован алгоритм расчета, итого с 1й версии до 5й скорость выросла с 26 поколений в секунду до 232 п./с. на примере фигуры ("p416 60P5H2V0 gun") (27 тыс. живых клеток). 2. Расширен диапазон MAX количества живых клеток - до 10 млн. (за счет резервирования большего количества памяти), построение на примере фигуры Max, (в прилагаемых шаблонах есть). С проверкой переполнения. 3. Немного переработан интерфейс, разделил вывод и ввод, мелкие оптимизации для правильной работы с клавиатуры. 4. Планировал перейти на 3D (работу начал, но на это нужно время, которого сейчас нет, и в ближайшем будущем не будет на этот проект) посему выкладываю рабочие исходники данной версии на WinAPI, может кто-то напишет лучше, подключит Direct3D или в целях самообразования просто попилит код. Код, писал в целях обучения, еще есть где оптимизировать, к примеру контролируемое перехеширование и перезапись итераторов, позволит изначально использовать меньше памяти (резервировать меньше изначально). Можно, к примеру, уйти от хеш-таблиц, создать динамический выделяемые блоки памяти (к примеру по 1024*1024 байт), с контролем времени жизни (есть/нет живые клетки). С ними линейные скорости чтения, поиска (мы знаем адрес), записи. Перемещение - смещение на степень двойки очень быстрая процедура. Но опять же, есть и свои подводные камни. А времени нет додумать концепцию и реализовать. Исходники с комментариями на русском, распространяются как есть, под свободной лицензией. Репозиторий: https://github.com/bedvit/Life 13/05/2019 Обновление версии: Life v1.7.0.0 - Игровое поле, пользовательские сообщения 1. Реализована закольцовка игрового поля по по X, Y координатам. 2. Реализован правильный механизм масштабирования на границах 3. Увеличен диапазон масштабирования до 1 млр. клеток на один пиксель, теперь всю вселенную можно уместить на экран и даже в несколько пикселей (удобно при масштабировании/поиске сильно отдаленных друг от друга объектов). 4. Добавлены пользовательские сообщения (о выходе за рамки игрового поля и т.д.) 5. Исправлены некритичные ошибки. 6. Репозиторий обновлен. В итоге: теперь программа представляется, как вполне законченная. |
Всего комментариев 16
Комментарии
-
Запись от vlisp размещена 02.03.2019 в 23:52 -
Запись от bedvit размещена 03.03.2019 в 09:05 -
Запись от Avazart размещена 06.03.2019 в 16:11 -
Запись от bedvit размещена 06.03.2019 в 21:41 -
Запись от bedvit размещена 14.03.2019 в 20:19 -
Это просто круто! К сожалению, ничем не могу помочь, это далеко за пределами моей компетенции. Я сам хочу что-то подобное сделать, но сначала попроще. Скажем, на поле 800x600. Подумываю изучить либо Qt, либо SDL. WinAPI для меня слишком сложно. Я вообще почти не работал с графикой. Мне нравится решать задачи на алгоритмы и структуры данных.
Запись от Вадим Тукаев размещена 15.03.2019 в 09:53 -
Вадим Тукаев, спасибо за оценку. По нижепредставленной ссылке начинал данную тему, реализация на VBA, с полем 500*500 клеток, закольцованное и с гибелью на границах. Может будет интересно для начала. Клеточные автоматы ч.1 - Conway's Game of Life in Excel. Реализация на WinAPI тоже не такая сложная. Сейчас, лично для меня, сложнее на DirectX 11 + C++ переложить, чем было перейти с VBA на WinAPI.
Запись от bedvit размещена 15.03.2019 в 21:54 -
“написан на С++, GUI на WinAPI.”
Странный выбор. Сегодня наверно адекватно GUI на Qt. Графика там же. На хабре был вроде как редактор на Web OpenGL. Посмотрел картинки гугла клеточные автоматы…все они скучны и однообразны. Не понимаю чем заинтересовали. Например странные аттракторы Symmetric Icons, IFS fractals https://habr.com/ru/post/328568/
или Fractal Flames другое дело.Запись от Excalibur921 размещена 15.03.2019 в 22:39 -
Даже играя со старыми фракталами можно парой строк делать красиво.
https://www.cyberforum.ru/open... 08557.htmlЗапись от Excalibur921 размещена 15.03.2019 в 23:20 -
Был интересен вариант сделать графику без доп.библиотек, на низкоуровневом фундаменте под Win, понять как все работает, прокачать уровень. Будет время, хочу подключить к отрисовке ГП, т.е. DirectX 11. Опять же, по возможности без доп.библиотек, пощупать все своими руками. Может быть возьму минимум из SDK (к примеру вывод шрифтов, писать свой двиган с нуля нет времени и желания).
Фракталы - это интересно и красиво, спору нет. Посмотрел ваши ссылки.
Но клеточные автоматы - это больше алгоритмы, чем графика.
В жизни Конвея можно построить Универсальный компьютер, реализацию машины Тьюринга. К примеру Spartan universal computer-constructor.Запись от bedvit размещена 16.03.2019 в 09:26
Обновил(-а) bedvit 16.03.2019 в 09:34 -
Запись от fever brain размещена 01.04.2019 в 19:16
Обновил(-а) fever brain 01.04.2019 в 19:18 -
Запись от bedvit размещена 01.04.2019 в 19:31
Обновил(-а) bedvit 22.10.2019 в 15:19 -
15/04/2019 Завершение проекта: Life v1.5.0.0
1. Оптимизирован алгоритм расчета, итого с 1й версии до 5й скорость выросла с 26 поколений в секунду до 232 п./с. на примере фигуры ("p416 60P5H2V0 gun") (27 тыс. живых клеток).
2. Расширен диапазон MAX количества живых клеток - до 10 млн. (за счет резервирования большего количества памяти), построение на примере фигуры Max, (в прилагаемых шаблонах есть). С проверкой переполнения.
3. Немного переработан интерфейс, разделил вывод и ввод, мелкие оптимизации для правильной работы с клавиатуры.
4. Планировал перейти на 3D (работу начал, но на это нужно время, которого сейчас нет, и в ближайшем будущем не будет на этот проект) посему выкладываю рабочие исходники данной версии на WinAPI, может кто-то напишет лучше, подключит Direct3D или в целях самообразования просто попилит код.
Код, писал в целях обучения, еще есть где оптимизировать, к примеру контролируемое перехеширование и перезапись итераторов, позволит изначально использовать меньше памяти (резервировать меньше изначально). Можно, к примеру, уйти от хеш-таблиц, создать динамический выделяемые блоки памяти (к примеру по 1024*1024 байт), с контролем времени жизни (есть/нет живые клетки). С ними линейные скорости чтения, поиска (мы знаем адрес), записи. Перемещение - смещение на степень двойки очень быстрая процедура. Но опять же, есть и свои подводные камни. А времени нет додумать концепцию и реализовать.
Исходники с комментариями на русском, распространяются как есть, под свободной лицензией.
Репозиторий: https://github.com/bedvit/LifeЗапись от bedvit размещена 15.04.2019 в 19:29
Обновил(-а) bedvit 16.04.2019 в 10:06 -
13/05/2019 Обновление версии: Life v1.7.0.0 - Игровое поле, пользовательские сообщения
1. Реализована закольцовка игрового поля по по X, Y координатам.
2. Реализован правильный механизм масштабирования на границах
3. Увеличен диапазон масштабирования до 1 млр. клеток на один пиксель, теперь всю вселенную можно уместить на экран и даже в несколько пикселей (удобно при масштабировании/поиске сильно отдаленных друг от друга объектов).
4. Добавлены пользовательские сообщения (о выходе за рамки игрового поля и т.д.)
5. Исправлены некритичные ошибки.
6. Репозиторий обновлен.
В итоге: теперь программа представляется, как вполне законченная.Запись от bedvit размещена 13.05.2019 в 18:54 -
Экспериментировал с самодельной реакцией диффузии по описанию в тексте
Цитата:
https://www.cyberforum.ru/open... st15099188
Сильно меняется форма рисунков от параметров.
float smallConcentration=0.7f;
float setConcentrationUp=1.0f; // концентрации растворов
float setConcentrationDn=0.7f; //
Может там некий алгоритмический баг?
Похоже на процедурный генератор орнаментов вышивания крестиком. Есть ли название этому алгоритму или им подобным? Может кто-то делал подобное? Искал в гугле по разным вариантам и ничего похожего. Всюду только автоматы и моды “игра жизнь”.Запись от Excalibur921 размещена 16.12.2020 в 14:17 -
Запись от Замабувараев размещена 10.02.2021 в 21:36