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

Algorithmes et structures de données Discussion :

Localiser un point à deux coordonnées dans un tableau de points


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 141
    Par défaut Localiser un point à deux coordonnées dans un tableau de points
    Bonjour à tous, une question pour les forçats du clavier qui ne sont pas en vacances...

    J'ai réalisé un petit soft de carto où je dessine une trace GPS sur une image de carte calibrée. J'ai donc en permanence la correspondance entre position du curseur souris et la position géographique en latitude longitude.

    Qd le curseur de la souris survole la trace je voudrais afficher dans une info bulle les caractéristiques du point : vitesse, altitude etc...

    Pour l'instant j'utilise une procédure un peu bourrin peu performante...

    Les points de la trace sont stockés dans un tableau où l'on a la latitude, la longitude, la coordonnée X en pixel sur la carte, la coordonnée Y en pixel sur la carte.

    Je pourrai raisonner en terme de latitude et de longitude car je peux facilement calculer la latitude et la longitude correpondant au point survolé par la souris.

    Pour l'instant j'ai adopté l'autre voie possible, raisonner sur la position en pixel sur la carte. Qd la souris se déplace je récupère sa position par rapport à la carte ( MouseX et MouseY ) et je teste si c'est une position de point GPS dans mon tableau. Je fais cela à trois pixels près. Ci dessous le bout de code Delphi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     For i := 1 to Tb_Borne do
      begin
        if (MouseX > Tb_VolData[i].MapX - 3 ) and  (MouseX < Tb_VolData[i].MapX + 3 )then
          begin
            if (MouseY > Tb_VolData[i].MapY - 3 ) and  (MouseY < Tb_VolData[i].MapY + 3 )then
              begin
                NLabAlti.Visible := True;
                NLabVitesse.Visible := True;
                NLabAlti.Value := Tb_VolData[i].Altitude;
                NLabVitesse.Value := Tb_VolData[i].Vitesse;
                exit;
              end;
          end;
      end;
    Existe il une solution plus élégante et surtout plus rapide ?

    Amicalement

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 37
    Par défaut
    Ben c'est sur que c'est pas du tout élégant de parcourir ton tableau a chaque fois et en plus de pas être élégant, c'est d'autant plus lourd que ton repère est grand.

    Ce que je ferais, c'est un tableau bi-dimensionnel des coordonnées tab_infos[x][y]
    comme ca l'acces se fait en temps constant et tu connais ton xmax, ymax, xmin, ymin.
    et adieu la boucle for.
    (tu m'excusera, je ne connais pas la syntaxe Delphi)

    Je tente un truc en pseudo-code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     
    Allouer Tb_borne[Xmax][Ymax]
    Initialise(Tb_Borne, carte) #Crée le tableau bi-dimensionnel et initialise les valeurs
     
    MouseX = x
    MouseY = y
     
    Si x > Xmax - 3 et x < Xmin +3 Alors
      Si y > Ymax - 3 et y < Ymin +3 Alors
         att1 = Tb_Borne[x][y].NLabAlti.Visible := True;
         att2 = Tb_Borne[x][y].NLabVitesse.Visible := True;
         att3 = Tb_Borne[x][y].NLabAlti.Value := Tb_VolData[i].Altitude;
         att4 = Tb_Borne[x][y].NLabVitesse.Value := Tb_VolData[i].Vitesse;
         retourner att1, att2, att3, att4
      FinSI
    FinSI
    Voila je pense que ca marche

    edit: On peut optimiser et stocker le contenu Tb_Borne[x][y] dans une variable locale

  3. #3
    Membre Expert Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Par défaut
    Qu'est-ce qui se passe si deux bornes sont suffisamment proches l'une de l'autre (si c'est possible) ?

  4. #4
    Membre Expert Avatar de Nemerle
    Inscrit en
    Octobre 2003
    Messages
    1 106
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 106
    Par défaut
    Citation Envoyé par davcha
    Qu'est-ce qui se passe si deux bornes sont suffisamment proches l'une de l'autre (si c'est possible) ?
    comprends pas la question??

Discussions similaires

  1. [MySQL] afficher les donnees de deux tables dans un tableau
    Par labartho dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 05/10/2012, 16h13
  2. [Google Maps] Mémoriser coordonnées dans un tableau
    Par ZoomBox dans le forum APIs Google
    Réponses: 5
    Dernier message: 16/01/2012, 14h17
  3. [ASP.NET/C#] Croiser deux listes dans un tableau
    Par Vinceee38 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 25/09/2011, 21h12
  4. [XL-2007] Trouver un coefficient en fonction de deux variables dans un tableau
    Par l.keysoft dans le forum Excel
    Réponses: 2
    Dernier message: 18/08/2010, 15h40
  5. Recherche du point le plus près dans un tableau de points (x,y,z)
    Par Vol dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 02/06/2006, 22h59

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