none
Problème (Bug?) sur la fonction GraphicsPath.IsVisible RRS feed

  • Question

  • Bonjour,

    J'ai un problème avec la fonction GraphicsPath.IsVisible, elle ne donne pas le bon résultat si le GraphicsPath contient un rectangle de largeur négative. Voici un code très simple qui démonstre ce comportement (en C++/Cli) :

    Void Test()
    		{
    			using namespace System::Drawing;
    			using namespace System::Drawing::Drawing2D;
    
    			GraphicsPath ^ hGrPath = gcnew GraphicsPath();
    
    			Rectangle mRec(500,200,-200,100);
    
    			hGrPath->AddRectangle(mRec);
    			Point mPoint(400,250);
    
    			Boolean resultat = hGrPath->IsVisible(mPoint);
    		}
    

    Le rectangle doit contenir le point (400,250) car (300 < 400 < 500) et (200 < 250 < 300) mais IsVisible renvoie False.  Pourquoi ce comportement ?

     

     

     

     

    mercredi 9 novembre 2011 15:53

Réponses

  • Bonjour,

    bien que la documentation précise que la hauteur et la largeur peuvent être négative, si vous dessinez le rectangle sur une Form celui-ci n'apparait pas.

    Quand on regarde les propriétés Bottom et Top du rectangle obtenu avec mRec(500,200,-200,100) on voit Bottom = 300 et Top = 200.

    Dans la documentation de IsVisible, on peut lire : The coordinates of the point to be tested are given in world coordinates. The transform matrix of graphics is temporarily applied before testing for visibility.

    Au final ceci pourrait "peut être" expliquer que le rectangle ne s'affiche pas et donc que les méthodes IsVisible ou Contains retourne false.

    PAr contre si vous tracez le rectancle suivant mRec(300,200,200,100) (qui devrait etre identique à mRec(500,200,-200,100) ) cette fois IsVisible retrourne Vrai.

    Cordialement

    • Marqué comme réponse Dark seiya jeudi 10 novembre 2011 10:46
    jeudi 10 novembre 2011 09:41
    Modérateur

Toutes les réponses

  • Bonjour,

    bien que la documentation précise que la hauteur et la largeur peuvent être négative, si vous dessinez le rectangle sur une Form celui-ci n'apparait pas.

    Quand on regarde les propriétés Bottom et Top du rectangle obtenu avec mRec(500,200,-200,100) on voit Bottom = 300 et Top = 200.

    Dans la documentation de IsVisible, on peut lire : The coordinates of the point to be tested are given in world coordinates. The transform matrix of graphics is temporarily applied before testing for visibility.

    Au final ceci pourrait "peut être" expliquer que le rectangle ne s'affiche pas et donc que les méthodes IsVisible ou Contains retourne false.

    PAr contre si vous tracez le rectancle suivant mRec(300,200,200,100) (qui devrait etre identique à mRec(500,200,-200,100) ) cette fois IsVisible retrourne Vrai.

    Cordialement

    • Marqué comme réponse Dark seiya jeudi 10 novembre 2011 10:46
    jeudi 10 novembre 2011 09:41
    Modérateur
  • Merci, grâce à votre explication, j'ai trouvé une solution pour toujours avoir un rectangle "correct".

    if (rec.Width < 0)
    {
        rec.X = rec.X + rec.Width;
        rec.Width = - rec.Width;
    }
    if (rec.Height < 0)
    {
        rec.Y = rec.Y + rec.Height;
        rec.Height = - rec.Height;
    }
    
    

    Cordialement

     

    jeudi 10 novembre 2011 10:46