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 :

Dessiner une "carte"


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Par défaut Dessiner une "carte"
    Salut,

    je bosse en ce moment sur un projet qui à pour but final d'afficher une carte en 2D/3D d'un univers.

    Pour le moment j'essaye de reproduire une map 2D pour comprendre les méthode d'affichage et l'interprétation des données.
    Le rendu "test" souhaité :







    Les données :
    Je récupère les coordonnées via une base de données, les champs X,Y de type DOUBLE.

    - exemple :
    X= -8.85107925999806e+016
    Y= 4.23694439668789e+016


    Mon problème :
    Je ne sais pas par où commencer et comment interpréter ces données pour les dessiner. J'ai donc essayer simplement avec les méthodes Draw, DrawLine, DrawImageUnscaled tiré d'une classe trouvée sur le net :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Drawing;
     
    namespace EveMapD
    {
        class Plot
        {
            //class to plot x and y values on a form
            //
            //because on the form coordinates start at the upper left corner with 0,0
            //with the y coordinate going down, a little transformation is done here
            //so that x,y coordinates act as normal carthesian coordinates, with 0,0
            //in the center of the form
     
            struct PlotPort
            {
                public int minX;
                public int maxX;
                public int minY;
                public int maxY;
            };
     
            private PlotPort _PlotW;    //"window" of carthesian coordinates
            private Size _ClientArea;   //keeps the pixels info
            private double _Xspan;
            private double _Yspan;
     
            public Plot() { }
     
            public Plot(Size Plotarea)
            {
                _ClientArea = Plotarea;
            }
     
            public Size ClientArea { set { _ClientArea = value; } }
     
            public void SetPlotPort(int minx, int maxx, int miny, int maxy)
            {
                //set the bounderies of the form(screen) to real coordinates.
                _PlotW.minX = minx;
                _PlotW.maxX = maxx;
                _PlotW.minY = miny;
                _PlotW.maxY = maxy;
                _Xspan = _PlotW.maxX - _PlotW.minX;
                _Yspan = _PlotW.maxY - _PlotW.minY;
            }
     
            public void PlotPixel(double X, double Y, Color C, Graphics G)
            {
                //workhorse of this class
                Bitmap bm = new Bitmap(1, 1);
                bm.SetPixel(0, 0, C);
                G.DrawImageUnscaled(bm, Convert.ToInt32(TX(X)), Convert.ToInt32(TY(Y)));
            }
     
            private double TX(double X) //transform real coordinates to pixels for the X-axis
            {
                double w;
                w = _ClientArea.Width / _Xspan * X + _ClientArea.Width / 2;
                //return Convert.ToInt32(w);
                return w;  
            }
     
            private double TY(double Y) //transform real coordinates to pixels for the Y-axis
            {
                double w;
                w = _ClientArea.Height / _Yspan * Y + _ClientArea.Height / 2;
     
                //return Convert.ToInt32(w);
                return w;
            }
        }
    }
    Un soucis survient lors de l'utilisation de la fonction PlotPixel() et des valeurs récupérées dans la base de données passées en paramètres (nombre trop grand pour int).

    Comment puis-je m'y prendre ? je suis preneur de toute autre solution et je suis conscient que cette classe n'est pas forcément adaptée (maybe..).

    Merci pour vos futur réponse, j'espère avoir été clair, je suis sur que comme d'habitude, ça ne doit pas être si compliqué que ça..

  2. #2
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    salut

    si tu as une liste de segments, il te faut utiliser la fonction DrawLine ou DrawLines de la class Graphics... et le tout sera facilement finalisé

    Après, pour faire de la 3D, il te faudra utiliser des algo type delaunay pour transformer un contour en surface à base de triangle car en 3D, tout n'est que triangle


    Je t'invite à recherche sur le net avec les mots clés suivants:

    "C# delaunay"... et tu trouveras quelques liens utiles et meme une classe en C# qui implémente cet algorithme puissant et fort utile en 3D.

  3. #3
    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
    Un soucis survient lors de l'utilisation de la fonction PlotPixel() et des valeurs récupérées dans la base de données passées en paramètres (nombre trop grand pour int).
    Remplace cette fonction par un G.DrawRectangle(new Rectangle(x,y,1,1)) ou bien peut-être par G.DrawRectangle(new Rectangle(x,y,2,2)) - je me souviens plus bien -.

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 2
    Par défaut
    En fait je n'ai pas de problème avec les algos à utiliser. Je n'arrive tout simplement pas à comprendre comment passer les valeurs récupérées en paramètres à une fonction et dessiner les 2 points "x, y".

    Je sais dessiner avec les fonctions classiques, faire 2 points n'est pas un problème avec des données du genre x=10 et y=10.

    Je met une séquence de coordonnées d'origine, peut-être que quelqu'un saura comment faire, j'aurai juste besoin d'un exemple très basique ou d'une explication précise, thanks :

    type: DOUBLE

    #1: X= -8.85107925999806e+016; Y= 4.23694439668789e+016;
    #2: X= -1.03300968263126e+017 ; Y= 4.17075035682699e+016
    #3: X= -9.11741411330753e+016 ; Y= 4.39382274862472e+016
    #4: X= -9.36759263521789e+016 ; Y= 5.06042449623289e+016

    il y aussi les champ xmin,xmax et ymin et ymax mais je pense qu'il ne servent, si oui je peux les poster.


    merci encore.

  5. #5
    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
    Soit minX, minY, maxX et MaxY = valeurs min et max des coordonnées X,Y des points
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int Margin=20 ; // pour ne pas mettre les points extremes juste sur le bord
    Double h=Convert.ToDouble(PictureBox.Height-2*margin);
    Double w=Convert.ToDouble(PictureBox.Width-2*margin);
    Double PixelsPerUnit = Math.Min(w/(maxX-minX),h/(maxY-minY)) ;
    ...
    G.DrawLine(new Pen(Color.Black,2),CoordToPixel(X1,Y1),CoordToPixel(X2,Y2)) ;
     
    internal Point CoordToPixel(Double X,Double Y) 
    { return new Point(Margin+Convert.ToInt32((X-minX)*PixelsPerUnit),
                       Margin+Convert.ToInt32((Y-minY)*PixelsPerUnit)) ; }

Discussions similaires

  1. Dessiner une carte
    Par Goundy dans le forum Langage
    Réponses: 19
    Dernier message: 10/10/2005, 14h31
  2. Réponses: 5
    Dernier message: 15/04/2005, 14h22

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