Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | | Calendrier |
|
|
| Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER | |
| | Auteur | Message |
---|
silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 15:22 | |
| Bonjour à tous! J'ai trouvé le moyen d'obtenir le nb de lignes et de colonnes présentes dans un grid; Astuce 100% panoramic!!! - Code:
-
' Silverman, septembre 2016 ' ' Déterminer le nombre de ligne et de colonne d'un grid '
dim GRN%,GCN%,lig%,col% dim result%
' fabrique un grid au dimension aléatoire grid 1 : width 1,400 : height 1,200 : left 1,180 lig%=rnd(30)+1 col%=rnd(30)+1 grid_row 1,lig% grid_column 1,col%
' affiche le résultat print : print "Nb de ligne aléatoire = ",lig% print : print "Nb de colonne aléatoire = ",col%
' les subs en action Grid_row_Number(1) : GRN%=result% :' écrit le nb de ligne dans GRN%
Grid_Column_Number(1) : GCN%=result% :' écrit le nb de colonne dans GCN%
' affiche le résultat caption 0,"Grid_row_Number = " + str$(GRN%)+" / Grid_Column_Number = " + str$(GCN%)
END ' LES SUBS ' Trouve le nb de colonne sub Grid_Column_Number(my_grid) dim_local deb%,mil%,fin% ' ' initialisation deb%=0 fin%=1 repeat fin%=fin%*2 until grid_x_to_column(my_grid,fin%)=0 ' recherche par dichotomie repeat mil%=(deb%+fin%)/2 if grid_x_to_column(my_grid,mil%)<>0 deb%=mil% else fin%=mil% end_if until (fin%-deb%)<2 ' résultat result%=grid_x_to_column(my_grid,deb%)
end_sub
' Trouve le nb de ligne sub Grid_row_Number(my_grid) dim_local deb%,mil%,fin% ' ' initialisation deb%=0 fin%=1 repeat fin%=fin%*2 until grid_y_to_row(my_grid,fin%)=0
' recherche par dichotomie repeat mil%=(deb%+fin%)/2 if grid_y_to_row(my_grid,mil%)<>0 deb%=mil% else fin%=mil% end_if until (fin%-deb%)<2 ' ' résultat result%=grid_y_to_row(my_grid,deb%)
end_sub EDIT : Après plusieurs autres tests, il est préférable d'utiliser la variable "result%" directement, plutot que de passer par des peeks et pokes pour renvoyer un résultat(sinon, ça peut être aléatoire). ---> J'ai supprimé les peeks et pokes
Dernière édition par silverman le Jeu 15 Sep 2016 - 12:34, édité 3 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 18:15 | |
| C'est laborieux, mais intéressant, dommage que ça n'existe pas en natif.
En tout cas je note pour regarder de plus près, ça m'intéresse beaucoup. Merci silverman
| |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 19:52 | |
| J'ai eu une idée géniale: quand on fait un Grid_Save dans un fichier, les deux premières lignes contiennent respectivement en Ascii le nombre de lignes et le nombre de colonnes, alors je me suis dit: faisons une sauvegarde et allons lire ces paramètres.
Manque de chance, pour faire la sauvegarde il faut préciser le nombre de lignes et de colonnes à sauvegarder... J'ai essayé en mettant dans le Save des valeurs élevées par exemple 100 et 100, mais il sauvegarde imperturbablement 100 lignes de 100 colonnes (vides évidemment), avec en tête de la sauvegarde 100 et 100.
Donc c'est raté, en attendant une autre idée géniale...
Pour le moment j'ai écrit des Subs de gestion des grilles, où je maintiens en permanence à jour le nombre de lignes et de colonnes, et leurs dimensions, mais effectivement c'est intéressant de pouvoir le calculer. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 20:30 | |
| - JL35 a écrit:
- J'ai eu une idée géniale: quand on fait un Grid_Save dans un fichier, les deux premières lignes contiennent respectivement en Ascii le nombre de lignes et le nombre de colonnes, alors je me suis dit: faisons une sauvegarde et allons lire ces paramètres.
J'avais déjà évoqué cette idée ici, et tu y avais même répondu! Perdrais tu la tête? Le nb de lignes/colonnes n'est pas calculé, il est lu. L'astuce consiste à rechercher par dichotomie, la coordonnée VALIDE(cad <>0) la plus à droite du grid retourné par GRID_X_TO_COLUMN, ce qui correspond au nombre de colonne. Même principe pour les lignes! Les peek/pokes renvoient le résultat dans une variable utilisateur transmise par ADR(). Ainsi, ce n'est pas le programmeur qui s'adapte à la sub, mais bien le contraire! Pas besoin de savoir que le résultat final est stocké dans la variable mil% puisqu'il est renvoyé! !!! POUR PEEK ET POKE, VOIR L'EDIT DU PREMIER POST !!!
Dernière édition par silverman le Mar 13 Sep 2016 - 19:51, édité 3 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 20:30 | |
| Bon silverman, j'ai repiqué ton idée géniale à toi d'utiliser GRID_X_TO_COLUMN et GRID_Y_TO_ROW, qui renvoient zéro quand X est en dehors du Grid, et ça fait un truc assez simple finalement. La sub est Grid_Licol() qui renvoie les deux: nombre de lignes et nombre de colonnes. J'ai aussi repris (avec ta permission ) ton programme d'appel de la routine: - Code:
-
' Silverman, septembre 2016 ' Déterminer le nombre de ligne et de colonne d'un grid ' dim GRN%,GCN%,lig%,col% ' fabrique un grid au dimension aléatoire grid 1 : width 1,400 : height 1,200 : left 1,180 lig%=rnd(30)+1 col%=rnd(30)+1 grid_row 1,lig% grid_column 1,col% ' affiche le résultat, pour contrôle print : print "Nb de ligne aléatoire = ",lig% print : print "Nb de colonne aléatoire = ",col% ' les subs en action Grid_licol(1): ' <<<<<<<<<<<<<<<<<<<<<<<<<<<< ' affiche le résultat caption 0,"Grid_row_Number = " + str$(GRN%)+" / Grid_Column_Number = " + str$(GCN%) END ' ============================================================================== SUB Grid_Licol(gr%) ' Nb de rangées et de colonnes du GRID gr% -> GRN% et GCN% DIM_LOCAL v%,i% v% = 0: i% = GRID_X_TO_COLUMN(gr%,v%) WHILE i% > 0: GCN% = i%: v% = v%+1: i% = GRID_X_TO_COLUMN(gr%,v%): END_WHILE v% = 0: i% = GRID_Y_TO_ROW(gr%,v%) WHILE i% > 0: GRN% = i%: v% = v%+1: i% = GRID_Y_TO_ROW(gr%,v%): END_WHILE END_SUB ' ============================================================================== | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 20:33 | |
| On s'est croisés silverman, effectivement je ne me rappelais même plus que le problème avait déjà été évoqué... que veux-tu, je vieillis... En tout cas la sub telle que ci-dessus me convient parfaitement et je l'adopte à l'unanimité. | |
| | | silverman
Nombre de messages : 970 Age : 52 Localisation : Picardie Date d'inscription : 18/03/2015
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 20:43 | |
| On s'est croisé Ta méthode fonctionne parfaitement, mais il y a un souci de performance. Par exemple pour la recherche du nb de colonne, tu boucles autant de fois que la largeur du grid, cad que pour pour une largeur de 300 pixels, tu boucles 300 fois! L'intérêt de la dichotomie, c'est de diminuer cela. Dans mon code, pour la même largeur, je boucle une vingtaine de fois tout au plus, ce qui est plus rapide! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Jeu 8 Sep 2016 - 21:03 | |
| Je suis bien conscient et d'accord que c'est un peu bestial comme méthode, mais c'est une opération qu'on ne fait qu'une seule fois, j'ai commencé par faire un essai sur 1000 pixels et je n'ai constaté aucun délai, alors à mon avis ce n'est pas du tout gênant, même si ta méthode est plus élégante, certes.
PS je viens de mesurer, sur un tableau de 100 lignes et de 50 colonnes (de 100 pixels chacune), ce qui est déjà un gros tableau, je trouve 889 ms de temps d'exécution, donc moins d'une seconde. Et je suis loin d'avoir un pc de course. Ça fait 5000 pixels en largeur et 2200 pixels en hauteur.
En ce qui concerne le temps d'exécution, dans la sub, au lieu de progresser pixel par pixel (v% = v%+1) on peut sans problème le faire de 5 en 5, ou de 10 en 10, ce qui divise le temps par 10 ! | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER Ven 9 Sep 2016 - 14:37 | |
| Sur le même principe breveté silverman, deux petites subs pour récupérer la largeur d'une colonne donnée ou la hauteur d'une ligne donnée. Le résultat est rendu respectivement dans wc% et hr% déclarés dans le programme appelant ( = -1 si colonne ou ligne incorrects). - Code:
-
' ------------------------------------------------------------------------------ SUB Grille_Getwc(gr%,col%) ' Récupérer la largeur de la colonne col% du grid gr% -> wc% (-1 si col% incorrecte) DIM_LOCAL v1%,v2%,i% v1% = 0: i% = GRID_X_TO_COLUMN(gr%,v1%) WHILE i% < col% v1% = v1%+1: i% = GRID_X_TO_COLUMN(gr%,v1%): IF i% = 0 THEN wc% = -1: EXIT_SUB END_WHILE v2% = v1%: i% = GRID_X_TO_COLUMN(gr%,v2%) WHILE i% = col%: v2% = v2%+1: i% = GRID_X_TO_COLUMN(gr%,v2%): END_WHILE wc% = v2%-v1%-1 END_SUB ' ------------------------------------------------------------------------------ SUB Grille_Gethr(gr%,rng%) ' Récupérer la hauteur de la ligne rng% du grid gr% -> hr% (=-1 si rng% incorrecte) DIM_LOCAL v1%,v2%,i% v1% = 0: i% = GRID_Y_TO_ROW(gr%,v1%) WHILE i% < rng% v1% = v1%+1: i% = GRID_Y_TO_ROW(gr%,v1%): IF i% = 0 THEN hr% = -1: EXIT_SUB END_WHILE v2% = v1%: i% = GRID_Y_TO_ROW(gr%,v2%) WHILE i% = rng%: v2% = v2%+1: i% = GRID_Y_TO_ROW(gr%,v2%): END_WHILE hr% = v2%-v1%-1 END_SUB ' ------------------------------------------------------------------------------ D'accord silverman, c'est du pixel par pixel, mais ça va très vite quand même. | |
| | | Contenu sponsorisé
| Sujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER | |
| |
| | | | Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |