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

Windows Presentation Foundation Discussion :

[WPF & C#] Réalisation d'une carte


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 22
    Par défaut [WPF & C#] Réalisation d'une carte
    Bonjour,

    Je souhaite réaliser en XAML une carte simple a base de lignes comme on peut le voir dans l'image en pièce jointe. Pour la réaliser j'utilise un canvas dans lequel j'ajoute toutes mes PolyLine. L'ensemble contient 15000 points.

    1. Je ne parviens pas a trouver un moyen simple et efficace pour pouvoir zoomer et me déplacer sur la carte (mon canvas). J'avais pensé a uns scrollviewer pour me déplacer mais ca ne résout pas le problème du zoom...

    2. Avec 15000 points la charge CPU deviens important dès que je survole la carte avec la souris par exemple. Comment pourrait on optimiser ca ?

    Merci
    Images attachées Images attachées  

  2. #2
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    Salut,

    Je fais un peu de R&D sur WPF pour une applis cartho ces temps ci.
    Bon je commence à peinne donc pour le zoom je peux pas t'aider.

    Par contre j'utilise les objets Path qui on l'air plus adaptés à un affichage de nombreuse polylignes. Un exemple 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
    Path p = new Path();
                p.Stroke = new SolidColorBrush(Color.FromArgb(255, 0, 0, 255));
                p.StrokeThickness = 1;
                foreach (GisSharpBlog.NetTopologySuite.Geometries.Geometry geom in ListGeom)
                {         
                    m_figure = new PathFigure();
                    m_figure.IsClosed = false;
                    m_figure.IsFilled = false;
                    m_figure.StartPoint = new System.Windows.Point((geom.Coordinates[0].X - miniX) / ratio, (geom.Coordinates[0].Y - miniY) / ratio);
                    for(int i = 1 ; i < geom.Coordinates.Count() ; i++ )
                    {
                        m_figure.Segments.Add(new System.Windows.Media.LineSegment(new System.Windows.Point((geom.Coordinates[i].X - miniX)/ratio, (geom.Coordinates[i].Y - miniY)/ratio), true));
                    }
                    m_listFigures.Add(m_figure);
                }
                PathGeometry pgeom = new PathGeometry(m_listFigures);
                p.Data = pgeom;
                Plan.Children.Add(p);
    miniX et miniY me servent à cadrer le plan, ratio, pour l'échelle. Tout ce qui est NETTopologySuite c'est là que sont stockés mes objets géométriques.

    Niveau perf je met 5 sec à afficher 45 000 polilygnes plus ou moins complexes qui correspondent au réseau routier d'une grande agglomération.

    Pour le fait que le CPU augmente quand tu passes la souris dessus, il faut regarder autourd du "IsFrozen", apparement WPF considère les poly comme modifiable ce qui doit causer cette augmentation du cpu quand on passe dessus.

    J'ai pas trop le temps de mettre le bout de code au propre mais poste si t'as des questions. Pour le zoom je cherche du coté des transformations.

  3. #3
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    Bon j'ai trouvé pour le zoom mais chez moi les perfs sont dégueu (surement toujours ce problème de frozen...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.Windows.Media.ScaleTransform m_transform = new ScaleTransform(zoom, zoom);
                Plan.LayoutTransform = m_transform;
    Plan c'est mon canevas 0.XXXXXX pour dezoom et >1 pour zoomer.

  4. #4
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    Pour l'augmentation de RAM quand on passe la souris sur les poly :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Plan.IsHitTestVisible = false;
    Plan c'est le canvas. J'ai trouvé un article insterressant sur les perf de wpf : http://blogs.msdn.com/wpfsdk/archive...-hardware.aspx

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Pfiou, je vois pas trop ce que je pourrais dire de plus suite à tous ces post de neo

  6. #6
    Membre Expert
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Par défaut
    Passer par un algo de vectorisation pour minimiser les points affiches? (m'en demandez pas plus je n'y connais rien )

  7. #7
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    je vais entreprendre des recherches un peu plus poussés sur les transformations, mais si ça passe pas faudra utiliser Direct 3D.

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    N'oublie pas que WPF s'appuie sur DirectX: Direct3D faisant partie de DirectX, tu utilises Direct3D, peut-être sans le savoir, lorsque tu fais du WPF

  9. #9
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    oui mais c'est une surcouche

    sans le savoir quand on fait du dotnet on utilise de l'assembleur mais les performances sont quand même légèrement différentes

    Plus sérieusement il faut que je trouve un truc pour optimiser mes transformations

  10. #10
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par neo.51 Voir le message
    Plus sérieusement il faut que je trouve un truc pour optimiser mes transformations

    Réponse pas sérieuse:
    Achète toi un octoprocesseur avec 16 Go de RAM, ca devrait plus être lent


    Réponse sérieuse:
    C'est quoi le pb avec tes transformations ?

  11. #11
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    j'applique cette transformation sur un canevas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.Windows.Media.ScaleTransform m_transform = new ScaleTransform(zoom, zoom);
    Plan.RenderTransform = m_transform;
    Pour faire un zoom (c'est le problème initial du topic).

    Le zoom sur mes 45 000 poly manque de fluidité.

    tu peux pas attendre 0,5 sec pour voir la carte quand tu clique pour un zoom...

  12. #12
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Ton Canvas Plan, il prend tout l'écran ? Il serait intéressant de voir si en réduisant la taille de ce Canvas, les perf sont améliorées.


    Car techniquement, il s'agit de quelque chose de possible: si tu regarde Expression Blend, c'est comme cela que fonctionne le zoom (sur un Canas qui ne prend pas tout l'ecran)

  13. #13
    Expert confirmé
    Avatar de neo.51
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    2 663
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 663
    Par défaut
    non la taille ne change rien.

    Le truc c'est que je me demande si WPF n'éssayerait pas de redésinner TOUTES mes poly et pas seulement celles qui restent dans le canvas. J'ai l'impression que c'est plus le dessin que la transformation qui prend du temps.

    Je vais éssayer de vérifier tout ça

Discussions similaires

  1. Réaliser une carte interactive, quel langage simple ?
    Par apal dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 03/03/2022, 17h53
  2. Réponses: 1
    Dernier message: 30/08/2010, 11h40
  3. [XSLT]Projet: réaliser une carte
    Par Wells dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 10/10/2008, 15h38
  4. Comment réaliser une "carte" en 3D?
    Par zuzuu dans le forum Développement 2D, 3D et Jeux
    Réponses: 9
    Dernier message: 15/02/2008, 22h50
  5. Réponses: 6
    Dernier message: 26/06/2006, 13h51

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