IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Trouver les cellules voisines dans une grille


Sujet :

C++

  1. #1
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut Trouver les cellules voisines dans une grille
    Salut à toutes et à tous!

    Un marcheur aléatoire se déplace dans une grille géospatialisée. Aux débuts du projet on s'intéressait à définir les probabilités de saut d'une case à l'autre avec une version discrétisée d'une loi de proba continue: le marcheur pouvait sauter plusieurs cases, la probabilité associée au passage à ce saut étant fonction de la distance géographique entre les deux cases (en fait entre les deux centroides des deux cases). Puisqu'on avait régulièrement besoin de calculer des distances entre deux coordonnées, j'ai beaucoup utilisé une classe LongitudeLattiude à travers le projet, mais suivant les bons conseils d'une forumeuse bien connue de ces contrées, j'ai pris soin de mettre des templates sur tout ce qui pouvait concerner le référentiel spatial.

    Les besoins changeant (didju que j'aime pouvoir enfin dire cette phrase...) , il a fallu passer à une version où l'espace d'arrivée du marcheur aléatoire est restreint à 5 cases: case de départ + les 4 cases nord/sud/est/ouest.
    Un peu naïvement j'ai voulu "juste" ajouter la résolution spatiale du quadrillage en longitude/latitude pour pouvoir à partir des cordonnées d'une case X, trouver les coordonnées des 4 voisines. Par "coordonnées de la case", j'entends "coordonnées du centroide de la case".

    Les ordinateurs ne calculant décidément pas juste, il m'a fallu reprojeter les points obtenus après addition de la latitude (longitude) avec une formule un peu relou. Le tout étant décidément très peu efficace, le temps de simulation a (évidemment ? ) explosé.

    Comment vous y prendriez-vous ?

    Est-ce que le moment est arrivé de repasser à un référencement type matrice (numéro de ligne / numéro de colonne) plutôt que de m'embêter à recalculer des coordonnées à tout va ?

    En vous remerciant d'avance!
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je ne comprends pas.
    Si tu as des cases, et donc un quadrillage, depuis ta case (X,Y) la case suivante c'est la case c'est (X+1, Y), la précédente (X-1, Y). Au-dessus on est à Y-1 et en-dessous à Y+1.
    La seule subtilité est si tu es déjà arrivé au bord, alors il faut éviter de prendre une case qui n'existe pas.

    Si tu as déjà des coordonnées, peut-être pouvoir tomber dans le cercle de centre la case trouvée et travailler en distances et non en cases ?

    Les ordinateurs ne calculant décidément pas juste
    ? C'est même la seule chose qu'ils savent faire
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Merci de ta reponse

    Citation Envoyé par Bousk Voir le message
    Je ne comprends pas.
    Si tu as des cases, et donc un quadrillage, depuis ta case (X,Y) la case suivante c'est la case c'est (X+1, Y), la précédente (X-1, Y). Au-dessus on est à Y-1 et en-dessous à Y+1.
    La seule subtilité est si tu es déjà arrivé au bord, alors il faut éviter de prendre une case qui n'existe pas.
    Si tu as déjà des coordonnées, peut-être pouvoir tomber dans le cercle de centre la case trouvée et travailler en distances et non en cases ?
    En fait j'ai a la fois une sémantique d'espace discret ( donnée par des données stockées dans un fichier geotiff, avec des valeurs stockées pour chaque case, valeurs qui ont leur importance dans la simulation) et une sémantique de coordonnées dans un espace continu (les positions initiales des marcheurs aléatoires qui sont données en LonLat, les sorties consoles en lon lat, notre intuition en lon/lat), donc je me perds parfois dans la sémantique a privilégier.

    Devoir calculer des distances entre coordonnées géographiques lointaines m'avait incité a manipuler des types ayant une sémantique lonlat pour pouvoir calculer la "great circle distance", et j'avais ramener le concept de "case" a la coordonnée géographique du centre de cette case. Donc en gros ca revient a dire j'avais pleins de points dispersés régulièrement dans un espace géographique continu, et que le marcheur aléatoire pouvait sauter d'un point a n'importe quel autre. C'était ma façon de discrétiser l'espace, l'avantage étant qu'on pouvait imaginer d'autre patrons de discrétisation.

    Maintenant que je suis plutôt préoccupé par les notions de cases adjacentes et de bord, cette histoire d'ensemble de points ne marche plus très bien et je cherche une solution pas trop sale. Une solution sale serait d'utiliser mon ancien code en disant que la proba de sauter de x a y est de 0 si la distance entre x et y est supérieure a un certain seuil. Ca permettrait de rester dans l'optique que x et y sont exprimées en coordonnées continues (lonlat) plutôt que discret (ligne/colonne) mais ça implique calculer beaucoup de fois les distances, donc je cherchais une alternative

    Citation Envoyé par Bousk Voir le message
    ? C'est même la seule chose qu'ils savent faire
    Pardon, je me suis mal exprimé. Je voulais dire que je lui ai très mal expliqué ce qu'il devait calculer et la précision que j'attendais, et que je me plains qu'il a mal compris. Oui oui.
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  4. #4
    Invité
    Invité(e)
    Par défaut
    Salut

    Je ne suis pas certain d'avoir complètement compris ta problématique donc désolé d'avance si je dis n'importe quoi.

    Perso, je ne suis pas fan de la sur-conception "au cas où ça pourrait servir dans le futur potentiel". A mon avis, il vaut mieux répondre correctement et simplement au problème actuel, et, si le besoin évolue, généraliser et refactorer plus tard. Du coup, repasser à une implémentation plus spécifique ne me choque pas, d'ailleurs ça arrive assez souvent quand le besoin de performance est prioritaire (même s'il est certainement possible de faire une jolie implémentation à la fois générique et performante, en s'arrachant quelques cheveux).

    Sinon, tu as regardé des bibliothèques comme gdal ou cgal ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je ne saisis toujours pas. Le passage de coordonnées à cases se fait normalement en 2 opérations : une division et un modulo.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  6. #6
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Citation Envoyé par SimonDecoline Voir le message
    Du coup, repasser à une implémentation plus spécifique ne me choque pas, d'ailleurs ça arrive assez souvent quand le besoin de performance est prioritaire (même s'il est certainement possible de faire une jolie implémentation à la fois générique et performante, en s'arrachant quelques cheveux).
    Ok bon bah allons y gaiement pour des indices de lignes/colonne.

    Citation Envoyé par SimonDecoline Voir le message
    Sinon, tu as regardé des bibliothèques comme gdal ou cgal ?
    On utilise GDAL pour manipuler les geotiff, oui. J'avais un peu galérer avec cette bibliothèque. A la même époque j'avais jeté un coup d’œil a CGAL pour voir a quel point ce serait difficile d'imaginer d'autre modèles de tesselation qu'une simple grille. Merci de m'en avoir rappelé le nom, je n'arrivais plus a la retrouver.

    Je ne saisis toujours pas. Le passage de coordonnées à cases se fait normalement en 2 opérations : une division et un modulo.
    Mhhh je ne saisis pas non plus. Pour passer des points de longitude/latitude a des indices de cases, j'utilise l'API de gdal justement.
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Petit principe que j'ai appris sur notre forum: "si le problème est dans la performance, diagnostique avec un profileur."

    Lui seul pourra te dire quel est ta perte de temps.

    Je parie sur les conversions trop nombreuses.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplir les cellules vides dans une boucle
    Par zoltar_x dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/11/2011, 18h35
  2. [XL-2007] Ignorer les cellules vides dans une combo-box
    Par Esak59 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/02/2011, 11h54
  3. Conserver les noeuds ouverts dans une grille
    Par ghotique dans le forum Flex
    Réponses: 4
    Dernier message: 03/12/2009, 13h05
  4. Trouver les cellules vides dans un tableau de cellules
    Par ricololo dans le forum MATLAB
    Réponses: 12
    Dernier message: 13/11/2008, 15h11
  5. Problème pour trouver les données commune dans une requête
    Par Winterrage dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/02/2008, 10h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo