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

Composants graphiques Android Discussion :

Création d'une carte à base de tuiles


Sujet :

Composants graphiques Android

  1. #21
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Par défaut
    Mon dossier assests fait 10Mo et je rencontre aussi ceci sur l'émulateur de temps en temps. Ne t'inquiètes pas, sur les téléphones il n'y a pas ce problème.

    Pour le résoudre, essayes d'attacher une carte SD de 1Go a ton émulateur. Ce que je sais c'est que chez moi c'est une fois sur 2, essayes de relancer ton app, ça passera peut être.

  2. #22
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Merci Viish \o/
    Effectivement, en mettant :

    Create new AVD -> SD Card: -> 1000 MiB

    Plus de problème avec le dossier assets !
    Maintenant, je vais me pencher sur comment afficher des lignes sur la carte (un algorithme de Dijkstra cherche le chemin le plus court entre les intersections de routes et à la fin, ça retourne le chemin trouvé)

    Selon moi il y a deux solutions possibles :

    1. soit dessiner les lignes sur chaque tuile juste après le chargement de l'image de la tuile et avant la création du nouvel objet Tuile. C'est cette solution que j'avais utilisé sur la version WinCE de l'application, mais il y avait des bouts de lignes qui n'étaient pas dessinés (si la ligne passait par une tuile sans que les deux points (qui forment la ligne) ne soit présents sur la tuile (ça le fait sur les coins des tuiles généralement))
      ou
    2. soit dessiner directement au dessus des tuiles, mais ça voudrait dire refaire pas mal de calculs lors des scrolls...


    Remarques, le bug de la solution n°1 pourrait être éviter si j'arrive à détecter qu'une partie la ligne passe sur la tuile...

  3. #23
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    mais il y avait des bouts de lignes qui n'étaient pas dessinés (si la ligne passait par une tuile sans que les deux points (qui forment la ligne) ne soit présents sur la tuile
    Tu peux calculer les intersections de la ligne AB joignant les 2 points avec les bords de la tuile et tracer seulement la partie de AB incluse dans la tuile.
    Je suis toutefois surpris que, si A et/ou B sont en dehors de la tuile, une ligne AB coupant la tuile et dont le tracé a été demandé ne se voie pas !

  4. #24
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut J'ai voulu utilisé des int à la place des float = quelques heures à tourner en rond...
    J'ai fait ce système pour éviter de faire trop de calculs lors de la création des tuiles. Je me suis aperçu du bug, mais je suis passé sur une autre partie du projet...

    Voici le code (C#)
    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
    foreach (Ligne ligne in this._Lignes) {
    	int x0Absolu, y0Absolu, x1Absolu, y1Absolu, x0, y0, x1, y1;
    	x0Absolu = ParsePixel(ligne.Debut, 0, 0).X;
    	y0Absolu = ParsePixel(ligne.Debut, 0, 0).Y;
    	x1Absolu = ParsePixel(ligne.Fin, 0, 0).X;
    	y1Absolu = ParsePixel(ligne.Fin, 0, 0).Y;
    	x0 = x0Absolu / 256;
    	y0 = y0Absolu / 256;
    	x1 = x1Absolu / 256;
    	y1 = y1Absolu / 256;
    	if (x == x0 && y == y0)
    		Graphics.FromImage(Image).DrawLine(blackPen, x0Absolu - (x0 * 256), y0Absolu - (y0 * 256), x1Absolu - (x0 * 256), y1Absolu - (y0 * 256));
    	if (x == x1 && y == y1)
    		Graphics.FromImage(Image).DrawLine(blackPen, x0Absolu - (x1 * 256), y0Absolu - (y1 * 256), x1Absolu - (x1 * 256), y1Absolu - (y1 * 256));
    }
    Je sais, c'est pas optimisé, le nom des variables est à chier, mais j'ai certainement codé ça vers les 4h du mat avec un mal de tête (patapé patapé). C'est justement pour rectifier le tir que je me remet le nez dedans...

    Étant nul en math, si vous avez des suggestions, je prend ^^

    Je viens de trouver un petit bout de réponse, j'ai cherché à tester si la ligne coupe l'un des 4 coté de la tuile, et je suis tombé sur cette page http://www.emilienkia.fr/wiki/doku.p...:geom:interseg, je m'en suis inspiré pour faire ce petit bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public boolean intersectionSegments(int SegmentAlphaPointAlphaX, int SegmentAlphaPointAlphaY, int SegmentAlphaPointBetaX, int SegmentAlphaPointBetaY, int SegmentBetaPointAlphaX, int SegmentBetaPointAlphaY, int SegmentBetaPointBetaX, int SegmentBetaPointBetaY) {
    	float denominateur  = ((SegmentBetaPointBetaY - SegmentBetaPointAlphaY) * (SegmentAlphaPointBetaX - SegmentAlphaPointAlphaX)) - ((SegmentBetaPointBetaX - SegmentBetaPointAlphaX) * (SegmentAlphaPointBetaY - SegmentAlphaPointAlphaY));
    	if(denominateur != 0) {
    		float numerateurAlpha = ((SegmentBetaPointBetaX - SegmentBetaPointAlphaX) * (SegmentAlphaPointAlphaY - SegmentBetaPointAlphaY)) - ((SegmentBetaPointBetaY - SegmentBetaPointAlphaY) * (SegmentAlphaPointAlphaX - SegmentBetaPointAlphaX));
    		float numerateurBeta = ((SegmentAlphaPointBetaX - SegmentAlphaPointAlphaX) * (SegmentAlphaPointAlphaY - SegmentBetaPointAlphaY)) - ((SegmentAlphaPointBetaY - SegmentAlphaPointAlphaY) * (SegmentAlphaPointAlphaX - SegmentBetaPointAlphaX));
    		float inconnueAlpha = numerateurAlpha / denominateur;
    		float inconnueBeta = numerateurBeta / denominateur;
    		if(inconnueAlpha >= 0 && inconnueAlpha <= 1 && inconnueBeta >= 0 && inconnueBeta <= 1) return true;
    	}
    	return false;
    }
    Je vais devoir tester les 4 segments (les arrêtes de la tuile) et si l'un d'eux retourne true, c'est bon... Je n'ai pas encore testé le code, je vous dis si ça marche quand c'est fait.

  5. #25
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Petit problème avec drawLine
    J'ai un petit problème tout con :

    Comment dessiner les lignes sur le Bitmap d'une tuile ?

    C'est tout con, mais j'y arrives pas... j'imagine qu'il faut faire un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Bitmap Image = imageDeLaTuile;
     
    Paint paint = new Paint();
    paint.setColor(Color.WHITE);						
     
    Canvas canvas = new Canvas(Image);
    canvas.drawLine(10, 10, 100, 200, paint);
    Mais ça marche pas... ça me sort une erreur bizarre dans un nouvel onglet de la perspective Debug :

    ViewRoot.draw(boolean) line: 1235

    Je suis complètement perdu là...


    [...un peu plus tard dans la soirée...]


    Bon, il semble que j'ai trouvé la solution, il fallait que le Bitmap soit mutable (en gros qu'on puisse dessiner dessus). le précédent code renvoyait un Bitmap non mutable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image = BitmapFactory.decodeStream(inputStream)
    Le nouveau code lui renvoie un Bitmap mutable (avec le paramètre boolean isMutable à true) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Image = BitmapFactory.decodeStream(inputStream).copy(Bitmap.Config.ARGB_8888, true);
    Bon, maintenant je vais pouvoir tester la fonction intersectionSegments...

  6. #26
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Après deux ou trois tests : ça semble fonctionner
    J'ai réussi à faire fonctionner la fonction de intersectionSegments, j'avais voulu mettre des int à la place de quelques float et ça m'a fait perdre quelques heures T_T (j'ai corrigé plus haut)

    Donc, pour afficher les lignes sur la carte il faut détecter pour chaque ligne, si pour chaque tuile elle est présente dans cette dernière. Pour cela, il faut :
    1. détecter si la ligne commence ou termine depuis la tuile courante
      et si ce n'est pas le cas,
    2. détecter si la ligne traverse au minimum un des quatre côtés de la tuile.


    Voici un petit bout de 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    // Test Lignes //
    int lignePointAlphaX = 128;
    int lignePointAlphaY = 200;
    int lignePointBetaX = 350;
    int lignePointBetaY = 360;
     
    /*[...]*/
     
    if(Image.isMutable()) {
    	int coinTuileHautGaucheX = x * 256;
    	int coinTuileHautGaucheY = y * 256;
    	int coinTuileHautDroiteX = (x + 1) * 256;
    	int coinTuileHautDroiteY = y * 256;
    	int coinTuileBasDroiteX = (x + 1) * 256;
    	int coinTuileBasDroiteY = (y + 1) * 256;
    	int coinTuileBasGaucheX = x * 256;
    	int coinTuileBasGaucheY = (y + 1) * 256;
     
    	boolean affichage = false;
    	if((lignePointAlphaX > coinTuileHautGaucheX && lignePointAlphaX < coinTuileHautDroiteX && lignePointAlphaY > coinTuileHautGaucheY && lignePointAlphaY < coinTuileBasGaucheY) || (lignePointBetaX > coinTuileHautGaucheX && lignePointBetaX < coinTuileHautDroiteX && lignePointBetaY > coinTuileHautGaucheY && lignePointBetaY < coinTuileBasGaucheY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileHautGaucheX, coinTuileHautGaucheY, coinTuileHautDroiteX, coinTuileHautDroiteY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileHautDroiteX, coinTuileHautDroiteY, coinTuileBasDroiteX, coinTuileBasDroiteY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileBasGaucheX, coinTuileBasGaucheY, coinTuileBasDroiteX, coinTuileBasDroiteY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileHautGaucheX, coinTuileHautGaucheY, coinTuileBasGaucheX, coinTuileBasGaucheY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	}
    	if(affichage) {
    		// On dessine la ligne !
    	}
    }
    Maintenant, il faut voir ce que ça donne avec beaucoup de lignes ^^

  7. #27
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    • détecter si la ligne commence ou termine depuis la tuile courante
      et si ce n'est pas le cas,
    • détecter si la ligne traverse au minimum un des quatre côtés de la tuile.
    Et ajouter auparavant une optimisation simple pour éliminer rapidement des lignes :
    • détecter si les 2 extémités de la ligne sont au-dessus, en dessous, à droite ou à gauche de la tuile.
      et si ce n'est pas le cas,
    • ...
    • ...

  8. #28
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Pas bête !
    Ça permettrait effectivement d'enlever pas mal de calculs superflus !

    Sinon, je viens d'implémenter les classes :
    • PointGPS(double longitude, double latitude)
    • Ligne(int id, int segment, PointGPS debut, PointGPS fin)

    et la méthode :
    • Point ParsePixel(PointGPS)

    Le tout pour tester l'affichage des lignes, et ça semble fonctionner ^^ (lignes en bleu)


    PS : Je vais suivre ton conseil et ajouter le test "d'éloignement"(j'aime bien le nom) ça devrait me faire gagner quelques ms :°)

    Ça prend cette forme là :

    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
    boolean affichage = false;
    if(!((lignePointAlphaX < coinTuileHautGaucheX && lignePointBetaX < coinTuileHautGaucheX) ||
    (lignePointAlphaY < coinTuileHautGaucheY && lignePointBetaY < coinTuileHautGaucheY) ||
    (lignePointAlphaX > coinTuileBasDroiteX && lignePointBetaX > coinTuileBasDroiteX) ||
    (lignePointAlphaY > coinTuileBasDroiteY && lignePointBetaY > coinTuileBasDroiteY))) {
    	if((lignePointAlphaX > coinTuileHautGaucheX && lignePointAlphaX < coinTuileHautDroiteX && lignePointAlphaY > coinTuileHautGaucheY && lignePointAlphaY < coinTuileBasGaucheY) || (lignePointBetaX > coinTuileHautGaucheX && lignePointBetaX < coinTuileHautDroiteX && lignePointBetaY > coinTuileHautGaucheY && lignePointBetaY < coinTuileBasGaucheY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileHautGaucheX, coinTuileHautGaucheY, coinTuileHautDroiteX, coinTuileHautDroiteY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileHautDroiteX, coinTuileHautDroiteY, coinTuileBasDroiteX, coinTuileBasDroiteY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileBasGaucheX, coinTuileBasGaucheY, coinTuileBasDroiteX, coinTuileBasDroiteY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	} else if(intersectionSegments(coinTuileHautGaucheX, coinTuileHautGaucheY, coinTuileBasGaucheX, coinTuileBasGaucheY, lignePointAlphaX, lignePointAlphaY, lignePointBetaX, lignePointBetaY)) {
    		affichage = true;
    	}
    }

  9. #29
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Icones ?
    Bonjour à tous, j'ai une nouvelle colle pour vous :°)

    Comment à votre avis je pourrai intégrer des icones cliquable au dessus de la carte ?

    Pour moi la seule solution qui me vient à l'esprit, c'est d'avoir un tableau d'objet Icones, de tester si ce tableau n'est pas vide lors des déplacements et si il ne l'est pas afficher les icones de la même manière qu'avec la carte...

    Et pour la détection au MotionEvent.ACTION_DOWN, de parcourir ce tableau et de détecter si la position du doigt est présente sur la surface d'un ou de plusieurs icones... mais ça me semble un peu "lourd" comme solution.

    Qu'en pensez-vous ? vous avez des idées ?

  10. #30
    Membre émérite
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Par défaut
    Bonjour,

    Ton developpement est tres interessant !
    Ou en es-tu ?

    Est-il terminé ?

  11. #31
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 21
    Par défaut Mmm...
    Merci ^^

    J'ai quitté le projet, mais les bases du système était fonctionnelles

  12. #32
    Membre émérite
    Homme Profil pro
    Responsable des études
    Inscrit en
    Février 2010
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2010
    Messages : 553
    Par défaut
    tu as quitte le projet ...

    est-ce que ce projet a continue avec d'autres ? si oui, ou peut on le consulter ?

    aurais tu des applis android a recommander pour de la nav vfr avec fond de carte cartabossy ou ign oaci ?

Discussions similaires

  1. Réponses: 15
    Dernier message: 28/05/2012, 20h11
  2. Réponses: 3
    Dernier message: 22/05/2007, 11h05
  3. création d'une carte au format jpg
    Par TocTocKiéLà? dans le forum C++
    Réponses: 2
    Dernier message: 13/02/2007, 17h28
  4. [SQL] Création d'une nouvelle base
    Par balabonov dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 27/09/2006, 15h14
  5. création d'une carte avec navigation du type mappy
    Par BernardT dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 30/10/2005, 01h24

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