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

Cliquez pour voir la capture en taille normale
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...
 

Fichier Zip

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

Commentaires et avis

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

Discussions en rapport avec ce code source dans le forum

Suprimmer un fichier [ par naney ] tout d'abort un grand merci au webmaster de ce site :D car j'en avais mare de cherche un site comme vbfranc.com mais qui parler du c et du c++Je cherc attendre que le shell soit fini C++ [ par McK_N ] Salut,je veux appeler la fonction Shell et je veux que mon programe arrête jusqu'à ce que le shell soit terminé.Comment puis-je le faire avec la fonct prob avec une dll [ par BlackWizzard ] Salut!je voudrais faire une dll avec un niveau tres bas...j'ai deja créé une dll de cryptage en me basant sur un code simple...la chose que je compren Existe t il une fonction équivalente à mid right ou left ( du VB) en cpp ? [ par Stoomm ] Existe t il une fonction équivalente à mid right ou left ( du VB) en cpp ? Merci d'avance et A+. Stoomm. [?] Saisie d'une fonction [ par Cidrik ] Salut,Je débute en C et j'aimerais créer un programme qui réalise une étude de fonction (niveau 1°S) mais j'aimerais savoir comment faire pour que qua la fonction c++ StrToNum : [ par sounlight ] A quoi sert la fonction StrToNum ()?Est-elle déjà définie dans les bibliothèques c++par défaut?Qu'elle est sa syntaxe ?Je suis débutant développeur c+ randomize sous VC++ 6.0 non defini?? comment faire?? [ par petitivnnie ] En effet je n'ai troué aucune occurence des les headers fournis dans la version 6.0 de visual C++J'aimerai que l'on m'indique comment implenter cette Fonction $gettok (mIRC) sous cpp [ par mast ] Salut j'aui une variable qui retourne par exemple: allo sa va oui toi? /echo -a allo /echo -a bye et je voudrais enregistrer les 2 commen (/..) dans c net use * /delete EN C++ [ par LeBobo ] Salut. J'ai un petit programme qui utilise la fonction : system(''net use * /delete'') ; Le problème est que mon programme à une interface graphique w Exemple de EnumPrinters (qui fonctionne) en C++ [ par nico ] Je voudrais que mon programme puisse détecter l'imprimante par défaut utilisée par mon PC. Pour ce faire j'ai trouvé la fonction "EnumPrinters". Le pr


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

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

Comparez les prix Nouvelle version


HTC G1

Entre 449€ et 449€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,406 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.