Remplissage de forme par une texture !!

Programmation d'applications complexes
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Remplissage de forme par une texture !!

Message par Mytic »

Bon… j’ai passé une nuit blanche pour crée cet algorithme de remplissage par image (100% Moi) :D !!
Il fonctionne comme le FillArea() de PureBasic mais au lieu de remplir avec une couleur , ma commande remplit avec une texture.
Je vous explique comment l’utilisé : (c’est vraiment simple)
Vous faite au début avec vos déclarations load_image_de_remplissage("c:\votre_image.png")
Et voilà c’est tout.

Pour remplir une forme, vous tapez ça : texture_painture(X),Y,ID)
Avec X et Y le coordonnées, et ID c’est ID de SpriteOutput par exemple.

Y’a aussi une variable que j’ai nommé Mode. Au début elle a une valeur 1 , changer ça valeur pour changer de style de remplissage. Attention 1<=Mode<=infini
=> je vous ai même fait un petit Code d’exemple :

<>Dessinez sur l’écran avec la souris en cliquant sur le bouton Gauche , par exeple dessinez une forme à remplir , mais fait attention à ne pas laisser de fuite ,car même une fuite de 1 pixel gâche tout , comme dans Paint de windonws , si une forme reste ouverte avec seulement un pixel le remplissage colorie tout l’écran.

<>Cliquez sur le bouton Droit de la souris à l’intérieur de votre forme préalablement dessinée pour la remplir avec la texture.

<>Enfin Echap pour Quitter.

Code : Tout sélectionner

; -----------------------
;|      By  MYTIC        |
; -----------------------
;PureBasic v: 4.01

