Dessiner toutes les combinaisons possibles

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
gothgothhh
Niveau 2
Niveau 2
Messages : 28
Enregistré le : ven. 19 août 2011 13:03
Status : Hors ligne

Dessiner toutes les combinaisons possibles

#1

Message par gothgothhh »

Bonjour, je suis confronté à un problème et j'aimerais avoir votre avis, alors voilà je m'explique, je souhaite faire un script qui dessine toutes les bitmaps possibles pixels par pixels, avec 2 couleurs (noir et blanc)
Je compte faire par étapes avec une suite d'opérations mais j'aimerais savoir s'il existe une formule magique pour tout faire en une seule fonction, pour vous illustré le problème voici le code

Code : Tout sélectionner

#include <GDIPlus.au3>
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>
#include <WindowsConstants.au3>
Global $SIZE = 100, $nMsg
Global $WHITE_COLOR = 0xFFFFFFFF
Global $NUMBER = 1
Global $ACTUAL_X
Global $ACTUAL_Y
Global $WINDOWS = GUICreate("GRAPHIC", $SIZE, $SIZE, -1, -1, 0x80000000, $WS_EX_TOPMOST)
GUISetState(@SW_SHOW)

_GDIPlus_Startup()
Global $WHITE = _GDIPlus_BrushCreateSolid($WHITE_COLOR)
Global $GRAPHIC = _GDIPlus_GraphicsCreateFromHWND($WINDOWS)
_GDIPlus_GraphicsClear($GRAPHIC, 0x000000)

;FULL X
For $ACTUAL_Y = 1 To $SIZE
	For $ACTUAL_X = 1 To $SIZE
		_GDIPlus_GraphicsFillRect($GRAPHIC, $ACTUAL_X, $ACTUAL_Y, 1, 1, $WHITE)

		$NUMBER = $NUMBER + 1

	Next
Next

;PIXEL X
For $ACTUAL_Y = 1 To $SIZE
	For $ACTUAL_X = 1 To $SIZE
		_GDIPlus_GraphicsClear($GRAPHIC, 0x000000)
		_GDIPlus_GraphicsFillRect($GRAPHIC, $ACTUAL_X, $ACTUAL_Y, 1, 1, $WHITE)

		$NUMBER = $NUMBER + 1

	Next
Next

;FULL Y
For $ACTUAL_Y = 1 To $SIZE
	For $ACTUAL_X = 1 To $SIZE
		_GDIPlus_GraphicsFillRect($GRAPHIC, $ACTUAL_Y, $ACTUAL_X, 1, 1, $WHITE)

		$NUMBER = $NUMBER + 1

	Next
Next

;PIXEL Y
For $ACTUAL_Y = 1 To $SIZE
	For $ACTUAL_X = 1 To $SIZE
		_GDIPlus_GraphicsClear($GRAPHIC, 0x000000)
		_GDIPlus_GraphicsFillRect($GRAPHIC, $ACTUAL_Y, $ACTUAL_X, 1, 1, $WHITE)

		$NUMBER = $NUMBER + 1

	Next
Next

;LINE X
For $ACTUAL_Y = 1 To $SIZE
	_GDIPlus_GraphicsClear($GRAPHIC, 0x000000)
	For $ACTUAL_X = 1 To $SIZE
		_GDIPlus_GraphicsFillRect($GRAPHIC, $ACTUAL_X, $ACTUAL_Y, 1, 1, $WHITE)

		$NUMBER = $NUMBER + 1

	Next
Next

;LINE Y
For $ACTUAL_Y = 1 To $SIZE
	_GDIPlus_GraphicsClear($GRAPHIC, 0x000000)
	For $ACTUAL_X = 1 To $SIZE
		_GDIPlus_GraphicsFillRect($GRAPHIC, $ACTUAL_Y, $ACTUAL_X, 1, 1, $WHITE)

		$NUMBER = $NUMBER + 1

	Next
Next

ConsoleWrite($NUMBER & @CRLF)

While 1
	$nMsg = GUIGetMsg(1)
	Switch $nMsg[0]
		Case $GUI_EVENT_CLOSE
			ExitLoop
	EndSwitch
WEnd

_GDIPlus_BrushDispose($WHITE)
_GDIPlus_GraphicsDispose($GRAPHIC)
_GDIPlus_Shutdown()
Avatar du membre
walkson
Modérateur
Modérateur
Messages : 1020
Enregistré le : ven. 12 août 2011 19:49
Localisation : Hurepoix
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#2

Message par walkson »

Re bonjour,
J'ai aussi ce code qui génère une image de façon aléatoire mais que l'on peut adapter à vos besoins
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>
#include <winapi.au3>

;Global Const $IMAGE_BITMAP = 0
Global Const $STM_SETIMAGE = 0x172

Global $iWidth = 200
Global $iHeight = 200

; Creating GUI, Save Button and Pic Control...
$hGUI = GUICreate("Graphic")
GUISetBkColor(0xABCDEF)
$iPic = GUICtrlCreatePic("", 0, 0, $iWidth, $iHeight)
$iButton1 = GUICtrlCreateButton("Save To File...", 0, 370, 200, 30)
$iButton2 = GUICtrlCreateButton("Generate Random Image...", 200, 370, 200, 30)

