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 :

Graphics Drawline resultat bizare


Sujet :

C#

  1. #1
    Membre émérite
    Graphics Drawline resultat bizare
    Bonjour

    Je fais des drawlines sur une image

    Le resultat que j'obtiens est bizare : les traits ressemblent a des longs fuseaux plutot qu'une belle droite (comme une trace d'avion qui s'estompe)

    Quelqu'un a déja eu ce problème ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  2. #2

  3. #3
    Membre émérite
    Merci Smyley

    A l'origine je n'utilisais pas de Smoothing mode
    Ensuite j'avais essayé l'anti-alias

    Dans les deux cas j'ai le meme effet

    Je me demande si ce n'est pas lié a l'usage d'un transformatrix

    Mais si je dessine d'autres objets carré, cercles je n'ai pas de problème

    J'ai constaté que certaines epaisseurs de trait ne posent pas de problème non plus

    A mon avis c'est un probleme d'arrondi dans le rendering lié au transformmatrix et a l'épaisseur de trait
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  4. #4
    Membre émérite
    Voici l'image du résultat !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  5. #5

  6. #6
    Membre émérite
    Salut Smyley

    Je vais preparer aujourd'hui ou demain le bout de code utile
    Avec AUSSI

    1- Les parametres du Transformmatrix (pas evident car il est calculé a la volée)
    2- Quelque coordonées produisant ce bel effet !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  7. #7
    Membre émérite
    Salut Smiley

    Voici un projet minimum que j'ai un peu bricolé pour extraire la partie signifiante de mon GROS projet !


    Bon amusement !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  8. #8
    Expert éminent
    Pourquoi ton pen ne fait que 0.00....04f ? enfin, j'ai vu un zoom après (mais je t'accorde, j'ai pas eu envie de chercher à comprendre )
    Pour l'instant j'ai vu qu'on pouvais tricher comme ceci :
    Code c# :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Pen MyPen = new Pen(Color.DarkOrchid, 0.0004f);
     
            int k = 0;
            for (int i = 0; i < pA.Length; i++)
            {
              k = (i + 1);
              if (k >= pA.Length) k = 0;
              gPolAndPoi.DrawLine(MyPen, pA[k], pA[i]);
              gPolAndPoi.DrawLine(MyPen, pA[i], pA[k]);
            }

  9. #9
    Membre émérite
    Salut Smiley

    J'avais déja essayé cete tricherie c'est d'aileurs pour cela qu'il y a une boucle, sinon Drawlines est plus efficace

    0.0004 c'est en raison de la matrice de transformation (qui a mon avis doit etre a l'origine du problème)


    Mais si tu met 0.0001 l'effet disparait presque
    0.0005, il est moins accentué

    C'est donc vraiment amusant !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  10. #10
    Expert éminent
    Citation Envoyé par olibara Voir le message

    J'avais déja essayé cete tricherie c'est d'aileurs pour cela qu'il y a une boucle, sinon Drawlines est plus efficace
    Mais au moins là ça marche, tu n'as plus tes trucs bizarres.

    Citation Envoyé par olibara Voir le message

    0.0004 c'est en raison de la matrice de transformation (qui a mon avis doit etre a l'origine du problème)
    Mais pourquoi tu ne fais pas tes matrices pour partir de la largeur 1 ?(comme tout le monde )

  11. #11
    Membre émérite
    Salut Smyley

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Mais au moins là ça marche, tu n'as plus tes trucs bizarres


    Généralement si je découvre une fuite, je prefere intervenir à l'origine plutot que de mettre des seaux en dessous et oublier le problème


    Si j'utilise une matrice de transformation c'est pour pouvoir aficher mes coordonéés géographiques originales dans la proportion de l'ecran.

    L'effet secondaire de cette matrice c'est ue les épaisseurs de trait suivent la meme transformation

    Mais si "tout le monde" fait autrement, "personne" ne m'a encore dit comment !
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  12. #12
    Expert éminent
    Citation Envoyé par olibara Voir le message
    Généralement si je découvre une fuite, je prefere intervenir à l'origine plutot que de mettre des seaux en dessous et oublier le problème
    En fait, pour faire plus sérieux, il y a des fois où c'est un bug ou une limitation du système utilisé. GDI+ n'est pas ce qu'il y a de mieux en matière de dessin et par exemple tu pourrai avoir des choses bien plus belles, performantes et pratiques si tu refaisait la même chose en utilisant WPF (qui intègre notamment des contrôles de zoom sans avoir besoin de jouer avec des Matrix bizarres).

    Citation Envoyé par olibara Voir le message

    Si j'utilise une matrice de transformation c'est pour pouvoir aficher mes coordonéés géographiques originales dans la proportion de l'ecran.
    La chose à laquelle j'aurai pensé serai justement de créer une image "taille réelle" et ensuite la réduire pour qu'elle tienne dans l'affichage. Là j'ai l'impression que tu fais le contraire et peut être que le Pen n'aime pas faire des traits aussi petits, donc faudrait voir si la même chose avec un Pen de 1 et un rétrécissement de l'image obtenu fait le même problème.

  13. #13
    Membre émérite
    La chose à laquelle j'aurai pensé serai justement de créer une image "taille réelle" et ensuite la réduire pour qu'elle tienne dans l'affichage. Là j'ai l'impression que tu fais le contraire et peut être que le Pen n'aime pas faire des traits aussi petits, donc faudrait voir si la même chose avec un Pen de 1 et un rétrécissement de l'image obtenu fait le même problème.


    Je pense qu'il y a un probleme de compréhension dans l'usage d'une matrice !!

    La taille réelle, c'est par exemple la ville de Paris !!

    Ce que tu propose ici ne peut evidement pas s'appliquer !!
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  14. #14
    Expert éminent
    GRRR.

    Je parle pas de mettre Paris en bouteille (ça serait relativement complexe) mais regarde :
    Code c# :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
     
    private void SetTransformMatrixFloat()
        {
     
          double offset_x = -2.5926395f;
          double offset_y = 51.1424498f;
     
          float offset_Xf = (float)offset_x;
          float offset_Yf = (float)offset_y;
          float scale_f = (float)10471.2041884817f;
     
          Matrix m = new Matrix(1.0f,
                                0.0f,
                                0.0f,
                                -1.0f,
                                0.0f,
                                0.0f);
     
          m.Translate(offset_Xf, offset_Yf, MatrixOrder.Append);
          m.Scale(scale_f, scale_f, MatrixOrder.Append);
          _transformF = m;
        }


    Donc tu fais un scale de 10471.2041884817f pour obtenir une image qui fait une certaine taille. Mais à l'inverse tu pourrai essayer de faire une image plus grande (correspondant à ce scale) et ensuite la réduire.
    Ou alors, tu met la ville de paris à l'échelle et ensuite tu trace tes traits directement en taille 1 sur l'image obtenue (et non pas avant le scale, ou du moins, tu scale les coordonnées, pas l'image, de manière à garder des traits de 1 (voir plus, mais pas moins)).
    Mais plus ça va, plus je me dit que c'est affreux. Tu es obligé d'utiliser le fw 2.0 (pas le 3.0 ? )

  15. #15
    Membre émérite
    Salut Smyley

    J'utilise le FW 3.5

    Bon effectivement avant d'utiliser le transformmatrix je m'amusais moi meme a calculer les offset, le ratio etc et puis dessiner

    Ca marche aussi et dans ce cas comme le draw est libre de toute transformation implicite, je n'ai pas de probleme

    Par contre le code il prends un coup !

    Donc la question n'est pas comment bricoler pour eviter le probleme mais comprendre s'il est possible de l'éviter proprement tout en utilisant la matrice de transformation !

    Ou accessoirement est il possible dans une matrice de transformation de dissocier les epaisseur de brush pen etc des coordonées de tracé ?
    « Ils ne savaient pas que c'était impossible, alors ils l'ont fait ». (Twain)

  16. #16
    Expert éminent
    Là je sais pas, dès que j'ai eu besoin de faire des tracés un peut plus évolués que des gradient et rectangles arrondis, je suis passé à WPF (et c'est beaucoup mieux ...)

###raw>template_hook.ano_emploi###