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 : 7334
- 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 : 7334
- 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                
EndProcedureCode : 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.
