Фрагмент множества Мандельброта с анимация

Впервые я прочитал о фракталах больше 40 лет назад, классе в пятом-шестом, в журнале «Техника — молодежи». Помню, там была изображена снежинка Коха. Слово «фрактал» происходит от латинского «дробный», так как у этих математических фигур дробная размерность.
«Облака — не сферы, горы — не конусы, береговые линии — не окружности, древесная кора не гладкая, молния распространяется не по прямой» — писал Бенуа Мандельброт — первооткрыватель самого известного фрактала, названного в его честь — множества Мандельброта.

y7lgcgpfmv59co8bmqjayoqg_58.jpeg
Фрагмент множества Мандельброта для примера

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

nbfeizfdgc0v8qzaur_xyq2mrik.jpeg
Фрагмент множества Мандельброта для примера

Существует много программ для построения фракталов, я тоже написал такую программу. И так сложилось, что написал ее на языке ассемблера. Поэтому она работает быстро и занимает очень мало места на диске. И она бесплатна!

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 кадров в секунду. Смотрим на картинка!

c962c2116906c3511defa4fc5e361147.gif

Фрагмент множества Мандельброта с анимация

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_600 px.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 байт фрагмент множества Мандельброта неподвижный.

j2n2iaoho_xahzu8jakrjgq8mns.jpeg
Фрагмент множества Мандельброта для примера

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 — предпочтительный метод завершения процесса. Эта функция обеспечивает чистое отключение процесса.

zqzui0-qi1b3ro3rdvfxuzlgzvu.jpeg
Фрагмент множества Мандельброта для примера

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 для выход.

0dgnecnoks_5repul5fjktqfqec.jpeg
Фрагмент множества Мандельброта для примера

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 кадров в секунду.

pvz7hxnnhk3wapaqj0khj9w00jo.jpeg
Фрагмент множества Мандельброта для примера

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.

do_gr_ifqodarhcofqxhcvwzece.jpeg
Фрагмент множества Мандельброта для примера

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.

rkjrycyn3cupovynlgdckcanpjw.jpeg
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×256.

Собираем.

bco_to-rmkuz90mnafojch-rki8.jpeg

jabpjnbkj7v05hexkx58kguy1f8.jpeg

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

3zprtb5rr7g2m8ojpckqzwxgnkq.jpeg

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

qzjir4j9t3lnx_pc1-537vhsarq.jpeg

Но конечно вы не видите анимация 60 кадров в секунду! Сделайте сами.

И последнее. У меня три статьи:

ЦВЕТА белиссимо,
Забытый порт 3c0, или видят ли камеры иллюзии и
Фрагмент множества Мандельброта с анимация.

Можете ли вы английский язык? Что бы распространять в Великобритания, Северная Америка, Австралия? Не я. Вы. Я больше года назад перенес инсульт. И вряли что могу. Я почти не ходячий! И скоро вероятно умру. А статьи может бы не знаю… Но я слышал что Creative Commons — некоммерческая организация, которая создала бесплатные для использования свободные публичные лицензии…

Я знаю Wikimedia Commons Aokoroko, где много моих фрагмент множества Мандельброта.

© Habrahabr.ru