La procédure de Blendman permettait de dessiner un cadre de gauche à droite mais aussi de droite à gauche.
La modification que tu as effectuée ne permet plus de dessiner un cadre de droite à gauche.
Demande conseil dessiner sélection 2D
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Demande conseil dessiner sélection 2D
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
- falsam
- Messages : 7324
- Inscription : dim. 22/août/2010 15:24
- Localisation : IDF (Yvelines)
- Contact :
Re: Demande conseil dessiner sélection 2D
en remplaçant ta procédure DrawSelection() par celle çi.Shadow a écrit :J'aimerais savoir comment optimiser un max la procédure sélection svp
Code : Tout sélectionner
Procedure DrawSelection(X, Y, x1, y1, Couleur, Eppaisseur, Type)
For vx = X To x1 Step 4
Box(vx, y, Eppaisseur, Eppaisseur, Couleur)
Box(vx, y1, Eppaisseur, Eppaisseur, Couleur)
Next
For vy = Y To y1 Step 4
Box(x, vy, Eppaisseur, Eppaisseur, Couleur)
Box(x1, vy, Eppaisseur, Eppaisseur, Couleur)
Next
EndProcedure
Code : Tout sélectionner
;DrawSelection(X.i-2, Y.i-2, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)
Code : Tout sélectionner
DrawSelection(X, Y, x1, y1, RGB(255, 0, 0), 2, Type)
PS: Eppaisseur avec un seul p.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Re: Demande conseil dessiner sélection 2D
Pas mal Falsam 
Par contre j'aimerais bien que le comportement de la sélection (Le tienne) soit identique
à celle utiliser par blendman qui lui utilise Vetor, même comportement que Vector dans son exemple.
J'aime bien la façon don "Bouge" le sélection quand ont utilise Vector.
Me comprends-tu ?
Essaie le code de blendman, l'avant dernier, avec sa sélection rouge sur écran gris.
Regarde la différence avec ton code
Dur de faire ça
Merci

Par contre j'aimerais bien que le comportement de la sélection (Le tienne) soit identique
à celle utiliser par blendman qui lui utilise Vetor, même comportement que Vector dans son exemple.
J'aime bien la façon don "Bouge" le sélection quand ont utilise Vector.
Me comprends-tu ?
Essaie le code de blendman, l'avant dernier, avec sa sélection rouge sur écran gris.
Regarde la différence avec ton code

Dur de faire ça

Merci

