Page 2 sur 2

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 16:49
par falsam
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.

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 17:11
par falsam
Shadow a écrit :J'aimerais savoir comment optimiser un max la procédure sélection svp
en remplaçant ta procédure DrawSelection() par celle çi.

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
et en remplaçant

Code : Tout sélectionner

;DrawSelection(X.i-2, Y.i-2, Largeur.i, Hauteur.i, Couleur.i, Eppaisseur.i, Type.i)
par

Code : Tout sélectionner

DrawSelection(X, Y, x1, y1, RGB(255, 0, 0), 2, Type)
Je te laisse enlever tes calculs de largeur, hauteur, etc .... qui ne servent à rien.

PS: Eppaisseur avec un seul p.

Re: Demande conseil dessiner sélection 2D

Publié : sam. 14/mai/2016 18:14
par Shadow
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 :)

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()

Re: Demande conseil dessiner sélection 2D

Publié : dim. 15/mai/2016 12:36
par Shadow
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.

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()

Re: Demande conseil dessiner sélection 2D

Publié : lun. 16/mai/2016 15:31
par Shadow
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):
Image

Alors si vous pouviez m'aider à mettre ça au points :)
Merci !

Re: Demande conseil dessiner sélection 2D

Publié : mar. 17/mai/2016 18:12
par Shadow
J'ai réussi après moult essais de faire se que je voulais:

Image d’exemple:
Image

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()