Courbe du dragon

Soyez le premier à donner votre avis sur cette source.

Vue 7 694 fois - Téléchargée 357 fois

Description

Programme Windows affichant la courbe du dragon. Je présente deux algorithme, l'un récursif et l'autre non.
Voir http://www.mathcurve.com/fractals/dragon/dragon.shtml pour plus d'infos sur cette courbe fractale.

Source / Exemple :


; #########################################################################
;
; Courbe du dragon
; algorithme non récursif
;
; #########################################################################

      .386
      .model flat, stdcall
      option casemap :none   ; case sensitive

; #########################################################################

      include \masm32\include\windows.inc
      include \masm32\include\user32.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\gdi32.inc
      
      includelib \masm32\lib\user32.lib
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\gdi32.lib

; #########################################################################

      ;=============
      ; Local macros
      ;=============

    

      m2m MACRO M1, M2
        push M2
        pop  M1
      ENDM

      return MACRO arg
        mov eax, arg
        ret
      ENDM

 
        ;=================
        ; Local prototypes
        ;=================
        WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
        WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD

    .data
        szDisplayName db "Dragon",0
        szClassName db "dragon",0
        CommandLine   dd 0
        hWnd          dd 0
        hInstance     dd 0

    .code

start:
        invoke GetModuleHandle, NULL
        mov hInstance, eax

        invoke GetCommandLine
        mov CommandLine, eax

        invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
        invoke ExitProcess,eax

; #########################################################################

WinMain proc hInst     :DWORD,
             hPrevInst :DWORD,
             CmdLine   :DWORD,
             CmdShow   :DWORD

 

        LOCAL wc   :WNDCLASSEX
        LOCAL msg  :MSG

 
        mov wc.cbSize,         sizeof WNDCLASSEX
        mov wc.style,          CS_HREDRAW or CS_VREDRAW 
                         
        mov wc.lpfnWndProc,    offset WndProc
        mov wc.cbClsExtra,     NULL
        mov wc.cbWndExtra,     NULL
        m2m wc.hInstance,      hInst   ;<< NOTE: macro not mnemonic
        mov wc.hbrBackground,  COLOR_WINDOW+1
        mov wc.lpszMenuName,   NULL
        mov wc.lpszClassName,  offset szClassName
          invoke LoadIcon, NULL, IDI_APPLICATION
        mov wc.hIcon,          eax
          invoke LoadCursor,NULL,IDC_ARROW
        mov wc.hCursor,        eax
        mov wc.hIconSm,        0

        invoke RegisterClassEx, ADDR wc

        invoke CreateWindowEx,WS_EX_LEFT,
                              ADDR szClassName,
                              ADDR szDisplayName,
                              WS_OVERLAPPEDWINDOW,
                              CW_USEDEFAULT, CW_USEDEFAULT,
                              785,560,
                              NULL,NULL,
                              hInst,NULL
        mov   hWnd,eax

       
        invoke ShowWindow,hWnd,SW_SHOWNORMAL
        invoke UpdateWindow,hWnd

    StartLoop:
      invoke GetMessage,ADDR msg,NULL,0,0
      cmp eax, 0
      je ExitLoop
      invoke TranslateMessage, ADDR msg
      invoke DispatchMessage,  ADDR msg
      jmp StartLoop
    ExitLoop:

      return msg.wParam

WinMain endp

; #########################################################################

WndProc proc hWin   :DWORD,
             uMsg   :DWORD,
             wParam :DWORD,
             lParam :DWORD

        LOCAL hDC  :DWORD
        LOCAL Ps   :PAINTSTRUCT

    
    .if uMsg == WM_PAINT
        invoke BeginPaint,hWin,ADDR Ps
        mov hDC,eax
        pushad

        mov edx,90  ;x
        mov ebx,355  ;y

        mov ecx,20000h ;nombre de points divisé par 2
        mov al,0 
pix:    mov esi,ecx
l1:     shr esi,1
        jnb l1
        shr esi,1
        jb l2
        xor al,1
l2:     or al,al
        jz l3
        sub ebx,2
