Page 1 sur 1
Dessiner toutes les combinaisons possibles
Posté : dim. 26 nov. 2017 16:44
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()
Re: Dessiner toutes les combinaisons possibles
Posté : dim. 26 nov. 2017 18:07
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 = 0Global Const $STM_SETIMAGE = 0x172Global $iWidth = 200Global $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 $iFor $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) NextNext; 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) EndSwitchWEnd
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
Re: Dessiner toutes les combinaisons possibles
Posté : dim. 26 nov. 2017 18:19
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
Re: Dessiner toutes les combinaisons possibles
Posté : lun. 27 nov. 2017 17:51
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 .....

Re: Dessiner toutes les combinaisons possibles
Posté : lun. 27 nov. 2017 17:58
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 ...
Re: Dessiner toutes les combinaisons possibles
Posté : lun. 27 nov. 2017 19:16
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!
Re: Dessiner toutes les combinaisons possibles
Posté : lun. 27 nov. 2017 19:58
par gothgothhh
Et ben plus tôt j'aurais mon script qui fonctionne plus tôt il aura fini de travailler !

Re: Dessiner toutes les combinaisons possibles
Posté : lun. 27 nov. 2017 23:21
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.
Re: Dessiner toutes les combinaisons possibles
Posté : mar. 28 nov. 2017 03:13
par gothgothhh
haha oui j'ai mis 100 sur l'exemple juste pour y voir plus clair, mon but final est seulement 10 ^^
Re: Dessiner toutes les combinaisons possibles
Posté : mar. 28 nov. 2017 06:53
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.
Re: Dessiner toutes les combinaisons possibles
Posté : mar. 28 nov. 2017 08:17
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
Re: Dessiner toutes les combinaisons possibles
Posté : jeu. 30 nov. 2017 15:30
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