begin process at 2010 02 10 17:17:57
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Divers

 > ARBRE2D: UN PROGRAMME GÉNÉRANT DES ARBRES

ARBRE2D: UN PROGRAMME GÉNÉRANT DES ARBRES


 Information sur la source

Note :
Aucune note
Catégorie :Divers Classé sous :arbre2d, fonction, générer, arbres Niveau :Débutant Date de création :15/01/2008 Vu / téléchargé :3 354 / 150

Auteur : ndubien

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (9)
Ajouter un commentaire et/ou une note


 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

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture MARIO EN SDL
Source avec Zip Source avec une capture TAMIS ET TAPIS DE SIERPINSKI
Source avec Zip Source avec une capture SIMULANCE, UN SIMULATEUR DE LANCER D'OBJET
Source avec Zip BEEPER, UTILISER UN HOOK CLAVIER INTÉGRÉ À L'EXÉCUTABLE ET G...
Source avec Zip Source avec une capture MORSEPLAYER, JOUER UN MESSAGE MORSE

 Sources de la même categorie

Source avec Zip CALLOCATOR par troctsch
Source avec Zip HEAPCOLLECTOR par troctsch
Source avec Zip GÉNÉRE UN TABLEAU DE CARACTÉRE AU FORMAT C CONTENANT LE BYTE... par kertimanoff
FRACTIONS EGYPTIENNES par lptm974
BITOPERATOR par FrancoisGauthier

 Sources en rapport avec celle ci

Source avec une capture MAP STL ET ARBRES ROUGES ET NOIRS par guill76
Source avec Zip Source avec une capture JEUX DU DÉMINEUR POUR DÉBUTANT par phenix22000
Source avec Zip AFFICHEUR DE FONCTIONS MATHÉMATIQUE par badrsmimite
Source avec Zip Source avec une capture SUDOKPLAYER: RÉSOUDRE, CRÉER ET TESTER DES GRILLES DE SUDOKU par ndubien
FONCTION RACINE ENTIÈRE par sadmandono

Commentaires et avis

Commentaire de acx01b le 15/01/2008 22:22:51

salut

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

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
  }
}

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
  }
}

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)

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.

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...

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)

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...

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

fonction rand() [ par flowneo ] Bonjour, voila, je voudrais faire une fonction (ou procédure) qui génére par exemple 4 lettre que je placerais dans un tableau, j'ai regardé les réfé implémentation [ par twistakarima ] Bonjour, je suis un étudiant en l'informatique ,j'ai un mini_projet a faire,mais je ne sais pas comment commencer, j'essaye depuis ce matin de compren Fonction virtuelle en C [ par cogno ] Bonjour les amis, ma question est la suivante: Comment simuler une fonction virtuelle en C ? Merci Algorithme le plus rapide [ par cogno ] Bonjour les amis, je cherche l'algorithme le plus rapide en C++ pour obtenir de la fonction suivante inline int fonction (char* a) { } les résult Template ou virtuel [ par cogno ] Bonjour les amis, supposons un pointeur sur un Objet A, et fct une fonction membre de l'objet. quelle est la différence fondamentale entre: 1/ La c [API WIN32] Création nouveau contrôle [ par HumbuckerSingleCoil ] Bonjour. Je voudrais savoir comment on crée un nouveau contrôle avec l'api WIN32. Je m'explique : je voudrais réaliser un éditeur html, css, javascr [EXCEL]aide sur une fonction dans le logiciel [ par hayfoufa ] bonjour tout le monde, j'en ai besoin d'une fonction pour le logiciel Excel qui ne laisse que les 2 dernieres lettres, merci de m'aider Haïfa Fonction pour modifier l'affichage de mes .pst [ par apu04 ] Bonjour, je viens de découvrir la librairie libpst, version libpst-0.6.44 sous linux et j'utilise le readpst.c que je compile pour pouvoir afficher l


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales