FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC

Développement d'applications avec le langage Panoramic
 
AccueilAccueil  FAQFAQ  RechercherRechercher  S'enregistrerS'enregistrer  MembresMembres  GroupesGroupes  Connexion  
Derniers sujets
» I Love You
par JL35 Jeu 19 Oct 2017 - 16:25

» MARK_ON déclenche un événement ON_CLICK à la place de ...
par Jean Claude Mer 18 Oct 2017 - 18:08

» mise a jour calculatrice
par joeeee2017 Mer 18 Oct 2017 - 15:57

» [solved] 3D_LINE How to ?
par Jicehel Mer 18 Oct 2017 - 11:01

» Convertisseur de base 10 de 2 à 36
par gigi75 Mar 17 Oct 2017 - 18:49

» calculatrice avec touches movibles
par joeeee2017 Dim 15 Oct 2017 - 1:11

» CORTANA
par gigi75 Sam 14 Oct 2017 - 16:32

» Calculatrice
par Jean Claude Sam 14 Oct 2017 - 12:30

» Compilateur FBPano
par jean_debord Jeu 12 Oct 2017 - 9:53

» KGF_dll - nouvelles versions
par Klaus Mar 10 Oct 2017 - 18:49

» à propos de Panoramic_Editor [Résolu]
par Klaus Mar 10 Oct 2017 - 3:19

» Un petit "coucou" à tous les Panoramiciens !
par Jack Ven 6 Oct 2017 - 10:24

» Pourquoi le compilateur stagne
par mindstorm Mer 4 Oct 2017 - 20:38

» Panoramic ?
par Marc37 Mer 4 Oct 2017 - 0:39

» Premiers pas avec Arduino
par Marc37 Mer 4 Oct 2017 - 0:29

Navigation
 Portail
 Index
 Membres
 Profil
 FAQ
 Rechercher
Rechercher
 
 

Résultats par :
 
Rechercher Recherche avancée
Octobre 2017
LunMarMerJeuVenSamDim
      1
2345678
9101112131415
16171819202122
23242526272829
3031     
CalendrierCalendrier

Partagez | 
 

 Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
silverman

avatar

Nombre de messages : 466
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 16: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!!!Cool Cool Cool

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 - 13:34, édité 3 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5953
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 19: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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5953
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 20: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 466
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21: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? Laughing

Le nb de lignes/colonnes n'est pas calculé, il est lu. What a Face
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é! santa

!!! POUR PEEK ET POKE, VOIR L'EDIT DU PREMIER POST !!!


Dernière édition par silverman le Mar 13 Sep 2016 - 20:51, édité 3 fois
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5953
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21: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 Very Happy ) 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
' ==============================================================================
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5953
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21: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é.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
silverman

avatar

Nombre de messages : 466
Age : 45
Localisation : Picardie
Date d'inscription : 19/03/2015

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 21:43

On s'est croisé Very Happy 

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!
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5953
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Jeu 8 Sep 2016 - 22: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 !
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
JL35



Nombre de messages : 5953
Localisation : 77
Date d'inscription : 29/11/2007

MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   Ven 9 Sep 2016 - 15: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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER   

Revenir en haut Aller en bas
 
Astuce : GRID_ROW_NUMBER ; GRID_COLUMN_NUMBER
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Suggestions de sujets d'astuce
» Petite astuce informatique
» Boucle de retournement
» Un autre mystère
» Klaxon Au croisements des trains

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
FORUM DE DISCUSSION SUR LE LANGAGE PANORAMIC :: PANORAMIC :: Vos sources, vos utilitaires à partager-
Sauter vers: