«Облака — не сферы, горы — не конусы, береговые линии — не окружности, древесная кора не гладкая, молния распространяется не по прямой» — писал Бенуа Мандельброт — первооткрыватель самого известного фрактала, названного в его честь — множества Мандельброта.

Фрагмент множества Мандельброта для примера
Изобразить его стало возможно только после появления компьютеров. Без расчетов его форму не узнать никак, а расчетов требуется намного больше, чем возможно выполнить вручную. Поэтому изображения множества Мандельброта — это показатель высокого уровня цивилизации. Археологи не находят этих картин в прошлом Земли, значит, у древних народов не было такого уровня развития.

Фрагмент множества Мандельброта для примера
Существует много программ для построения фракталов, я тоже написал такую программу. И так сложилось, что написал ее на языке ассемблера. Поэтому она работает быстро и занимает очень мало места на диске. И она бесплатна!
flat assembler 1.73.32 for Windows
flatassembler.net/download.php
Tomasz Grysztar!
Кроме FASM.EXE нужно INCLUDE.
И три файла:
Mandelbrot.asm
params.bmp
Mandelbrot.ico
После того как Mandelbrot.exe не просто фрагмент множества Мандельброта а анимация или мультипликация — технические приёмы создания иллюзии движущихся изображений до 60 кадров в секунду. Смотрим на картинка!

600 × 600 pixels, file size: 69.85 MB, MIME type: image/gif, looped, 255 frames.
upload.wikimedia.org/wikipedia/commons/1/1e/Mandelbrot_Set_Color_Cycling_Animation_600px.gif
Еще мне кажется что объёмный а не плоский мир! Иллюзия? Вы тоже видите?
Однако приступим!
format PE GUI 4.0
include 'include\win32a.inc'
entry start
section '.code' code readable executable
start:
        invoke  GetModuleHandle,0
        mov     [clsHInstance],eax
        invoke  LoadIcon,eax,9955
        mov     [clsHIcon],eax
        invoke  LoadCursor,0,IDC_HAND
        mov     [clsHCursor],eax
        invoke  RegisterClass,clsStyle
        invoke  CreateWindowEx,0,splclassname,spltitlename,WS_VISIBLE+WS_POPUP,100,70,1600,900,0,0,[clsHInstance],0
        mov     [newhwnd],eax
        invoke  GetDC,[newhwnd]
        mov     [MyDC],eax
        invoke  CreateDIBSection,[MyDC],bhead,0,tut,0,0
        mov     [HBitmap],eax
        mov     esi,bhead+1064
        mov     edi,[tut]
        mov     ecx,1440000
        repe    movsb
        invoke  CreateCompatibleDC,[MyDC]
        mov     [CoDC],eax
        invoke  SelectObject,[CoDC],[HBitmap]
        mov     [OBitmap],eax
        invoke  CreateThread,0,0,Thr1Proc,0,0,Thr1ID
        mov     [t1hndl],eax
Здесь окно изначально отображается и всплывающее. 1600 и 900. И 1 440 000 байт фрагмент множества Мандельброта неподвижный.

Фрагмент множества Мандельброта для примера
msg_loop:
        invoke  GetMessage,msHWND,0,0,0
        or      eax,eax
jz end_loop
        invoke  DispatchMessage,msHWND
jmp msg_loop
end_loop:
        invoke  SelectObject,[CoDC],[OBitmap]
        invoke  DeleteObject,[HBitmap]
        invoke  DeleteDC,[CoDC]
        invoke  ReleaseDC,[newhwnd],[MyDC]
        invoke  CloseHandle,[t1hndl]
        invoke  ExitProcess,0
Здесь ExitProcess — предпочтительный метод завершения процесса. Эта функция обеспечивает чистое отключение процесса.

Фрагмент множества Мандельброта для примера
proc WndProc, hwnd,wmsg,wparam,lparam
        push    ebx esi edi
        cmp     [wmsg],WM_DESTROY
je wmdestroy
        cmp     [wmsg],WM_KEYDOWN
je  wmdestroy
        cmp     [wmsg],WM_NCHITTEST
jne nonchi
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
        cmp     eax,1
jne finish
        mov     eax,2
jmp finish
nonchi:
        invoke  DefWindowProc,[hwnd],[wmsg],[wparam],[lparam]
jmp finish
wmdestroy:
        invoke  PostQuitMessage,0
        xor     eax,eax
finish:
        pop     edi esi ebx
        ret
endp
Здесь WM_NCHITTEST — всякий раз, когда происходит событие от нажатия кнопки мыши. Посмотрите! И WM_DESTROY для выход.

Фрагмент множества Мандельброта для примера
proc Thr1Proc,Paramx
align 16
again:
        std
        mov     esi,bhead+40
        add     esi,1016
        mov     edi,esi
        lodsd
        mov     ecx,254
        repe    movsd
        stosd
        cld
        invoke  SetDIBColorTable,[CoDC],0,256,bhead+40
        invoke  DwmFlush
        invoke  BitBlt,[MyDC],0,0,1600,900,[CoDC],0,0,SRCCOPY
jmp again
endp
Значимая часть! Анимация — сменяющих друг друга с большой частотой до 60 кадров в секунду! Это DwmFlush! И BitBlt для 1600 х 900. Кстати только несколько процентов всего! Несмотря на 60 кадров в секунду.

Фрагмент множества Мандельброта для примера
section '.idata' import data readable writeable
  library kernel,'KERNEL32.DLL',\
          user,'USER32.DLL',\
          gdi,'GDI32.DLL',\
          dwmapi,'DWMAPI.DLL'
  
  import kernel,\
      GetModuleHandle,'GetModuleHandleA',\
      CreateThread,'CreateThread',\
      CloseHandle,'CloseHandle',\
      ExitProcess,'ExitProcess'
  import user,\
      RegisterClass,'RegisterClassA',\
      CreateWindowEx,'CreateWindowExA',\
      DefWindowProc,'DefWindowProcA',\
      GetMessage,'GetMessageA',\
      DispatchMessage,'DispatchMessageA',\
      LoadCursor,'LoadCursorA',\
      LoadIcon,'LoadIconA',\
      GetDC,'GetDC',\
      ReleaseDC,'ReleaseDC',\
      PostQuitMessage,'PostQuitMessage'
  import gdi,\
      CreateDIBSection,'CreateDIBSection',\
      CreateCompatibleDC,'CreateCompatibleDC',\
      SelectObject,'SelectObject',\
      DeleteObject,'DeleteObject',\
      DeleteDC,'DeleteDC',\
      SetDIBColorTable,'SetDIBColorTable',\
      BitBlt,'BitBlt'
      
   import dwmapi,\
      DwmFlush,'DwmFlush'
Все! Это import kernel, user, gdi и dwmapi.

Фрагмент множества Мандельброта для примера
section '.data' data readable writeable
clsStyle            dd    0
clsLpfnWndProc      dd    WndProc
clsCbClsExtra       dd    0
clsCbWndExtra       dd    0
clsHInstance        dd    ?
clsHIcon            dd    ?
clsHCursor          dd    ?
clsHbrBackground    dd    COLOR_BTNFACE+1
clsLpszMenuName     dd    0
clsLpszClassName    dd    splclassname
spltitlename        db    'Mandelbrot',0
splclassname        db    'ekjgddirkul2',0
bhead               file  'params.bmp':0eh
Thr1ID              rd    1
t1hndl              rd    1
newhwnd             rd    1
tut                 rd    1
                    
HBitmap             rd    1
OBitmap             rd    1
MyDC                rd    1
CoDC                rd    1
msHWND              rd    1
msMESSAGE           rd    1
msWPARAM            rd    1
msLPARAM            rd    1
msTIME              rd    1
msPT                rd    2
Это много dd и file params.bmp.

section '.rsrc' resource data readable
directory RT_ICON,splico,RT_GROUP_ICON,splgroup
resource splico,8855,0,ico0
resource splgroup,9955,0,grp0
icon grp0,ico0,'Mandelbrot.ico'
Здесь Mandelbrot.ico иконка 256 x 256.
Собираем.


Готово! Файл Mandelbrot.exe готов. Если Far, то видим так:

Вот так выполнили Mandelbrot.exe:

Но конечно вы не видите анимация 60 кадров в секунду! Сделайте сами.
И последнее. У меня три статьи:
ЦВЕТА белиссимо
Забытый порт 3c0, или видят ли камеры иллюзии
Фрагмент множества Мандельброта с анимация
Можете ли вы английский язык? Что бы распространять в Великобритания, Северная Америка, Австралия? Не я. Вы. Я больше года назад перенес инсульт. И вряли что могу. Я почти не ходячий! И скоро вероятно умру. А статьи может бы не знаю… Но я слышал что Creative Commons — некоммерческая организация, которая создала бесплатные для использования свободные публичные лицензии…
Я знаю Wikimedia Commons Aokoroko, где много моих фрагмент множества Мандельброта.
А вот нашел! Намного большие!
splushka.narod.ru/SplMandelbrot.zip
СОСТАВ КОМПЛЕКТА
В этот комплект входит исходный текст программы и компилятор FASM,
нужный для того, чтобы из исходного текста создать приложение.
Это действие исключительно простое — нужно перетащить мышкой
значок файла SplMandelbrot.asm на значок FASM так, чтобы
произошло действие «Открыть с помощью».
В результате в папке немедленно появится приложение SplMandelbrot.
ОПИСАНИЕ ПРОГРАММЫ
Приложение SplMandelbrot рисует во весь экран участок множества Мандельброта и показывает анимацию.
Направление движения анимации можно менять стрелочными клавишами
клавиатуры компьютера.
Две разные палитры раскраски можно выбирать клавишами F6 и F7.
Пять разных заранее выбранных интересных мест множества Мандельброта
можно выбирать клавишами F1, F2, F3, F4, F5.
Клик левой кнопкой мыши приближает (увеличивает) изображение в 2 раза,
клик правой кнопкой мыши — отдаляет (уменьшает) изображение в 2 раза.
Информацию о понравившемся изображении можно сохранить на будущее в файл
клавишей End и потом загрузить из файла клавишей Ins.
Чтобы выйти, нужно нажать клавишу Esc.
Приложение SplMandelbrot можно также использовать как экранную заставку.
Чтобы это сделать, нужно в Проводнике в верхнем меню «Вид» поставить галочку
«Расширения имен файлов», а затем переименовать файл SplMandelbrot.exe
в SplMandelbrot.scr — когда появится предупреждение «Вы действительно хотите это сделать»,
выбрать «Да». После этого тип файла станет не «Приложение», а «Заставка».
Если теперь кликнуть по этому файлу правой кнопкой мыши, то в меню
будет пункт «Установить».
Во время работы экранной заставки будут действовать все клавиши,
которые перечислены выше, чтобы выйти из полноэкранной заставки,
нужно будет нажать клавишу Esc.
И наконец Mandelbrot.exe просто один файл!!!
splushka.narod.ru/Mandelbrot.zip
Комментарии (23)
 - starik-200504.07.2024 08:31+1- Вот бы еще и посчитать на асме, бо, как я понял, тут просто раскрашивание картинки... 
 - Stanislavvv04.07.2024 08:31+3- Что-то вспомнилось, что во времена, когда на экране было 256 цветов, подобные эффекты делались ротацией палитры... 386 был практически не нагружен... 
 - dlinyj04.07.2024 08:31- Классная хабратортная статья. Хранить программы на narod это конечно в 2024 забавно, когда есть git. Но простим, если человеку уже сложно писать.  - aokoroko Автор04.07.2024 08:31- bmp надо а не git  - dlinyj04.07.2024 08:31+1- Не понял при чём здесь bmp, ну да ладно.  - starik-200504.07.2024 08:31+2- Это, видимо, незнакомые слова встретились: "narod" и "git". Предположу, что git был воспринят, как gif -> bmp )))  - dlinyj04.07.2024 08:31+1- Мне триста лет, я выполз из тьмы. - Ну не знаю, как можно писать код, статьи на хабр и не знать, хотя бы не слышать о системе контроля версий. 
 
  - aokoroko Автор04.07.2024 08:31- https://splushka.narod.ru/params.bmp - bmp надо! gif нельзя! Если бы можно gif я бы сказал и сделал!  - dlinyj04.07.2024 08:31+2- Git я говорю о системе контроля версий и хранения кода, например https://github.com/. Хранить код на народе, ну такое себе. И в общем-то из контекста можно было понять о чём я говорю.  - aokoroko Автор04.07.2024 08:31- flat assembler не дает :)  - dlinyj04.07.2024 08:31- Да? С чего вдруг? Я вот ваш проект уже упихал в git. В папке с проектом выполняем: - git init git add Mandelbrot.asm Mandelbrot.ico params.bmp git commit -m "First commit" git remote add origin https://github.com/dlinyj/Mandelbrot.git git push --set-upstream origin master- Разумеется вам нужно будет свою репу создать, но вот моя репа с вашими сорцами https://github.com/dlinyj/Mandelbrot . Посмотрите, потом я удалю её. - Под виндой можно использовать gitbash https://gitforwindows.org/ . А так, если вы кодите. тем более на ассемблере, то как вы не пользуетесь системой контроля версий, я не понимаю. А если нужно будет сделать отдельную ветку ПО? А потом её влить в основную, как вы будете делать?  - dlinyj04.07.2024 08:31+1- Я советую зарегестрироваться на гитхабе, сделать форк моего проекта и я его удалю.  - И дальше уже с ним сами развлекайтесь. 
 
 
 
 
 
 
 
 - dlinyj04.07.2024 08:31- Можете ли вы английский язык? Что бы распространять в Великобритания, Северная Америка, Австралия? Не я. Вы. - Касательно перевода на английский, пишите на русском. Если статья по настоящему ценная, то её переведут и так. Если нет, то подлежит забвению. Мою статью вот переводили. Русская и вот кто-то перевёл.  - aokoroko Автор04.07.2024 08:31- https://splushka.narod.ru/SplMandelbrot.zip - СОСТАВ КОМПЛЕКТА - В этот комплект входит исходный текст программы и компилятор FASM, 
 нужный для того, чтобы из исходного текста создать приложение.- Это действие исключительно простое - нужно перетащить мышкой 
 значок файла SplMandelbrot.asm на значок FASM так, чтобы
 произошло действие "Открыть с помощью".- В результате в папке немедленно появится приложение SplMandelbrot. - ОПИСАНИЕ ПРОГРАММЫ - Приложение SplMandelbrot рисует во весь экран участок множества Мандельброта и показывает анимацию. 
 - Направление движения анимации можно менять стрелочными клавишами 
 клавиатуры компьютера.- Две разные палитры раскраски можно выбирать клавишами F6 и F7. - Пять разных заранее выбранных интересных мест множества Мандельброта 
 можно выбирать клавишами F1, F2, F3, F4, F5.- Клик левой кнопкой мыши приближает (увеличивает) изображение в 2 раза, 
 клик правой кнопкой мыши - отдаляет (уменьшает) изображение в 2 раза.- Информацию о понравившемся изображении можно сохранить на будущее в файл 
 клавишей End и потом загрузить из файла клавишей Ins.- Чтобы выйти, нужно нажать клавишу Esc. - Приложение SplMandelbrot можно также использовать как экранную заставку. 
 Чтобы это сделать, нужно в Проводнике в верхнем меню "Вид" поставить галочку
 "Расширения имен файлов", а затем переименовать файл SplMandelbrot.exe
 в SplMandelbrot.scr - когда появится предупреждение "Вы действительно хотите это сделать",
 выбрать "Да". После этого тип файла станет не "Приложение", а "Заставка".- Если теперь кликнуть по этому файлу правой кнопкой мыши, то в меню 
 будет пункт "Установить".- Во время работы экранной заставки будут действовать все клавиши, 
 которые перечислены выше, чтобы выйти из полноэкранной заставки,
 нужно будет нажать клавишу Esc. - aokoroko Автор04.07.2024 08:31- И наконец Mandelbrot.exe просто один файл!!! splushka.narod.ru/Mandelbrot.zip  - dlinyj04.07.2024 08:31+1- Мне в догонку нет смысла это кидать, я не буду точно этим заниматься.Но можно всё подробно изложить в статье. 
 
 
 
 - alexxz04.07.2024 08:31+1- Пользуясь случаем хочу порекомендовать книгу Бенуа Мандельброта Фрактальная геометрия природы. Мне она очень понравилась. 
 - Mr_Daduda04.07.2024 08:31- Есть ли смысл переделать с асма на CUDA? Позволяет уже размер чисел с плавающей точкой на GPU? 
 
           
 
anzay911
Вы продоёте множества?
Нет, просто показываю.