begin process at 2008 07 19 16:32:42
1 212 905 membres
227 nouveaux aujourd'hui
14 165 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ARBRE2D: UN PROGRAMME GÉNÉRANT DES ARBRES


Information sur la source



Description

Ce programme à pour objectif, de dessiner des arbres.
Il n'est pas conseillé de mettre trop d'itérations pour dessiner vos arbres, non pas pour une question de résultat mais pour une question de temps. Peut facilement durer jusqu'à 10 minutes.

Possibilité de faire 3 arbres différents (information: le tronc et les branches de l'arbre ne sont pas dessinés)...

Conclusion

Vos avis sont les bienvenus...
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

  • signaler à un administrateur
    Commentaire de acx01b le 15/01/2008 22:22:51

    salut

    tu n'as jamais vu ceci ?
    http://fr.wikipedia.org/wiki/L-System

  • signaler à un administrateur
    Commentaire de BruNews le 15/01/2008 23:58:26 administrateur CS

    ndubien, je sens que vais être désagréable (non non je plaisante, quoi que...).
    COLORREF temp = GetPixel( hdc, x, y );
    if(GetRValue(temp) == 255 && GetGValue(temp) == 255 && GetBValue(temp) == 255) SetPixel(hdc, x, y, RGB(0,0,0));
    Une aussi énorme horreur dans la boucle critique, NONNNNNNN !!!
    Va donc voir l'ASM du compilo, tu seras dégouté.
    if((tmp & 0xFFFFFF) == 0xFFFFFF) tmp = 0;
    else tmp = ... je te le laisse celui ci
    SetPixel(hdc, x, y, tmp);

    Maintenat juste pour le fun, teste ceci qui booste sérieusement le dessin.
    J'ai commenté autant que j'ai pu.
    __declspec(naked) void __stdcall TracerTraitVert(HDC hdc, double Ax, double Ay, double Bx, double By)
    {
      __asm {
        push      ebx
        push      ebp
        push      esi
        push      edi
        ;// hdc [esp+20], Ax [esp+24], Ay [esp+32], Bx [esp+40], By [esp+48]
        cvttsd2si eax, [esp+24]   ;// x1 = round(Ax)
        cvttsd2si ecx, [esp+32]   ;// y1 = round(Ay)
        cvttsd2si ebx, [esp+40]   ;// EBX = x2 = round(Bx)
        cvttsd2si esi, [esp+48]   ;// ESI = y2 = round(By)
        push      eax
        push      ecx
        mov       edi, eax
        cvtsi2sd  xmm3, ebx       ;// xmm3 = x2
        cvtsi2sd  xmm4, esi       ;// xmm4 = y2
        mov       eax, ebx
        sub       eax, edi        ;// x2 - x1
        cdq
        mov       edi, eax
        xor       edi, edx
        mov       eax, esi
        sub       edi, edx        ;// EDI = nbBoucles = abs(x2-x1)
        sub       eax, ecx        ;// y2 - y1
        cdq
        xor       eax, edx
        sub       eax, edx        ;// eax = abs(y2-y1)
        push      0               ;// x1*i
        push      0               ;// y1*i
        cmp       edi, eax
        jae       short bclOK
        mov       edi, eax        ;// EDI = nbBoucles
    bclOK: ;// EDI = nbBoucles, EBX = x2, ESI = y2
        ;// hdc = [esp+36], x1 = [esp+12], y1 = [esp+8], x1*i = [esp+4], y1*i = [esp]
        xor       ebp, ebp        ;// EBP = i
        test      edi, edi
        je        short tracerEXIT
        cvtsi2sd  xmm5, edi
    forITOBCL: ;// xmm3 = dbl(x2), xmm4 = dbl(y2), xmm5 = dbl(nbBoucles)
        cvtsi2sd  xmm6, ebp     ;// i
        movsd     xmm7, xmm5
        cvtsi2sd  xmm0, [esp+4] ;// xmm0 = x1*i
        subsd     xmm7, xmm6    ;// xmm7 = nbBoucles - i
        cvtsi2sd  xmm1, [esp]   ;// xmm1 = y1*i
        movsd     xmm2, xmm7    ;// xmm2 = nbBoucles - i
        divsd     xmm0, xmm5    ;// (x1*i) / nbBoucles
        mulsd     xmm7, xmm3    ;// xmm7 = x2 * (nbBoucles - i)
        mulsd     xmm2, xmm4    ;// xmm2 = y2 * (nbBoucles - i)
        divsd     xmm7, xmm5
        divsd     xmm2, xmm5
        divsd     xmm1, xmm5    ;// (y1*i) / nbBoucles
        addsd     xmm0, xmm7    ;// x
        addsd     xmm1, xmm2    ;// y
        mov       eax, [esp+36] ;// EAX = hdc
        cvttsd2si ebx, xmm1     ;// EBX = y
        cvttsd2si esi, xmm0     ;// ESI = x
        push      0             ;// deja dispo pour SetPixel(hdc, x, y, 0)
        push      ebx
        push      esi
        push      eax           ;// params SetPixel OK
        push      ebx
        push      esi
        push      eax
        call      dword ptr GetPixel
        mov       edx, eax      ;// EAX = EDX = temp
        and       eax, 0FFFFFFh
        add       dh, 1         ;// GetGValue(temp)+1
        cmp       eax, 0FFFFFFh
        je        short goSETPIX
        mov       [esp+12], edx
    goSETPIX:
        call      dword ptr SetPixel
        inc       ebp
        mov       eax, [esp+12] ;// x1
        cmp       ebp, edi
        jg        short tracerEXIT
        mov       edx, [esp+8]  ;// y1
        add       [esp+4], eax  ;// x1*i
        add       [esp], edx    ;// y1*i
        jmp       short forITOBCL
    tracerEXIT:
        add       esp, 16
        xor       eax, eax  ;// dummy
        pop       edi
        pop       esi
        pop       ebp
        pop       ebx
        ret       36
      }
    }

  • signaler à un administrateur
    Commentaire de BruNews le 16/01/2008 01:05:10 administrateur CS

    La même en mieux finalisée:

    __declspec(naked) void __stdcall TracerTraitVert(HDC hdc, double Ax, double Ay, double Bx, double By)
    {
      __asm {
        push      ebx
        push      ebp
        push      esi
        push      edi
        ;// hdc [esp+20], Ax [esp+24], Ay [esp+32], Bx [esp+40], By [esp+48]
        cvttsd2si eax, [esp+24]   ;// x1 = round(Ax)
        cvttsd2si ecx, [esp+32]   ;// y1 = round(Ay)
        cvttsd2si ebx, [esp+40]   ;// EBX = x2 = round(Bx)
        cvttsd2si esi, [esp+48]   ;// ESI = y2 = round(By)
        push      eax
        push      ecx
        mov       edi, eax
        cvtsi2sd  xmm3, ebx       ;// xmm3 = x2
        cvtsi2sd  xmm4, esi       ;// xmm4 = y2
        mov       eax, ebx
        sub       eax, edi        ;// x2 - x1
        cdq
        mov       edi, eax
        xor       edi, edx
        mov       eax, esi
        sub       edi, edx        ;// EDI = nbBoucles = abs(x2-x1)
        sub       eax, ecx        ;// y2 - y1
        cdq
        xor       eax, edx
        sub       eax, edx        ;// eax = abs(y2-y1)
        xor       ebx, ebx        ;// EBX = x1*i
        xor       esi, esi        ;// ESI = y1*i
        cmp       edi, eax
        jae       short bclOK
        mov       edi, eax        ;// EDI = nbBoucles
    bclOK: ;// EDI = nbBoucles, EBX = x2, ESI = y2
        ;// hdc = [esp+28], x1 = [esp+4], y1 = [esp]
        xor       ebp, ebp        ;// EBP = i
        test      edi, edi
        je        short tracerEXIT
        cvtsi2sd  xmm5, edi
    forITOBCL: ;// xmm3 = dbl(x2), xmm4 = dbl(y2), xmm5 = dbl(nbBoucles)
        cvtsi2sd  xmm6, ebp     ;// i
        movsd     xmm7, xmm5
        cvtsi2sd  xmm0, ebx     ;// xmm0 = x1*i
        subsd     xmm7, xmm6    ;// xmm7 = nbBoucles - i
        cvtsi2sd  xmm1, esi     ;// xmm1 = y1*i
        movsd     xmm2, xmm7    ;// xmm2 = nbBoucles - i
        divsd     xmm0, xmm5    ;// (x1*i) / nbBoucles
        mulsd     xmm7, xmm3    ;// xmm7 = x2 * (nbBoucles - i)
        mulsd     xmm2, xmm4    ;// xmm2 = y2 * (nbBoucles - i)
        divsd     xmm7, xmm5
        divsd     xmm2, xmm5
        divsd     xmm1, xmm5    ;// (y1*i) / nbBoucles
        addsd     xmm0, xmm7    ;// x
        addsd     xmm1, xmm2    ;// y
        mov       eax, [esp+28] ;// EAX = hdc
        cvttsd2si ecx, xmm1     ;// ECX = y
        cvttsd2si edx, xmm0     ;// EDX = x
        push      0             ;// deja dispo pour SetPixel(hdc, x, y, 0)
        push      ecx
        push      edx
        push      eax           ;// params SetPixel OK
        push      ecx
        push      edx
        push      eax
        call      dword ptr GetPixel
        mov       edx, eax      ;// EAX = EDX = temp
        and       eax, 0FFFFFFh
        add       dh, 1         ;// GetGValue(temp)+1
        cmp       eax, 0FFFFFFh
        je        short goSETPIX
        mov       [esp+12], edx
    goSETPIX:
        call      dword ptr SetPixel
        inc       ebp
        add       ebx, [esp+4]  ;// x1*i
        add       esi, [esp]    ;// y1*i
        cmp       ebp, edi
        jle       short forITOBCL
    tracerEXIT:
        add       esp, 8
        xor       eax, eax  ;// dummy
        pop       edi
        pop       esi
        pop       ebp
        pop       ebx
        ret       36
      }
    }

  • signaler à un administrateur
    Commentaire de Renfield le 16/01/2008 10:14:34 administrateur CS

    voire peut etre même passer par la manipulation des bits d'un DIB directement...
    pas de SetPixel en boucle, quoi... (GetDibBits / SetDibBits)

    SetPixelV serait même une petite amélioration interessante (pas de retour de l'ancienne valeur)

  • signaler à un administrateur
    Commentaire de BruNews le 16/01/2008 15:59:20 administrateur CS

    Très clair que GDIquement parlant ça ne va absolument pas, il faut écrire sur un contexte mémoire et le plaquer direct en 1 passe (BitBlt() par exemple).
    Idem on ne traite pas une boucle lourde sur WM_PAINT, c'est un event qui peut être réçu des dizaines de fois par seconde.

  • signaler à un administrateur
    Commentaire de ndubien le 16/01/2008 16:19:31

    Bonjour Brunews,
    merci pour le code de TracerTraitVert en ASM...
    Sinon, pour l'utilisation des fonctions dans WM_PAINT, il est vrai que ce n'est pas conseillé pour ce genre de fonction qui peut prendre du temps mais c'était juste pour tester les fonctions et en voir le résultat.
    Que me conseillez-vous de moins lourd?
    Merci d'avance et à bientôt...

  • signaler à un administrateur
    Commentaire de Renfield le 16/01/2008 16:25:48 administrateur CS

    WM_PAINT est envoyé chaque fois que Windows a besoin d'afficher une partie de ton image.

    c'est dommage (pour ne pas dire plus) d'y recalculer ton image.

    calcule ton image une bonne fois, stockes la dans un hBMP tampon et rebalance cette image via BitBlt, à l'ecran quand demandé.

    (je n'ai fait que reformuler ce  qu'a conseillé BruNews)

  • signaler à un administrateur
    Commentaire de ndubien le 16/01/2008 17:46:48

    Bonjour RenField,
    Lorsque vous dites "stockes la dans un hBMP tampon"...
    hBMP veut-il bien dire HBITMAP?
    si oui, celà signifie que je dois stocker mon "image" crée sur un HDC dans HBITMAP...
    comment faut-il que je procède?
    Merci d'avance...

  • signaler à un administrateur
    Commentaire de BruNews le 16/01/2008 17:54:51 administrateur CS

    Regarde un exemple:
    ABOUTBOX SINUSOIDE (WIN32)
    http://www.cppfrance.com/code.aspx?id=10630

Ajouter un commentaire

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS