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

SIG : Système d'information Géographique Discussion :

[Info] Quelle API graphique pour une "carte habitée"


Sujet :

SIG : Système d'information Géographique

  1. #1
    loz
    loz est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut [Info] Quelle API graphique pour une "carte habitée"
    Bonjour à tous,
    Je suis en train de développer une appli qui représente une carte.
    Il y a donc :
    • un fond de carte (une image probablement plus grande que la fenêtre)
      des véhicules (images ou formes géométriques peu importe)
      Les véhicules se déplacent au pixel près (il faut donc un système de coordonnées lié au fond de carte, et la possibilité d'orienter le véhicule)

    L'appli doit être portable et la plus standard possible.
    Les perfs sont moyennement importante (j'envisage un portage sur pda, mais j'aurais peu de véhicules et un rafraîchissement par seconde me semble amplement suffisant).
    Il y aura peu d'interaction utilisateur, c'est surtout pour visualiser.

    J'ai bien entendu fouiné java.sun, google et developpez.com, mais je suis pas expert en java et j'ai rien trouvé de très excitant sur mon problème.
    J'étais parti sur un JscrollPane qui contient un Canvas et je pensais dessiner avec du Graphic2D, mais tout ça est bien compliqué pour un problème qui me semble relativement simple.

    Bref toute piste sera bienvenue !

    [ Modéré par Bulbo ]
    Ajout d'un tag dans le titre
    Les Règles du Forum

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    Et une JTable ?
    il y a un système de coordonnées, laffichage des vehicules sera aisée via les tablecellrenderers, etc.

  3. #3
    loz
    loz est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Et avoir des cellules de la taille d'un véhicule ?

    Dans ce cas c'est pas jouable parce que je pensais positionner le véhicule au pixel près, et pouvoir changer facilement la représentation du véhicule.
    Et de quel type seraient les véhicules, et comment les orienter ?

    Merci de la suggestion.

    PS j'essaye de préciser un peu mon premier post...

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    Je vois pas trop le problème : dans ton renderer, pour une case donnée, tu auras juste à créer l'image représentant ton véhicule, puis renvoyer cette image et le tour est joué !

  5. #5
    loz
    loz est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Soit j'ai pas compris ce que tu me dis, soit j'ai pas compris comment marchait une JTable (j'en ai jamais utilisé, juste lu la doc), soit j'ai pas décrit clairement mon problème.

    Je ne comprends toujours pas à quoi corresponds une case de ta JTable. A un pixel de ma carte ?
    Le véhicule, je le dessine à la volée (vectoriellement) ou je colle une image gif (ou autre) ? Si c'est bien un gif, comment je fais pour l'orienter (par exemple 27° à droite du Nord) ?

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    Une JTable est composée d'un tableau quelconque de lignes et de colonnes.
    Tu peux définir le "rendu" de chacune de tes cellules.

    Donc si tu as une image de ton véhicule ( créé par tes soins en Java ou un fichier gif ), tu la fais pivoter selon tes besoins, et tu l'appliques sur le rendu. Et hop un joli véhicule de 45 degrés sur la droite !

    De plus tu peux définir la taille des lignes et des colonnes ( en pixels :-) ).

    Sans compter qu'avec deux variables VEHICULE_ROW et VEHICULE_COLUMN, tu sais exactement ou tu es sur la table, cad ton paysage, et ainsi savoir si le vehicule peut encore monter, descendre ...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Et un JPanel avec une image de fond et un layout null.
    Tes voitures serait des JLabel avec une texture de voiture (que tu pourras changer comme tu veux).
    Ensuite tu peux placer autant de voiture que tu veux au pixel près sur le JPanel.
    Reste le probleme de l'orientation de la voiture. Ca pourrait etre réglé en faisant une rotation du composant graphique avant d'appliquer la texture.
    Mess with the best, die like the rest!

  8. #8
    loz
    loz est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Je vais peut-être passer pour un boulet, mais j'ai jamais développé d'interface non triviale en java.

    Je ne comprends donc toujours pas à quel moment (ou plutôt à quel niveau) je suis censé pouvoir faire la rotation. Aucune des classes que j'ai croisées n'a de méthode pour ça. Il y a donc un "détail" essentiel qui m'échappe...

    Pareil pour l'image de fond du JPanel, la classe Jpanel ne le prévoit pas, ça veut dire que j'ajoute quel type d'objet à mon JPanel ?

    J'ai l'impression qu'il me manque à la fois une vue synthétique et des détails...
    M'enfin merci beaucoup de m'aider !

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 137
    Points : 143
    Points
    143
    Par défaut
    Il va falloir potasser qques classes, en particulier BufferedImage :

    http://javaalmanac.com/egs/java.awt....Image2Buf.html

    http://javaalmanac.com/egs/java.awt....age.html?l=rel

    Amuse toi bien

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Quelle API graphique pour une "carte habitée" ?
    Mais Java 2D tout simplement.

    Hum je ne vois pas tres bien l'interet d'utiliser une JTable ou alors j'ai rate qq chose. Si chaque pixel de l'image va devenir une cellule de la table j'ose pas imaginer le bordel que ca fait... en plus de la perte memoire inutile pour le table model, la table elle-meme, les renderers...

    Un panel contenant une BufferedImage ou une VolatileImage serait probablement la meilleure chose quoique optionnelle. Pour tes voitures pourquoi mais pourquoi vouloir utiliser des JLabel quand on peut faire simple ??? Alors que tu peux facilement composer tes sprites sur ton image finale agec un graphics.drawImage().

    Quand aux rotation des sprites ben ca peut se faire facilement avec AffineTransform.getRotateInstance() ou Graphics2D.rotate() (ne pas oublier de faire une rotation inverse apres).
    Voici un petit squelette pour ton programme code vite fait :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    class Car {
      Point pos = new Point();
      double angle = 0;
      BufferedImage sprite = ...
      ...
    }
    
    class MapPanel extends JPanel {
      public static enum RenderMethod {
        OFFSCREEN_RENDERING, ACTIVE_RENDERING
      }
    
      private RenderMetod renderMethod = OFFSCREEN_RENDERING;
    
      private BufferedImage offscreenImage;
      private BufferedImage sourceMap = ...
      private java.util.List<Car> carList = ...
    
    ...
      // Reaction quand les voitures se deplacent et qu'il faut redessiner la map mise-a-jour.
      if (modified) {
        // Dans cette methode l'image est rendue en dehors de la periode de re-dessin. Ceci peut-etre eventuellement gere dans une thread a part.
        if (renderingMethod == OFFSCREEN_RENDERING) {
          // Creer l'image offscreen si necessaire.
          if (offscreeImage == null) {
            // Verifier si besoin de creer une image transparente.
            offscreenImage = new BufferedImage(sourceMap.getWidth(), sourceMap.getHeight(), BufferedImage.TYPE_INT_RGB);
          }
          Graphics2D g2d = offscreenImage.createGraphics();
          try {
             drawContent(g2d, offscreenImage.getWidth(), offscreenImage.getHeight());
          }
          finally {
            g2d.dispose();
          }
        }
        repaint();
      }
    ...
    
      protected void paintComponent(Graphics g) {
        // Pas la peine d'appeler super.paintComponent si le panel n'a pas de bords et que l'image/map couvre toute la surface du panel et n'est pas transparente).
        if (renderingMethod == OFFSCREEN_RENDERING) {
          if (offscreenImage != null) {
            graphics.drawImage(offscreenImage, 0, 0, null);
          }
        }
        else {
          Insets insets = getInsets();
          Dimension size = getSize();
          int width = size.widht-(insets.left+insets.right);
          int height = size.height-(insets.top+insets.bottom);
          Graphics2D g2d = (Graphics2D) g.create(insets.left, insets.top, width, height);
          try {
            drawContent(g2d, width, height);
          }
          finally {
            g2d.dispose();
          }
        }
      }
    
      private void drawContent(Graphics2D graphics, int width, int height) {    
        graphics.drawImage(sourceMap, 0, 0, null);
        ...
        for (Car car : carList) {
          // Dans le cas ou il y a plusieurs threads (nottement une qui deplace les voitures) penser a cacher les valeurs (car.pos.x, ...) localement dans des variables.
          graphics.translate(car.pos.x, car.pos.y);
          graphics.rotate(car.angle);
          // On dessine la voiture "autour" du point.
          graphics.drawImage(car.sprite, -car.sprite.getWidth()/2, -car.sprite.getHeight()/2, null);
          graphics.rotate(-car.angle);
          graphics.translate(-car.pos.x, -car.pos.y);
        }
        ...
      }
    }
    Par contre au niveau perfs je te conseille fortement mais fortement de te pre-generer les sprites de tes voitures "rotationnes" a certains angles fixes (ex: tous les 15 degres) pour eviter d'abuser des rotations pendant le rendu en cours d'execution du programme (si tu as beaucoup de voitures ou alors si tu veux un rendu actif tres rapide). Tu peux soit les pre-dessiner dans une grosse bitmap qui sera chargee et pre-decoupee en petit sprites, soit les pre-generer une bonne fois pour toute au demarrage du programme a partir d'un sprite de base (ex: voiture a l'horizontale dirigee vers la droite).

    Pour plus d'infos sur Java2D en general et la programmation de jeux ou d'app 2D en particulier (car ce que tu decrit, qui ressemble fortement a un positionneur style GPS) voir http://192.18.37.44/forums/index.php et plus specifiquement dans le forum Java2D.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 390
    Points : 432
    Points
    432
    Par défaut
    Il y a pas mal d'interet à utiliser des JLabel (ou un autre composant si tu as une preferance) pour représenter les voitures.

    - Ca facilite le codage (enfin je trouve) : tu écris une classe qui hérite de JPanel et qui gere tout le composant (taille, dessin, position, angle, ...). Apres tu n as plus qu'a l'instancié et l'insérer dans le JPanel. Je ne vois pas ce qu il y a de compliqué à ca. Conceptuellement je trouve ca plus interessant qu'une simple image que tu vas dessiner. Quant à la rotation, pour répondre à ta question, elle s'effectue dans la méthode paint du composant, sur l'objet Graphics de la méthode (c'est cet objet qui gère l'affichage du composant).

    - Ensuite le fait d'utiliser un tel composant te permet de définir des actions dessus. Si par exemple tu veux pouvoir éditer une voiture en cliquant dessus (on ne sait jamais ca peut etre une option actuel ou à venir du programme) ou bien la déplacer à la souris, il te suffit d'appliquer le Listener adequat sur le composant. Ca laisse donc un plus large choix d'interaction avec ton application. Alors que si tu ne fait qu'afficher une image a un endroit donné, tu ne peux pas le faire.


    Après tout dépend de ce que tu attend de ton application.
    Mess with the best, die like the rest!

  12. #12
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Justement quel est l'intérêt alors qu'un listemer unique dans le panel chargé d'afficher la map peut faire exactement la même chose plutôt qu'une miriade de labels avec chacun un ou plusieurs listeners associés ?

    Certes il se peut que dans son cas particulier ce soit une bonne solution (à près tout lui-seul connait les détails et besoins de son appli).
    J'espère cependant ne jamais voir un jeu/positionneur utilisant cette méthode : c'est une mauvaise idée en terme de performances et cela montre une profonde méconnaissance des capacités 2D de la plateforme Java.

    MAIS ceci dit même dans le canvas/squelette que j'ai donné il est possible d'utiliser des panels pour effectuer le rendu. Faut juste créer une interface CarSprite dont l'une des implémentations concrètre serait... un JLabel. Après le code reste sensiblement le même ; penser à remplacer graphics.drawImage(car.sprite... par CarSprite.paint(graphics) qui dans l'implémentation concrête appelle le paintComponent(graphics) du JLabel.
    Après tout les JList, JTables, JTree, ... utilisent eux-aussi des composant en tant que renderer.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  13. #13
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Voir la démo /demo/jfc/Java2D/Java2Demo.jar fournie avec le JDK pour ce que l'on peut faire avec Java2D.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  14. #14
    loz
    loz est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ai été pris ailleurs, je vous tiendrai au courant du projet...

  15. #15
    Membre émérite
    Avatar de supersnail
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 719
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 719
    Points : 2 793
    Points
    2 793
    Par défaut
    Effectivement,je rejoins l'avis de bouye ,c'est beaucoup plus lourd de créer un label (les O.S considèrent ça comme une fenêtre) que de simplement dessiner une image à l'écran...
    D'accord,c'est plus facile à déplacer avec un JLabel mais cette manière de coder n'est pas très élégante
    Toute question technique envoyée en MP ira directement à la poubelle

    Un code ne marchera jamais, il n'a jamais reçu la capacité de se déplacer.
    Inutile donc de dire "ça marche pas", donnez plutôt des informations précises afin de mieux pouvoir vous aider.


    Grand gourou de la -attitude

  16. #16
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Citation Envoyé par supersnail Voir le message
    'est beaucoup plus lourd de créer un label (les O.S considèrent ça comme une fenêtre)
    C'est lourd, OK, à ce point de loin pas, juste pour rappeler, Swing est une librairie lightweight où tous les composants sont dessinés via Java2D sur un élément graphique unique de l'os hôte (un classe héritant de Window)

    Donc non, un JLabel n'est pas une fenêtre.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  17. #17
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Tiens a ce propose, 2 ans plus tards, je me met actuellement a OpenMap pour faire du GIS (parceque bon... GeoTools je n'en suis pas encore arrive au point ou ca marche...). Pour ses calques OpenMap utilise un composant qui est est se comporte de maniere similaire a un JLayeredPane et les differents calques qu'on peut rajouter pardessus sont d'autres JComponent. Et ca marche plutot bien et c'est assez performant (mais bon ca n'empeche pas qu'ils ont du faire des optimisations dans leur gestion des calques pour justement atteindre ces performances).
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

Discussions similaires

  1. Quelle API utiliser pour une appli client/serveur ?
    Par ManusDei dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 2
    Dernier message: 14/10/2010, 08h00
  2. Quelle taille choisir pour une carte Google Maps sur site mobile?
    Par Adélaide dans le forum Webdesign & Ergonomie
    Réponses: 2
    Dernier message: 30/04/2010, 09h34
  3. 2 cartes graphiques pour une carte mère
    Par SteelBox dans le forum Composants
    Réponses: 19
    Dernier message: 02/08/2005, 12h09
  4. Réponses: 4
    Dernier message: 05/06/2005, 14h05

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