InitSprite()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
OpenWindow(0,0,0,300,300,"demo")
OpenWindowedScreen(WindowID(0),0,0,300,300,0,0,0)
Global Dim image.l(999,999)
Global maxix.L
Global maxiy.L
Global mode.l = 1 ; style de remplissage (changer le avec des valeur réel =>1 pour voir d'autre effets de remplissage)
Procedure load_image_de_remplissage(fichier.s)
LoadImage(0,fichier)
maxix = ImageWidth(0)
maxiy = ImageHeight(0)
StartDrawing(ImageOutput(0))
For y = 0 To ImageHeight(0)
For x = 0 To ImageWidth(0)
image(x,y) = Point(x,y)
Next x
Next y
StopDrawing()
EndProcedure
Procedure.l correction_de_deppassement(zone.l,valeur.l)
r.f = (valeur/zone)
r = r - Val(Str(r))
r = Val(Str(r * zone))
If r < 0
r = Sqr(r*r)*mode
EndIf
ProcedureReturn  r
EndProcedure
Procedure.l get_couleur_image(x.l,y.l)
x = correction_de_deppassement(maxix,x)
y = correction_de_deppassement(maxiy,y)
ProcedureReturn image(x,y)
EndProcedure
Procedure texture_painture(x.l,y.l,ID.l)
cr = RGB(244,244,244)
StartDrawing(ID)
FillArea(x, y, -1, cr)
For y = 0 To 299
For x = 0 To 299
c = Point(x,y)
If c = cr
Plot(x,y,get_couleur_image(x,y))
EndIf
Next x
Next y
StopDrawing()
EndProcedure

MessageRequester("INFO" , "Boutton droit (souris) = remplissage  |  Boutton gauche (souris) = dessiner les contoures  | Echape = END") 


;------------------------------------(exemple d'utilisation)
CreateSprite(0,300,300)
CreateSprite(1,10,10)
StartDrawing(SpriteOutput(1))
Circle(5,5,3,46236)
StopDrawing()
load_image_de_remplissage("c:\image.png") ;---------- !!!! changez l'adresse vers une image à vous
Repeat
ExamineMouse()
If MouseButton(#PB_MouseButton_Left)
StartDrawing(SpriteOutput(0))
Circle(MouseX(),MouseY(),3,255)
StopDrawing()
EndIf
If MouseButton(#PB_MouseButton_Right)
ID = SpriteOutput(0)
texture_painture(MouseX(),MouseY(),ID) ;----------(le FillArea() version Moi)
EndIf

DisplaySprite(0,0,0)
DisplayTransparentSprite(1,MouseX(),MouseY())
FlipBuffers()
WaitWindowEvent()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End

Aller Dsl je dois vous laisser, j’ai des heures de sommeil à rattraper. Bonne nuit à Moi
:wink:
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

Bonne nuit MYTIC :wink:

C'est super cool ton code.....

J'ai fait des patates comme quand j'etais à l'ecole.
Et paf !!!!!! ma patate, elle avait mis un mayo de bain imprimé avec le dessin de mon image :D
Génial......

Dis voir quand tu te sera reposé un peu (La santé c'est turbo important) :

1/ Peut on agrandir la fenetre ?
Car quand je l'ai fait ça ecrivait des points verts tout seul 8O

2/ Ce serait bien si tu pouvait accelerer le dessin des points rouges, car pour faire le dessin faut aller drolement lentement pour etre sur qu'il n'y ai pas de rustine dans la patate. :D

3/ Je ne pense pas que ce soit possible, mais pourrait on sur la meme idée le faire avec une fenetre windows (Style fenetre skinnable) ?

En tout cas, j'y connais pas grand chose dans le graphisme, (Comme dans le reste d'ailleurs :D ), mais je suis content d'etre le premier à te dire bravo pour ce code super original.

Pour t'aider, par contre je peux te chanter une chanson :

Fait dodo cola mon petit frere,fait dodo t'aura du lolo, papa est en haut, qui fait du gateau, maman est en bas qui fait ...
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

Merci <Kwai chang caine> j’ai bien dormi …; voilà j’ai amélioré le code, et j’ai ajouté deux variables Windowx et windowy , change les par la valeur que tu veux pour modifier la fenêtre.
Et maintenant tu peu dessiner avec la vitesse que tu veux, y’a une line qui relie les points entre eux, comme ça pas de fuite. !

Code : Tout sélectionner


; -----------------------
;|      By  MYTIC        |
; -----------------------
; PureBasic v:4.01

InitSprite()
InitKeyboard()
InitMouse()
UsePNGImageDecoder()
UseJPEGImageDecoder()

Global Dim image.l(999,999)
Global windowx.l = 640 ;-------------(largeur de la fenêtre en x)
Global windowy.L = 480 ;-------------(hauteur de la fenêtre en y)
Global maxix.L
Global maxiy.L
Global mode.l = 1 ; style de remplissage (changer le avec des valeur réel =>1 pour voir d'autre effets de remplissage)

OpenWindow(0,0,0,windowx,windowy,"demo")
OpenWindowedScreen(WindowID(0),0,0,windowx,windowy,0,0,0)
Procedure load_image_de_remplissage(fichier.s)
LoadImage(0,fichier)
maxix = ImageWidth(0)
maxiy = ImageHeight(0)
StartDrawing(ImageOutput(0))
For y = 0 To ImageHeight(0)
For x = 0 To ImageWidth(0)
image(x,y) = Point(x,y)
Next x
Next y
StopDrawing()
EndProcedure
Procedure.l correction_de_deppassement(zone.l,valeur.l)
r.f = (valeur/zone)
r = r - Val(Str(r))
r = Val(Str(r * zone))
If r < 0
r = Sqr(r*r)*mode
EndIf
ProcedureReturn  r
EndProcedure
Procedure.l get_couleur_image(x.l,y.l)
x = correction_de_deppassement(maxix,x)
y = correction_de_deppassement(maxiy,y)
ProcedureReturn image(x,y)
EndProcedure
Procedure texture_painture(x.l,y.l,ID.l)
cr = RGB(244,244,244)
StartDrawing(ID)
FillArea(x, y, -1, cr)
v = 2
For y = 0 To windowy
For x = 0 To windowx
x = x + v
c = Point(x,y)
If c = cr
x = x - v
v = 0
Plot(x,y,get_couleur_image(x,y))
EndIf
Next x
Next y
StopDrawing()
EndProcedure

MessageRequester("INFO" , "Boutton droit (souris) = remplissage  |  Boutton gauche (souris) = dessiner les contoures  | Echape = END") 


;------------------------------------(exemple d'utilisation)
bx = -1 : by= -1
CreateSprite(0,windowx,windowy)
CreateSprite(1,10,10)
StartDrawing(SpriteOutput(1))
Circle(5,5,3,46236)
StopDrawing()
load_image_de_remplissage("c:\image.png") ;---------- !!!! changez l'adresse vers une image à vous
Repeat
ExamineMouse()
If MouseButton(#PB_MouseButton_Left)
StartDrawing(SpriteOutput(0))
nx = MouseX()
ny = MouseY()
If bx = -1: bx = nx : by = ny: EndIf
LineXY(bx,by,nx,ny,255)
Circle(nx,ny,3,255)
bx = nx
by = ny
StopDrawing()
Goto ne
EndIf
If MouseButton(#PB_MouseButton_Right)
ID = SpriteOutput(0)
texture_painture(MouseX(),MouseY(),ID) ;----------(le FillArea() version Moi)
Goto ne
EndIf
bx = -1
ne:
DisplaySprite(0,0,0)
DisplayTransparentSprite(1,MouseX(),MouseY())
FlipBuffers()
WaitWindowEvent()
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End

:wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Kwai chang caine a écrit : (La santé c'est turbo important)
ha bah vla autre chose !! 8O "turbo important" :lol: :lol:
ou noir important ? :lol:

ça me rapel un sketch de muriel Robin , lorsqu'elle pert une lettre de l'alphabet, puis une autre ect ...

"Bnjur cmment allez vus" (elle a perdu les eaux (les O) )



et ensuite elle melange les intonations d'une phrase avec ce qu'elle a a dire

genre (en chantant)"la la la la la ta mere est morte" !! :lol:

@Mytic : bravo le code ! :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

......
Dernière modification par Backup le mar. 19/août/2014 13:31, modifié 2 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

@MYSTIC

Eh bah dis donc, tes nuits sont "hachement" plus courte que tes journées....

Mille merci pour cette modif express 8)
La redoute c'est de la roupie de sansonet à coté.

Dommage que je n'ai que 2 mains pour applaudir, ton code est nickel.

Et pour le mode fenetre, tu crois que ce serait possible un jour ou j'suis encore à coté de mes palmes ?

Encore bravo et merci.

@DOBRO
ha bah vla autre chose !! "turbo important"
ou noir important ?
Alors la, tu m'a fait bien rire :lol:

Comme tu t'en doute à part rire j'ai rien compris dans les "pelote" et les "pointe".
Mais je te crois sur parole, si tu dis que c'est mieux, c'est que c'est mieux, surtout si l'excelent Cpl.bator t'accompagne.

Quand à l'inhibé du bulbe qui vous sert d'admirateur que je suis, j'ai pas vu la difference, à part que mon image elle est bleue (comme le canard WC...) au lieu de sa couleur d'origine 8O
Peut etre parce que ton code est en couleur :lol:
Décidément tu nous en fait voir de toutes les couleurs toi.....
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Kwai chang caine a écrit :à part que mon image elle est bleue (comme le canard WC...) au lieu de sa couleur d'origine 8O.
ha bah oui le rapide point et plot peut etre en mode BGR au lieu de RGB
il suffirai d'ajouter un peit traitement suplementaire dans ce cas la :D
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

ça fait rien, c'est jouli aussi le bleu.....
Surtout en cette période de vacance, on à l'impression d'etre sur la plage...

Dis donc, manquerait plus que mon image fasse des vagues :lol:
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message par Mytic »

@Dobro
Ben…
Pour le dessin sur buffer j’ai crée des commandes aussi, voilà le topic : http://www.purebasic.fr/french/viewtopic.php?t=6957
Et elles gèrent le RRGGBB et le BBGGRR.
:wink:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

..
Répondre