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 Forms Discussion :

Usage GDI questions et dans quel forum


Sujet :

Windows Forms

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Usage GDI questions et dans quel forum
    Bonjour

    Préliminaire :
    Quel est le meilleurs forum pour poster des question concernant GDI ?
    Dans mon cas je developpe en C# mais je suppose qu'un concept GDI peut aussi bien s'appliquer uµen VB qu'en C# ou autr

    Question Pratique
    Je souhaite dessiner en 2D des routes et leur donner un contour
    La methode la plus triviale est de faire deux passes : une premiere passe avec un gros pen foncé une deuxieme passe avec un pen de la couleur voulue un peu moins gros.

    Il y a-t-il d'autres methodes ?
    Associer un pattern au pen ?

    La methode decrite fais evidement des saletée aux intersections !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Si tu dessines "l'intérieur" d'un segment de la route juste après avoir dessiné le contour, effectivement ça doit poser problème aux intersections. Par contre, si tu dessines tous les contours puis tout l'intérieur ça devrait le faire. Non ?

  3. #3
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Héhé !

    Facile a dire !!
    Tu as déja fais ce genre de chose ?
    La complexité me semble vachement plus complexe pour ne pas dire complexe au carré
    A moins que tu connaisse un tour de guru pour faire ca !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    en utilisant un GraphicsPath, ça doit pas être trop dur, si ? Tu définis un GraphicsPath avec les segments de la route, et tu le dessines 2 fois avec 2 Pens différents.

  5. #5
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Bonjour,

    Si je te comprends bien, tu me suggere d'utiliser ma technique originale mais sur un graphic path ?

    Prenons un cas simple que je peux illustrer grace a google (voir attaché)

    Oublions les noms des routes oublions que les epaisseurs ne sont pas pazrtout les meme mais gardons la route jaune et les routes blanche

    Comment pense tu gerer le path ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  6. #6
    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
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    Je ne vois pas ce que tu entends par gérer le path...

    La classe GraphicPaths te permet de dessiner... l'interêt étant ensuite d'appliquer le même Pen, ou brush à ce graphicPaths... et en plus de s'en servir pour définir les régions associés, etc...

    Dans le cas de ta route, si il s'agit du problème des intersections qui te pose soucis, ce n'est pas le GraphicsPath qui doit s'en occuper mais toi, lorsque tu définis les points à relier pour ajouter des lignes par exemple.

    Pour moi, si tu as 2 routes, ou plus, il te faut calculer les points d'intersections de ces routes. Cela n'est pas vraiment compliqué. Equation de 2 droites et points d'intersection de ces 2 droites, c du niveau 4ième (même si c'est loin pour moi , ca se fait plutot simplement

    J'ai du résoudre une problématique "proche" de cela.. Dans un outil d'architecture, je dois construire des murs.. bien sur, je n'ai que les points d'ancrage du mur.. il a donc fallu en construire le "contour" et ensuite faire les intersections pour avoir une "jointure" jolie et non un recouvrement des rectangles "englobant" ma ligne. Avec les équations de droites, cela s'est fait sans soucis...

    Pour moi, la plupart des problèmes de dessin sont des problématiques mathématiques et non des problématiques informatiques

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par olibara Voir le message
    Bonjour,

    Si je te comprends bien, tu me suggere d'utiliser ma technique originale mais sur un graphic path ?

    Prenons un cas simple que je peux illustrer grace a google (voir attaché)

    Oublions les noms des routes oublions que les epaisseurs ne sont pas pazrtout les meme mais gardons la route jaune et les routes blanche

    Comment pense tu gerer le path ?
    Mouais, c'est vrai qu'en voyant une image, ça parait moins simple... Mais avec la méthode de theMonz31 tu devrais t'en sortir

  8. #8
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut TomLev et theMonz

    Effectivement Tomlev tu vois que ce n'est pas évident

    D'accord avec theMonz il est evident que je peux resoudre cela en calcul mathematique

    Tout l'art est de trouver la methode la plus performante pour ne pas faire un monstre de calcul en temps réel derriere le dessin !

    Cela étant si l'on analyse les cartes de Googles je pense que les images ont été "precalculée" en prenant le temps qu'il faut et que ce que l'on voit est un assemblage d'image en "tuiles" puisée dans une base de donnée précalculée
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  9. #9
    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
    Points : 5 195
    Points
    5 195
    Par défaut
    salut

    Une chose est sur, il ne faut pas faire "X fois" le même calcul...

    donc, une fois que tu as généré l'image correspondant à ce que tu veux afficher, tu ne recalculeras cette image uniquement si le besoin s'en fait ressentir et encore, c'est pas sur si tu gères plusieurs couches sur ton dessin

    (une couche route, une couche décor, une couche info, etc...)

    The Monz, Toulouse
    The Monz, Toulouse
    Expertise dans la logistique et le développement pour
    plateforme .Net (Windows, Windows CE, Android)

  10. #10
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    J'avais un peu laissé dormir ce truc et on vient de me souffler une idée qui est peut etre la plus simple et la plus performante

    Plutot que de se lancer dans des calculs complexe l'idée serait de parcourir le bitmap et a chaque transition de couleur entre la couleur de fond et une autre couleur qui appartient forcément au tracé, on ajoute un pixel

    Voila pour le principe qui me parait séduisant

    Mais pour la mise en oeuvre, je ne suis nulle part

    GDI+ cSharp permet-il ces choses ?

    Ou dois-je travailler a un niveau plus bas en apellant les fonctions natives ?

    Toute suggestion est bienvenue .
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    tu peux tout à fait le faire en C#, en utilisant les fonctions GetPixel/SetPixel de la classe Bitmap

  12. #12
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut Tomlev


    A mon avis un getpixel et un setpixel sur une image de 1200 x 800 risque d'etre un peu fastidieux

    Je pense plutot acceder l'image directement en utilisant un autre exemple que j'ai trouvé

    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
    int width = bitmap.Width;
    int height = bitmap.Height;
     
    unsafe 
    {
        BitmapData bmpData = bitmap.LockBits(new Rectangle(0, 0, width,
        height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
        uint* newPixel = (uint*)(void*)bmpData.Scan0;
        for (int y = 0; y < height; y++)
            for (int x = 0; x < width; x++)
            {
                newPixel[0] = (uint)((newPixel[0] & 0x000000ff) |
                (newPixel[0] & 0x0000ff00) << 8 | (newPixel[0] & 0x00ff0000) >> 8 |
                (newPixel[0] & 0xff000000));
                newPixel++;
            }
        bitmap.UnlockBits(bmpData);
    }
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    effectivement c'est beaucoup plus efficace...

  14. #14
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Je suis habitué au C et ce qui me trouble dans l'exemple c'est l'usage de

    Alors que newPixel est déclaré comme pointeur sur uint

    Ne peut on pas directement faire comme en C ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  15. #15
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    en principe ça doit marcher aussi... les 2 écritures sont équivalentes de toutes façons

  16. #16
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Mais je serais curieux de voir le code généré

    J'ai peur qu'en faisant

    newPixel[0] : le compilateur genere par derriere un calcul d'offset

    Tandis que pour

    *newPixel : il assume de recevoir la bonne adresse

    Sauf s'il est tres malin et qu'il comprends que pour [0] il ne doit rien faire parce que c'est 0 et que c'est une constante !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  17. #17
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Tu peux toujours regarder le code MSIL généré, avec ILDASM ou Reflector
    Mais à mon avis ça revient au même, le compilo est relativement malin en général...

  18. #18
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci pour cette suggestion

    J'irai certainement voir quand j'ai 10 minute a consacrer a ma curiosité
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  19. #19
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    88
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 88
    Points : 99
    Points
    99
    Par défaut
    Salut,

    J'ai attentivement les différents poste du topic.
    La solution du graphicPath est de loin la meilleur.
    Elle n'est pas si dure à mettre en oeuvre.
    Cependant, je ne dessinerais pas les routes, mais les zones entre les routes.

    Si tu sais définir l'ensemble de tes points d'intersection (de tes routes), il est facile, avec la méthode FillPolygon et DrawPolygon(pour les contour) de Graphics, de dessiner se que tu désire.

    J'eserai de te faire parvenir le code dés que possible.

  20. #20
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Salut

    Salut
    Merci pour ta suggestion
    Mais je ne suis pas vraiment convaincu ...

    Car :

    Je ne dispose que d'une liste de Line formés de deux ou plusieurs point
    Identifier les points d'intersection et en deduire les polygones est déja une operation lourde

    Si on y ajoute la nécessité de colorier les routes par type et leur donner une epaisseur différentes, ca devient tres bazar

    Pour le moment, il me semble toujours que de tracer les routes sur un fond neutre puis parcourir l'image en raw pour inserer des pixels lors des transition fond / couleur n'est peut etre pas géométriquement le plus pur mais sans doute le plus simple et efficace !!! ???
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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