Renvoyer position X et Y tableau Image

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Renvoyer position X et Y tableau Image

Message par Lord Nelson »

Salut, je créer un visualiseur de tableau...

Je bloque sérieusement sur un problème, j'ai beau chercher une solution, au bout d'un moment cella ne fonctionne pas :?
Voilà mon histoire:

J'ai une image ou est dessiner un tableau ou chaque cellule fais 7 / 7 en interne sans compter les borts car les cellules se touchent
Quand je clique sur mon image, la cellule cliquer deviens rouge (Je redessine l'image en remplissant la cellule de rouge), s'il a déjà une cellule sélectionné, je la remplie de blanc, bref

Je voudrais calculer dans quel cellule c'est produit le clique en X et en Y égale à mon tableau mais j'y arrive pas !
C'est surement tout bête comme solution mais je coince :(

Quand je clique, je renvoie la position du clique en X et en Y dans cette image, il faut alors convertir ça en X et Y de la cellule cliquer = à mon tableau
Je sais pas comment expliquer :?

Le mieux est de vous passer le code, même s'il est long, vous pourrez le tester par vous même et vous rendre compte de mon problème
Vous verrez que quand je clique sur l'image, la cellule deviens rouge et la position de la cellule par un calcule est renvoyer.

ça fonctionne pendent un moment mais au bout d'un moment ça ne fonctionne plus à cause de l'arrondis je suppose car des fois
suivent ou on clique dans la cellule, des résultats différents peuvent apparaitre !

J’espère que vous pourrez m'aider, le code n'est pas fini :)

Code : Tout sélectionner

Procedure.l IsMouseOverGadget(Gadget) 
  
  Protected.i SourisPosX, SourisPosY, GadgetPosX, GadgetPosY, GadgetLargeur, GadgetHauteur, FenetreActive
  
  FenetreActive = GetActiveWindow()
  
  If IsWindow(FenetreActive)
    GadgetPosX = GadgetX(gadget,#PB_Gadget_WindowCoordinate)
    GadgetPosY = GadgetY(gadget,#PB_Gadget_WindowCoordinate)
    GadgetLargeur = GadgetWidth(gadget)
    GadgetHauteur = GadgetHeight(gadget)
    SourisPosX = WindowMouseX(FenetreActive)
    SourisPosY = WindowMouseY(FenetreActive)
  Else
    ProcedureReturn #False
  EndIf
  
  If SourisPosX < GadgetPosX
    ProcedureReturn #False
  EndIf
  
  If SourisPosX >= (GadgetPosX+GadgetLargeur)
    ProcedureReturn #False
  EndIf
  
  If SourisPosY < GadgetPosY
    ProcedureReturn #False
  EndIf
  
  If SourisPosY >= (GadgetPosY+GadgetHauteur)
    ProcedureReturn #False
  EndIf
  
  ProcedureReturn #True
  
EndProcedure 

Procedure RoundStep(Nombre.i, Pas.i)
  Protected Retour.i
  
  Retour = (Nombre / Pas) * Pas
  If Nombre % Pas > Pas / 2
    Retour + Pas
  EndIf
 
  ProcedureReturn Retour
EndProcedure

Procedure.s CalculePositionCellule(CliqueX, CliqueY)
  
  ClearDebugOutput()
  
  Debug "X = " + Str(CliqueX)
  Debug "Y = " + Str(CliqueY)
  Debug "----------"
  
  CliqueX = CliqueX - 1
  CliqueY = CliqueY - 1
  
  Debug "----------"
  Debug Str(CliqueX + 1) + " - 1 = " + Str(CliqueX)
  Debug Str(CliqueY + 1) + " - 1 = " + Str(CliqueY)
  
  OpperationX1 = Int(CliqueX / 7)
  OpperationY1 = Int(CliqueY / 7)
  
  Debug "----------"
  Debug Str(CliqueX) + " / 7 = " + Str(OpperationX1)
  Debug Str(CliqueY) + " / 7 = " + Str(OpperationY1)
  
  OpperationX2 = CliqueX - OpperationX1
  OpperationY2 = CliqueY - OpperationY1
  
  Debug "----------"
  Debug Str(CliqueX) + " - " + Str(OpperationX1) + " = " + Str(OpperationX2)
  Debug Str(CliqueY) + " - " + Str(OpperationY1) + " = " + Str(OpperationY2)
  
  OpperationX3 = Int(OpperationX2 / 7)
  OpperationY3 = Int(OpperationY2 / 7)
  
  Debug "----------"
  Debug Str(OpperationX2) + " / 7 = " + Str(OpperationX3)
  Debug Str(OpperationY2) + " / 7 = " + Str(OpperationY3)
  
  If OpperationX3 < 0
    OpperationX3 = 0
  EndIf
  
  If OpperationY3 < 0
    OpperationY3 = 0
  EndIf
  
  Debug "----------"
  Debug "Résultat finale X = " + Str(OpperationX3)
  Debug "Résultat finale Y = " + Str(OpperationY3)
  Debug "----------"
  
  If CliqueX => 0 And CliqueY => 0
    
    
    
  Else
    ProcedureReturn "Aucune"
    
  EndIf
  
  ProcedureReturn ""
  
EndProcedure

; Procédure pour dessiner un tableau
Procedure.l DessinerTableau(Array Tableau.l(2))
  
  Fenetre = OpenWindow(#PB_Any, 0, 0, 794, 616, "Aperçus du Tableau", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  WindowBounds(Fenetre, 253, 201, 9999, 9999) 
  SmartWindowRefresh(Fenetre, 1) 
  
  MenuSysteme = CreatePopupImageMenu(#PB_Any, #PB_Menu_ModernLook)
  
  MenuItem(1, "Ouvrir"   +Chr(9)+"Ctrl+O")
  MenuItem(2, "Enregistrer"   +Chr(9)+"Ctrl+S")
  MenuItem(3, "Enregistrer sous"+Chr(9)+"Ctrl+R")
  MenuItem(4, "Fermer"  +Chr(9)+"Ctrl+F")
  
  PanelGadget = PanelGadget(#PB_Any, 1, 1, 794, 615)
  AddGadgetItem(PanelGadget, 1, "Valeur Celule", 0, 0)
  
  TextGadgetInformationValeurCelule = TextGadget(#PB_Any, 5, 5, 100, 15, "X: 0, Y: 0, T: 0")
  
  AddGadgetItem(PanelGadget, 0, "Tableau", 0, 0)
  SetGadgetState(PanelGadget, 0)
  
  ScrollAreaGadget = ScrollAreaGadget(#PB_Any, 0, 0, GadgetWidth(PanelGadget) - 8, GadgetHeight(PanelGadget) - 27, 8162, 8162, 10, #PB_ScrollArea_Flat)
  ImageGadget = ImageGadget(#PB_Any, 0, 0, 8162, 8162, 0)
  
  CloseGadgetList()
  
  ImageTableau = CreateImage(#PB_Any, 8162, 8162, 24, RGB(255, 255, 255))
  
  ; Création des celules du tableau en les dessinant sur l'image
  StartDrawing(ImageOutput(ImageTableau))
  
  DrawingMode(#PB_2DDrawing_Outlined)
  
  For X = 0 To ArraySize(Tableau.l(), 1)
    
    For Y = 0 To ArraySize(Tableau.l(), 2)
      
      Box(X * 8 + 1, Y * 8 + 1, 9, 9, RGB(200, 200, 200))
      
    Next
    
  Next
  
  StopDrawing()
  
  SetGadgetState(ImageGadget, ImageID(ImageTableau))
  
  Repeat
    
    Event = WaitWindowEvent()
    
    If IsMouseOverGadget(ImageGadget) And Event = 516
      InterupteurCliqueDroitImageGadget = 1
      
    ElseIf IsMouseOverGadget(ImageGadget) And (Event = 517 And InterupteurCliqueDroitImageGadget = 1)
      InterupteurCliqueDroitImageGadget = 0
      DisplayPopupMenu(MenuSysteme, WindowID(Fenetre)) 
      
    ElseIf Not IsMouseOverGadget(ImageGadget) And (Event = 517 And InterupteurCliqueDroitImageGadget = 1)
      InterupteurCliqueDroitImageGadget = 0
      
    EndIf
    
    If IsMouseOverGadget(ImageGadget) And Event = 513
      InterupteurCliqueGaucheImageGadget = 1
      
      SauvegardeCliqueX = WindowMouseX(Fenetre) - 5 + GetGadgetAttribute(ScrollAreaGadget, #PB_ScrollArea_X)
      SauvegardeCliqueY = WindowMouseY(Fenetre) - 25 + GetGadgetAttribute(ScrollAreaGadget, #PB_ScrollArea_Y)
      
    ElseIf IsMouseOverGadget(ImageGadget) And (Event = 514 And InterupteurCliqueGaucheImageGadget = 1)
      InterupteurCliqueGaucheImageGadget = 0
      
      CliqueX = WindowMouseX(Fenetre) - 5 + GetGadgetAttribute(ScrollAreaGadget, #PB_ScrollArea_X)
      CliqueY = WindowMouseY(Fenetre) - 25 + GetGadgetAttribute(ScrollAreaGadget, #PB_ScrollArea_Y)
      
      If (CliqueX > 1 And CliqueY > 1) And (CliqueX = SauvegardeCliqueX And CliqueY = SauvegardeCliqueY)
        
        StartDrawing(ImageOutput(ImageTableau))
        CouleurClique = Point(CliqueX,CliqueY)
        StopDrawing()
        
        If CouleurClique <> RGB(200, 200, 200)
          SauvegardePrecedentClique$ = Str(CliqueX) + ", " + Str(CliqueY)
          
          If IsImage(ImageTableauCopie)
            FreeImage(ImageTableauCopie)
          EndIf
          
          ImageTableauCopie = CopyImage(ImageTableau, #PB_Any)
          
          StartDrawing(ImageOutput(ImageTableauCopie))
          FillArea(Val(StringField(SauvegardePrecedentClique$, 1, ", ")), Val(StringField(SauvegardePrecedentClique$, 2, ", ")), -1, RGB(255, 255, 255))
          FillArea(CliqueX, CliqueY, -1, RGB(255, 0, 0))
          StopDrawing()
          
          SetGadgetState(ImageGadget, ImageID(ImageTableauCopie))
          SetGadgetText(TextGadgetInformationValeurCelule, CalculePositionCellule(CliqueX, CliqueY) + ", T: " + Str(TableauTaille))
          
        EndIf
        
      EndIf
      
    ElseIf Not IsMouseOverGadget(ImageGadget) And (Event = 514 And InterupteurCliqueGaucheImageGadget = 1)
      InterupteurCliqueGaucheImageGadget = 0
      
    EndIf
    
    Select Event
        
        
        
      Case 512 ; Déplacement de la souris sur la fenêtre
        
        If IsMouseOverGadget(ImageGadget)
          
          
          
        EndIf
        
      Case 161
        If IsImage(ImageTableauCopie)
          SetGadgetState(ImageGadget, ImageID(ImageTableauCopie))
          SetGadgetText(TextGadgetInformationValeurCelule, CalculePositionCellule(CliqueX, CliqueY) + ", T: " + Str(TableauTaille))
        Else
          If IsImage(IsImage(ImageTableau))
            SetGadgetState(ImageGadget, ImageID(ImageTableau))
            SetGadgetText(TextGadgetInformationValeurCelule, "X: 0, Y: 0, T: 0")
          EndIf
        EndIf
        
      Case 513 ; Bouton gauche appuiler avec la souris sur la fenêtre
        
      Case 514 ; Bouton gauche relacher avec la souris sur la fenêtre
        
      Case 515 ; Double clique gauche avec la souris sur la fenêtre
        
      Case 516 ; Bouton droit appuiler avec la souris sur la fenêtre
        
      Case 517 ; Bouton droit relacher avec la souris sur la fenêtre
        
      Case 518 ; Double clique droit avec la souris sur la fenêtre
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
          Case 1
            
            
            
        EndSelect
        
      Case #PB_Event_SizeWindow
        ResizeGadget(PanelGadget, #PB_Ignore, #PB_Ignore, WindowWidth(Fenetre), WindowHeight(Fenetre) - 1)
        ResizeGadget(ScrollAreaGadget, #PB_Ignore, #PB_Ignore, GadgetWidth(PanelGadget) - 8, GadgetHeight(PanelGadget) - 27)
        
        If IsImage(ImageTableauCopie)
          SetGadgetState(ImageGadget, ImageID(ImageTableauCopie))
          SetGadgetText(TextGadgetInformationValeurCelule, CalculePositionCellule(CliqueX, CliqueY) + ", T: " + Str(TableauTaille))
        Else
          If IsImage(IsImage(ImageTableau))
            SetGadgetState(ImageGadget, ImageID(ImageTableau))
            SetGadgetText(TextGadgetInformationValeurCelule, "X: 0, Y: 0, T: 0")
          EndIf
        EndIf
        
    EndSelect
    
  Until Event = #PB_Event_CloseWindow
  
  
EndProcedure

; Mini = 85, 65
; Maxi = 1019, 1019
Dim MonTableau.l(1019, 1019)

DessinerTableau(MonTableau.l())
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Renvoyer position X et Y tableau Image

Message par Fig »

Je n'ai pas le temps de regarder ton prog, mais peut être que je peux t'aider quand même.

En général, on utilise une formule du type:
Xtableau=Xclique/LargeurCaseX (si le tableau commence à l'indice 0 ou Xtableau=Xclique/LargeurCaseX+1 s'il commence à 1)
et idem en Y
Ytableau=Yclique/LargeurCaseY (si le tableau commence à l'indice 0 ou Ytableau=Yclique/LargeurCaseY+1 s'il commence à 1)

Tes cases faisant donc 7 de large+1 de bordure à gauche, ça fait LargeurCaseY et X=8.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Renvoyer position X et Y tableau Image

Message par Lord Nelson »

Salut,

Alors cella ne fonctionne pas :|
Problème d'arrondis encore je suppose.

J'ai pas précisé aussi que quand on clique sur une bordure, ici en gris, le clique n'est pas pris en compte :wink:
Il faut cliquer dans la cellule et non sur la bordure qui est gris ici.

Il dois être ici le soucis je pense.
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Renvoyer position X et Y tableau Image

Message par falsam »

La finalité de ton code est de produire un tableau de pixels et de construire une image en sortie avec ce tableau ?
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%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Renvoyer position X et Y tableau Image

Message par Lord Nelson »

Heu je comprends pas trop se que tu veux dire mais si c'est se que je crois oui c'est ça
Dessiner le tableau pour en créer un aperçus :)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Renvoyer position X et Y tableau Image

Message par falsam »

Lord Nelson a écrit :Heu je comprends pas trop se que tu veux dire mais si c'est se que je crois oui c'est ça
Dessiner le tableau pour en créer un aperçus :)
Ooops ma question devait être trop compliquée :)

Je reformule autrement :
Le but est de visualiser une image formée par l'ensemble des cases de ton tableau ?
Chaque cellule de ton tableau représente un pixel (plot) de ton image ?
:mrgreen:
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%
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Renvoyer position X et Y tableau Image

Message par Fig »

Lord Nelson a écrit :Salut,

Alors cella ne fonctionne pas :|
Problème d'arrondis encore je suppose.

J'ai pas précisé aussi que quand on clique sur une bordure, ici en gris, le clique n'est pas pris en compte :wink:
Il faut cliquer dans la cellule et non sur la bordure qui est gris ici.

Il dois être ici le soucis je pense.
Pas de problème d'arrondi, la formule fonctionne avec Xtableau.i (entier=pas de virgule)
Comme ce n'est pas un float (nombre à virgule), l'arrondi se fait très bien.
As tu seulement essayé ?

Pour la bordure il faut tester le reste de la division:
Xclique%8
Mais ça me parait complétement secondaire: on s'en fout.

Essaye de réfléchir par toi même avec ces deux indications tu devrais y arriver...
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Renvoyer position X et Y tableau Image

Message par Lord Nelson »

Merci pour vos réponses,

@Falsam, je crois que t'as pas bien compris :lol:
Une case sur l'image est une case de mon tableau !

En même temps, j'ai tellement bien expliquer que je comprends que tu comprenne rien :wink:

@Fig, en allant me balader et en réfléchissante au problème, j'ai réussi :)
C'est bien se que tu avais dit sauf que quand j'ai testé, ça fonctionnais pas car CliqueX et Y avais 1 de trop :)
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Renvoyer position X et Y tableau Image

Message par falsam »

J'espére que c'est bien ça que tu souhaitais. N'hésites pas à poser des questions :)

Code : Tout sélectionner

EnableExplicit

Enumeration
  #Mainform
  #ScrollArea
  #Grid  
  #Image
  
  #Row
  #Col
EndEnumeration

Define.l Event, WEvent, MEvent, GEvent, TEvent

Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget

Global GridWidth, GridHeight, RedColor, WhiteColor

Structure Cell
  x.i
  y.i
  Color.l
EndStructure

Global NewList Grid.Cell()

Procedure GridCreate()
  Protected x, y
  
  CreateImage(#Image, GridWidth*8, GridHeight*8, 24, RGB(255, 255, 255))
  
  StartDrawing(ImageOutput(#Image))
  DrawingMode(#PB_2DDrawing_Outlined)
  
  For x = 0 To GridWidth+1
    For y = 0 To GridHeight+1
      AddElement(Grid())
      Grid()\x = x * 8
      Grid()\y = y * 8
      Box(Grid()\x , Grid()\y, 8, 8, RGB(220, 220, 220))
    Next
  Next
  StopDrawing()
  
EndProcedure

Procedure GridUpdate(MouseX=0, MouseY=0)  
  
  ;Mise à jour de l'image
  StartDrawing(ImageOutput(#Image))
  
  ForEach Grid()
    If (MouseX > Grid()\x And MouseX < Grid()\x + 8) And (MouseY > Grid()\y And MouseY < Grid()\Y + 8)
      If Grid()\Color = RedColor
        Grid()\Color = WhiteColor
      Else
        Grid()\Color = RedColor
      EndIf
      
      DrawingMode(#PB_2DDrawing_Default)
      Box(Grid()\x , Grid()\y, 8, 8, Grid()\Color)  
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(Grid()\x , Grid()\y, 8, 8, RGB(220, 220, 220))
      
	    SetGadgetText(#Col, Str((Grid()\x / 8) + 1))
	    SetGadgetText(#Row, Str((Grid()\y / 8) + 1))
	  EndIf  
	Next
  StopDrawing()
  
  ;Mise à jour du canvas
  StartDrawing(CanvasOutput(#Grid))
  DrawImage(ImageID(#Image), 0, 0)
  StopDrawing()
  
EndProcedure
  

Procedure ExaminePixel(TEvent)
  Protected MouseX, MouseY
  
  ;Mémorisation des coordonnées de la souris sur le canvas
	MouseX = GetGadgetAttribute(#Grid, #PB_Canvas_MouseX)
	MouseY = GetGadgetAttribute(#Grid, #PB_Canvas_MouseY)
	
	Select TEvent
	  Case #PB_EventType_RightButtonDown
	    ;Ton menu contextuel
	     	    
	  Case #PB_EventType_LeftButtonDown      
      GridUpdate(MouseX, MouseY)
		    
	EndSelect 
EndProcedure


Procedure Open_MainForm()
  Protected ColorW, ColorR, ColorG, ColorB
  
  OpenWindow(#Mainform, 0, 0, 800, 600, "New Form", WindowStyle)  
  
  TextGadget(#PB_Any, 5, 20, 10, 20, "C")
  TextGadget(#Col, 20, 20, 30, 20, "0") 
  
  TextGadget(#PB_Any, 5, 40, 10, 20, "R")
  TextGadget(#Row, 20, 40, 30, 20, "0") 
  
  ScrollAreaGadget(#ScrollArea, 50, 0, 750, 600, GridWidth*8, GridHeight*8) 
  CanvasGadget(#Grid, 0, 0, GridWidth*8, GridHeight*8)
  CloseGadgetList() 

  GridCreate()
  GridUpdate() 
  
EndProcedure


Procedure Start()
  REdColor = RGB(255, 0, 0)
  WhiteColor = RGB(255, 255, 255)
  
  GridWidth = 1024
  GridHeight = 1024
  
  Open_MainForm()
  
EndProcedure

start()

Repeat
  Event  = WaitWindowEvent(100)
  WEvent = EventWindow()
  MEvent = EventMenu()
  GEvent = EventGadget()
  TEvent = EventType()
  
  Select Event
    Case #PB_Event_Gadget
      Select GEvent
        Case #Grid
          ExaminePixel(TEvent)                        
      EndSelect
      
    Case #PB_Event_SizeWindow
      ResizeGadget(#ScrollArea, #PB_Ignore, #PB_Ignore, WindowWidth(#Mainform, #PB_Window_InnerCoordinate)-50, WindowHeight(#Mainform, #PB_Window_InnerCoordinate))
      
    Case #PB_Event_CloseWindow
      End
  EndSelect
ForEver
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%
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Renvoyer position X et Y tableau Image

Message par Lord Nelson »

Pas mal ton code @Falsam :)
Merci.
Répondre