Code : Tout sélectionner
Procedure DrawSelection(X, Y, x1, y1, Couleur, Largeur.i, Hauteur.i, Distance.i, Type)
For vx = X To x1 Step 1
Box(vx, y, Largeur.i, Hauteur.i, RGB(255, 0, 0))
Box(vx, y1, Largeur.i, Hauteur.i , RGB(255, 0, 0))
vx + Distance - 1
Next
For vy = Y To y1 Step 1
Box(x, vy, Hauteur.i, Largeur.i, Couleur)
Box(x1, vy, Hauteur.i, Largeur.i, Couleur)
vy + Distance - 1
Next
EndProcedure
Enumeration
#Fenetre
#Canvas
EndEnumeration
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Canvas, 0, 0, 800, 600)
Repeat
Event = WaitWindowEvent(1)
EventGadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #Canvas
If EventType() = #PB_EventType_LeftButtonDown
X.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
ElseIf (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
x1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
y1 = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
Largeur.i = x1-x
Hauteur.i = y1-y
Couleur.i = RGB(255, 0, 0)
StartDrawing(CanvasOutput(#Canvas))
Box(0, 0, GadgetWidth(#Canvas), GadgetHeight(#Canvas), RGB(255, 255, 255))
DrawSelection(X, Y, x1, y1, RGB(255, 0, 0), 4, 2, 8, Type)
StopDrawing()
EndIf
Default
Debug EventGadget
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
Après pas mal d’essais, j'en suis arrivé à un début promoteur.
Restes des imperfections (Sur les 4 coins) si l'épaisseur est supérieur à 1 quand ont redimensionne la sélection.
Sinon si ont reste en épaisseur 1 ça va bien
Type: 1 = Carré, 2 = tiret.
Ya, je suis sur, moyen de faire mieux encore.
Restes des imperfections (Sur les 4 coins) si l'épaisseur est supérieur à 1 quand ont redimensionne la sélection.
Sinon si ont reste en épaisseur 1 ça va bien

Type: 1 = Carré, 2 = tiret.
Ya, je suis sur, moyen de faire mieux encore.
Code : Tout sélectionner
Procedure DrawSelection(Gadget.i, X.i, Y.i, Largeur.i, Hauteur.i, CouleurSelection.i, CouleurInterieurSelection.i, Transparence.i, Eppaiseur.i, Espace.i, Type.i)
If Largeur.i > 0 And Hauteur.i > 0
Image.i = CreateImage(#PB_Any, Largeur.i, Hauteur.i, 32, #PB_Image_Transparent)
If Gadget.i => 0 And IsGadget(Gadget.i) And IsImage(Image.i)
If StartVectorDrawing(ImageVectorOutput(Image.i))
; Eface l'image
AddPathBox(0, 0, ImageWidth(Image.i), ImageHeight(Image.i))
VectorSourceColor(RGBA(255, 255, 255, 255))
FillPath()
; Dessine la selection sur l'image.
AddPathBox(0, 0, Largeur.i, Hauteur.i)
VectorSourceColor(CouleurSelection.i)
; Dessine l'interieur de la selection sur l'image.
If Eppaiseur.i <= 0
Eppaiseur.i = 1
EndIf
If Type.i <= 0
Type.i = 1
EndIf
If Type.i = 1
; Type classique, carré.
DashPath(Eppaiseur.i * 2, Espace.i)
AddPathBox(Eppaiseur.i, Eppaiseur.i, (Largeur.i - (Eppaiseur.i * 2)), (Hauteur.i - (Eppaiseur.i * 2)))
ElseIf Type.i = 2
; Type classique tirer.
DashPath(Eppaiseur.i + 1, Espace.i)
AddPathBox(Eppaiseur.i / 2 + 1, Eppaiseur.i / 2 + 1, (Largeur.i - Eppaiseur.i - 2), (Hauteur.i - Eppaiseur.i - 2))
EndIf
VectorSourceColor(CouleurInterieurSelection.i)
FillPath()
StopVectorDrawing()
EndIf
; Dessine l'image de la sélection sur la Canvas.
If StartDrawing(CanvasOutput(Gadget.i))
Box(0, 0, GadgetWidth(Gadget.i), GadgetHeight(Gadget.i), RGB(255, 255, 255))
Box(100, 100, 150, 150, RGB(0, 0, 255))
DrawAlphaImage(ImageID(Image.i), X.i, Y.i, Transparence.i)
StopDrawing()
EndIf
FreeImage(Image.i)
EndIf
EndIf
EndProcedure
Enumeration
#Fenetre
#Canvas
EndEnumeration
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Canvas, 0, 0, 800, 600)
Repeat
Event = WaitWindowEvent(1)
EventGadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #Canvas
If EventType() = #PB_EventType_LeftButtonDown
X1.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y1.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
ElseIf (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
X2.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y2.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
Largeur.i = X2 - X1
Hauteur.i = Y2 - Y1
Couleur.i = RGBA(255, 0, 0, 255)
Couleur2.i = RGBA(255, 255, 0, 255)
DrawSelection(#Canvas, X1, Y1, Largeur, Hauteur, Couleur.i, Couleur2.i, 200, 1, 1, 1)
EndIf
Default
Debug EventGadget
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
Salut,
Je voudrait faire une sélection personnalisable, vous l'avez compris.
La complexité va être de mise qui plus est.
Moi je suis dessus mais j'y arrive pas trop.
Je voudrait que pas mal de chose soit personnalisable:
Couleurs des Points
Épaisseur des Points
Distance entre les Points
Transparence des Points
Couleurs intérieur de la sélection
Transparence intérieur de la sélection
Voici quelques exemple en image pour illustrer mes propos (Tout n'y est pas):

Alors si vous pouviez m'aider à mettre ça au points
Merci !
Je voudrait faire une sélection personnalisable, vous l'avez compris.
La complexité va être de mise qui plus est.
Moi je suis dessus mais j'y arrive pas trop.
Je voudrait que pas mal de chose soit personnalisable:
Couleurs des Points
Épaisseur des Points
Distance entre les Points
Transparence des Points
Couleurs intérieur de la sélection
Transparence intérieur de la sélection
Voici quelques exemple en image pour illustrer mes propos (Tout n'y est pas):

Alors si vous pouviez m'aider à mettre ça au points

Merci !
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Re: Demande conseil dessiner sélection 2D
J'ai réussi après moult essais de faire se que je voulais:
Image d’exemple:

Note:
Reste quelque imperfection si l’épaisseur est supérieur ou égale à 1.
J’espère que avec votre aide ont arrivera à régler ça.
Ya surement moyen de faire encore bien mieux...
Image d’exemple:

Note:
Reste quelque imperfection si l’épaisseur est supérieur ou égale à 1.
J’espère que avec votre aide ont arrivera à régler ça.
Ya surement moyen de faire encore bien mieux...
Code : Tout sélectionner
Procedure CreateImageSelection(Gadget.i, X.i, Y.i, Largeur.i, Hauteur.i, CouleurSelection.i, CouleurInterieurSelection.i, Eppaiseur.i, Espace.i, Type.i)
If Largeur.i > 0 And Hauteur.i > 0
ImageSelection.i = CreateImage(#PB_Any, Largeur.i, Hauteur.i, 32, #PB_Image_Transparent)
If Gadget.i => 0 And IsGadget(Gadget.i) And IsImage(ImageSelection.i)
If StartVectorDrawing(ImageVectorOutput(ImageSelection.i))
; Si Alpha de la couleur intérieur est supérieur à 0, sert si vous voulez affichez que le contour de la selection par exemple.
If Alpha(CouleurInterieurSelection.i) > 0
; Eface l'image avec du blanc transparent totale.
AddPathBox(0, 0, ImageWidth(ImageSelection.i), ImageHeight(ImageSelection.i))
VectorSourceColor(RGBA(255, 255, 255, 255))
FillPath()
; Eface l'image avec du blanc transparent 0.
AddPathBox(0, 0, ImageWidth(ImageSelection.i), ImageHeight(ImageSelection.i))
VectorSourceColor(RGBA(255, 255, 255, 0))
FillPath()
; Eface l'image avec la couleur de la sélection.
AddPathBox(0, 0, ImageWidth(ImageSelection.i), ImageHeight(ImageSelection.i))
VectorSourceColor(CouleurInterieurSelection.i)
FillPath()
EndIf
If Eppaiseur.i <= 0
Eppaiseur.i = 1
EndIf
If Espace.i <= 0
Espace.i = 1
EndIf
If Type.i <= 0
Type.i = 1
ElseIf Type.i > 3
Type.i = 3
EndIf
; Dessine le contour de la selection sur l'image.
If Type.i = 1
; Ligne continue.
AddPathBox(Eppaiseur.i / 2, Eppaiseur.i / 2, (Largeur.i - Eppaiseur.i), (Hauteur.i - Eppaiseur.i))
VectorSourceColor(CouleurSelection.i)
StrokePath(Eppaiseur.i)
ElseIf Type.i = 2
; Carré.
AddPathBox(Eppaiseur.i / 2, Eppaiseur.i / 2, (Largeur.i - Eppaiseur.i), (Hauteur.i - Eppaiseur.i))
VectorSourceColor(CouleurSelection.i)
DotPath(Eppaiseur.i, Espace.i)
ElseIf Type.i = 3
; Tiret.
AddPathBox(Eppaiseur.i / 2, Eppaiseur.i / 2, (Largeur.i - Eppaiseur.i), (Hauteur.i - Eppaiseur.i))
VectorSourceColor(CouleurSelection.i)
DashPath(Eppaiseur.i, Espace.i)
EndIf
StopVectorDrawing()
ProcedureReturn ImageSelection.i
EndIf
EndIf
EndIf
EndProcedure
; ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
; Test:
Enumeration
#Fenetre
#Canvas
EndEnumeration
Global CouleurContourSelection.i = RGBA(0, 150, 0, 0)
Global CouleurInterieurSelection.i = RGBA(0, 0, 200, 255)
Global TransparenceSelection.i = 255
Procedure Ma_Fenetre()
If OpenWindow(#Fenetre, 0, 0, 1200, 800, "Fenetre windows", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered | #PB_Window_TitleBar)
CanvasGadget(#Canvas, 0, 0, 800, 600)
; Ont affiche un carré pour l'éxemple.
If StartDrawing(CanvasOutput(#Canvas))
; Efface le Canvas avec la couleur blanche.
Box(0, 0, GadgetWidth(#Canvas), GadgetHeight(#Canvas), RGB(255, 255, 255))
; Déssine un carré rouge.
Box(100, 100, 150, 150, RGB(255, 0, 0))
StopDrawing()
EndIf
Repeat
Event = WaitWindowEvent(1)
EventGadget = EventGadget()
Select Event
Case #PB_Event_Gadget
Select EventGadget
Case #Canvas
If EventType() = #PB_EventType_LeftButtonDown
X1.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y1.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
ElseIf (EventType() = #PB_EventType_MouseMove And GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton)
X2.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
Y2.i = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
Largeur.i = X2 - X1
Hauteur.i = Y2 - Y1
; Note, si la transparence de "CouleurInterieurSelection" vaux 0, la transparence de "DrawSelection" n'affectera pas cette couleur qui restera
; transparente totale, mais seulement la couleur du contour de la selection, en gros vous ne verez que le contour de la sélection.
; Attention, ne dois jamais être mis dans un bloc StartDrawing() / StopDrawing() !
; Créer l'image de la sélection.
ImageSelection.i = CreateImageSelection(#Canvas, X1, Y1, Largeur, Hauteur, CouleurContourSelection.i, CouleurInterieurSelection.i, 1, 15, 1)
; Maintenant ont va afficher les objets et l'image de la sélection sur le Canvas.
If StartDrawing(CanvasOutput(#Canvas))
; Efface le Canvas avec la couleur blanche.
Box(0, 0, GadgetWidth(#Canvas), GadgetHeight(#Canvas), RGB(255, 255, 255))
; Déssine un carré rouge.
Box(100, 100, 150, 150, RGB(255, 0, 0))
If IsImage(ImageSelection.i)
; Dessine l'image de la sélection sur la Canvas.
DrawAlphaImage(ImageID(ImageSelection.i), X1.i, Y1.i, TransparenceSelection.i)
EndIf
StopDrawing()
; Attention, très très important, éffacer l'image de la sélection qui ne sert
; plus à rien Sinon les images vont s'accumulé dans la mémoire pour rien !
If IsImage(ImageSelection.i)
FreeImage(ImageSelection.i)
EndIf
EndIf
EndIf
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf
EndProcedure
Ma_Fenetre()
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.
PureBasic: 5.60 x64 Bits.