l3:     inc ebx

        push eax
        push ebx
        push edx
        push ecx
        invoke SetPixel,hDC,edx,ebx,0      
        pop ecx
        pop edx
        pop ebx
        pop eax
        
        test cl,1
        jz l5
        xor al,1
l5:     or  al,al
        jnz l6
        sub edx,2
l6:     inc edx
        
        push eax
        push ebx
        push edx
        push ecx
        invoke SetPixel,hDC,edx,ebx,0      
        pop ecx
        pop edx
        pop ebx
        pop eax
        
        loop pix
         
        popad
        invoke EndPaint,hWin,ADDR Ps
        
        return 0

    
    .elseif uMsg == WM_DESTROY
        invoke PostQuitMessage,NULL
        return 0 

    .endif

    invoke DefWindowProc,hWin,uMsg,wParam,lParam

    ret

WndProc endp

end start

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Avec quoi tu l'a compilé? J'ai fait avec tasm et j'obtiens un exe de 610 octets alors que ton exécutable n'en fait que 98
cs_Nasman
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008

Avec NASM j'obtiens un exécutable de 98 octets (à condition de préciser byte devant 3 arguments (byte au lieu de word par défaut)
00000000 B81200 mov ax,0x12
00000003 CD10 int 0x10
00000005 B800A0 mov ax,0xa000
00000008 8ED8 mov ds,ax
0000000A B1FF mov cl,0xff
0000000C B80000 mov ax,0x0
0000000F BA0020 mov dx,0x2000
00000012 BEA51A mov si,0x1aa5
00000015 88CD mov ch,cl
00000017 89C3 mov bx,ax
00000019 D0ED shr ch,1
0000001B D1DB rcr bx,1
0000001D 73FA jnc 0x19
0000001F D1EB shr bx,1
00000021 7203 jc 0x26
00000023 80F201 xor dl,0x1
00000026 08D2 or dl,dl
00000028 7508 jnz 0x32
0000002A D0CE ror dh,1
0000002C 83D600 adc si,byte +0x0
0000002F E90500 jmp 0x37
00000032 D0C6 rol dh,1
00000034 83DE00 sbb si,byte +0x0
00000037 0834 or [si],dh
00000039 A801 test al,0x1
0000003B 7403 jz 0x40
0000003D 80F201 xor dl,0x1
00000040 83C650 add si,byte +0x50
00000043 08D2 or dl,dl
00000045 7504 jnz 0x4b
00000047 81EEA000 sub si,0xa0
0000004B 0834 or [si],dh
0000004D 40 inc ax
0000004E 75C5 jnz 0x15
00000050 FEC1 inc cl
00000052 75C1 jnz 0x15
00000054 B400 mov ah,0x0
00000056 CD16 int 0x16
00000058 B80300 mov ax,0x3
0000005B CD10 int 0x10
0000005D B8004C mov ax,0x4c00
00000060 CD21 int 0x21

Ce code est très compact compte tenu de la "complexité" de l'image obtenue. Question subsidiaire: quelle serait la taille de cette image bitmap ?

Dommage que le code ne soit pas commenté. Je suppose que le processus est récursif et qu'une constante définit la finesse du motif.
vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Pas de récursivité si tu regardes bien (pas de call), tout est itératif
Mais j'ai un peu de mal à comprendre le code moi aussi...
cs_pasty
Messages postés
11
Date d'inscription
lundi 2 février 2004
Statut
Membre
Dernière intervention
11 juillet 2009

Pour la compilation j'ai utilisé A86.
L'algorithme n'est en effet pas récursif. Le programme execute une boucle de 20000h (registre ax et cl) itérations. A chaque itération:
1 On modifie dl en fonction du compteur de boucle. On remplace x par x+1 ou x-1 suivant la valeur du bit de poids faible de dl.
2 on dessine un point en (x,y)
3 on modifie dl, on remplace y par y-1 ou y+1
4 on dessine un point en (x,y)
cs_badr_info
Messages postés
1
Date d'inscription
vendredi 29 avril 2005
Statut
Membre
Dernière intervention
8 janvier 2006

Avec quoi tu l'a compilé? ya t'il une methodes pour que ton
code se fais a n'importe quel profondeurs..est que tous les
calcules portant sur les nombres passe par la FPU ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.