; Creating an empty image and getting the graphic context...
_GDIPlus_Startup()
$hImage = _GDIPlus_BitmapCreateFromScan0($iWidth, $iHeight)
$hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)

; Drawing random points...
$hPen = _GDIPlus_PenCreate(0xFF000000)
Local $i
For $y = 0 To $iHeight
    For $x = 0 To $iWidth
        $i = Random(0, 1, 1)
        If $i = 1 Then
            _GDIPlus_PenSetColor($hPen, 0xFFFFFFFF) ; If i = 1 then white
        Else
            _GDIPlus_PenSetColor($hPen, 0xFF000000) ; If i = 0 then black
        EndIf
        _GDIPlus_GraphicsDrawRect($hGraphic, $x, $y, 1, 1, $hPen) ; Creating Squares of 1X1(dots)
    Next
Next

; Showing the Image in the Pic Control...
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
GUICtrlSendMsg($iPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
_WinAPI_DeleteObject($hBitmap)

; Showing the GUI and the starting the main loop...
GUISetState()

While True
    $iMsg = GUIGetMsg()
    Switch $iMsg
        Case -3
            _GDIPlus_PenDispose($hPen)
            _GDIPlus_GraphicsDispose($hGraphic)
            _GDIPlus_ImageDispose($hImage)
            _GDIPlus_Shutdown()
            Exit
        Case $iButton1
            _GDIPlus_ImageSaveToFile($hImage, @DesktopDir & "\temp.png")
         ShellExecute(@DesktopDir & "\temp.png")
        Case $iButton2
            Local $i
            For $y = 0 To $iHeight Step 2
                For $x = 0 To $iWidth Step 2
                    $i = Random(0, 2, 1)
                    If $i = 1 Then
                        _GDIPlus_PenSetColor($hPen, 0xFFFFFFC4) ; If i = 1 then white
                    ElseIf $i = 0 Then
                        _GDIPlus_PenSetColor($hPen, 0xFF0000BF) ; If i = 0 then black
               Else
                  _GDIPlus_PenSetColor($hPen, 0xFFFF0000)
                    EndIf
                    _GDIPlus_GraphicsDrawRect($hGraphic, $x, $y, 1, 1, $hPen) ; Creating Squares of 1X1(dots)
                Next
            Next
            $hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
            GUICtrlSendMsg($iPic, $STM_SETIMAGE, $IMAGE_BITMAP, $hBitmap)
            _WinAPI_DeleteObject($hBitmap)
    EndSwitch

WEnd
Une remarque sur votre code, quand vous utilisez _GDIPlus_GraphicsClear($GRAPHIC, 0x000000) vous effacez tout en couleur noire
Il y a aussi une autre méthode pour sauvegarder l'image
Cordialement,
Walkson
"Horas non numero nisi serenas " Le canon de midi
(Je ne compte que les heures heureuses)
gothgothhh
Niveau 2
Niveau 2
Messages : 28
Enregistré le : ven. 19 août 2011 13:03
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#3

Message par gothgothhh »

Effectivement j'ai pensé à faire ça à coup de random mais je pense que se serait long de vérifié a chaque sauvegarde si l'image a déjà été générée ou non, je compte l'utiliser pour des images de 10 pixels, j'aimerais trouvé une méthode pour effectué toutes les générations sans se soucié de si ça a déjà été généré, même si c'est étapes par étapes comme j'ai commencé à faire, points par points, lignes par lignes, diago par diago, etc, je me creuse la tête mais je n'arrive pas à trouver d'autres solutions viables
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#4

Message par mdanielm »

Je ne suis pas sûr de comprendre.
Explique ce que tu veux faire avec un bitmap 2x2
Code 0 le noir et 1 le blanc et affiche tous les bitmaps possibles, pour chacun des 4 pixels il y a 2 possibilités, soit au total 2^4 = 16 bitmaps différents!
Et pour 100x100 = 10000 pixels ..... :(
gothgothhh
Niveau 2
Niveau 2
Messages : 28
Enregistré le : ven. 19 août 2011 13:03
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#5

Message par gothgothhh »

Ben c'est ça en fait, j'aimerais juste enregistré toutes les images possibles en 10x10 pixels, avec les couleurs blancs et noirs
Mais je ne sais pas comment m'y prendre car avec mon système d'étapes, j'obtiens des doubles etc ...
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#6

Message par mdanielm »

Ce sont donc des images 10x10, le nombre de façons de mettre les pixels à 0 ou 1 est donc:
2^100 = (2^10)^10 > 1000^10 = 1000 000 000 000 000 000 000 000 000 000
Tu plaisantes, j'espère!
gothgothhh
Niveau 2
Niveau 2
Messages : 28
Enregistré le : ven. 19 août 2011 13:03
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#7

Message par gothgothhh »

Et ben plus tôt j'aurais mon script qui fonctionne plus tôt il aura fini de travailler ! :mrgreen:
Avatar du membre
jchd
AutoIt MVPs (MVP)
AutoIt MVPs (MVP)
Messages : 2272
Enregistré le : lun. 30 mars 2009 22:57
Localisation : Sud-Ouest de la France (43.622788,-1.260864)
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#8

Message par jchd »

D'autant plus que dans le bout de code posté, $SIZE = 100.
2^10000 ça commence à chiffrer sérieux !
2^10000 = 19950631168807583848837421626835850838234968318861924548520089498529438830221946631919961684036194597899331129423209124271556491349413781117593785932096323957855730046793794526765246551266059895520550086918193311542508608460618104685509074866089624888090489894838009253941633257850621568309473902556912388065225096643874441046759871626985453222868538161694315775629640762836880760732228535091641476183956381458969463899410840960536267821064621427333394036525565649530603142680234969400335934316651459297773279665775606172582031407994198179607378245683762280037302885487251900834464581454650557929601414833921615734588139257095379769119277800826957735674444123062018757836325502728323789270710373802866393031428133241401624195671690574061419654342324638801248856147305207431992259611796250130992860241708340807605932320161268492288496255841312844061536738951487114256315111089745514203313820202931640957596464756010405845841566072044962867016515061920631004186422275908670900574606417856951911456055068251250406007519842261898059237118054444788072906395242548339221982707404473162376760846613033778706039803413197133493654622700563169937455508241780972810983291314403571877524768509857276937926433221599399876886660808368837838027643282775172273657572744784112294389733810861607423253291974813120197604178281965697475898164531258434135959862784130128185406283476649088690521047580882615823961985770122407044330583075869039319604603404973156583208672105913300903752823415539745394397715257455290510212310947321610753474825740775273986348298498340756937955646638621874569499279016572103701364433135817214311791398222983845847334440270964182851005072927748364550578634501100852987812389473928699540834346158807043959118985815145779177143619698728131459483783202081474982171858011389071228250905826817436220577475921417653715687725614904582904992461028630081535583308130101987675856234343538955409175623400844887526162643568648833519463720377293240094456246923254350400678027273837755376406726898636241037491410966718557050759098100246789880178271925953381282421954028302759408448955014676668389697996886241636313376393903373455801407636741877711055384225739499110186468219696581651485130494222369947714763069155468217682876200362777257723781365331611196811280792669481887201298643660768551639860534602297871557517947385246369446923087894265948217008051120322365496288169035739121368338393591756418733850510970271613915439590991598154654417336311656936031122249937969999226781732358023111862644575299135758175008199839236284615249881088960232244362173771618086357015468484058622329792853875623486556440536962622018963571028812361567512543338303270029097668650568557157505516727518899194129711337690149916181315171544007728650573189557450920330185304847113818315407324053319038462084036421763703911550639789000742853672196280903477974533320468368795868580237952218629120080742819551317948157624448298518461509704888027274721574688131594750409732115080498190455803416826949787141316063210686391511681774304792596709376

(exactement)

Prévoir un délai.
La cryptographie d'aujourd'hui c'est le taquin plus l'électricité.
gothgothhh
Niveau 2
Niveau 2
Messages : 28
Enregistré le : ven. 19 août 2011 13:03
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#9

Message par gothgothhh »

haha oui j'ai mis 100 sur l'exemple juste pour y voir plus clair, mon but final est seulement 10 ^^
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#10

Message par mdanielm »

J'ai au moins deux idées (pour n<=4). Pour adapter une aide, dis moi à quel niveau d'étude tu en es.
Conseil 1:
Prend une feuille de papier quadrillé (le mobile ne sert pas).
Colorie les 16 bitmaps 2x2, de façon méthodique (pas par tâtonnement)
...Programme la méthode
NB
N'espère pas qu'on te fasse le programme.
gothgothhh
Niveau 2
Niveau 2
Messages : 28
Enregistré le : ven. 19 août 2011 13:03
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#11

Message par gothgothhh »

Ah oui oui je n'espère pas que vous me serviez le code sur un plateau ne t'en fais pas, pour le niveau d'étude je suis pas aller plus loin qu'un cap ^^
je vais essayer de raisonner avec un papier se soir voir si ça me permet d'y voir plus clair
mdanielm
Membre émérite
Membre émérite
Messages : 254
Enregistré le : mer. 11 déc. 2013 19:48
Status : Hors ligne

Re: Dessiner toutes les combinaisons possibles

#12

Message par mdanielm »

Me revoilà. Tu renonces?

Supposons n=2, soit 4 pixels, soit 2^4=16 bitmaps.
Il y a correspondance biunivoque entre les entiers de 0 à 15 et les bitmaps.
Ce qui signifie:
-A un entier, par exemple 9, tu peux faire correspondre un bitmap unique
-A un bitmap 2x2 N/B, tu peux inversement faire correspondre un entier unique

Exemple:
Le 9 je l'écris en binaire (avec des 0 et 1), ça donne: 1001
Avec ça je fais le bitmap:
B N
N B
Répondre