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

Linux Discussion :

colorer intersection de deux polygones


Sujet :

Linux

  1. #1
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut colorer intersection de deux polygones
    Bonjour,

    J'ai une application graphique développé sous linux en C / X11 / Motif.
    je visualise des polygones colorés.
    je dois montrer, avec une autre couleur, l'intersection de deux polygones si cette intersection est non vide.

    Cela est t'il possible ?
    L'intersection est faite en utilisant les RegionX, chaque polygone initialise une RegionX et la routine XIntersectRegion() fournit la regionX correspondant à l'intersection. On sait alors si il y a intersection ou pas.
    Peut t'on colorer une RegionX ?
    Peut t'on récupérer un polygone à partir d'une RegionX ?
    A quoi peut servir la RegionX retournée par XIntersectRegion(), si ce n'est à vérifier qu'elle est vide ou pas ?

    Merci

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Peut t'on colorer une RegionX ?
    Bien sûr


    Citation Envoyé par awalter1 Voir le message
    Peut t'on récupérer un polygone à partir d'une RegionX ?
    Bien sûr, quoique il faille chercher ... simplement en lisant la doc de ce qu'est la structure d'une XRegion.




    Citation Envoyé par awalter1 Voir le message
    A quoi peut servir la RegionX retournée par XIntersectRegion(), si ce n'est à vérifier qu'elle est vide ou pas ?
    A faire un clip... à ajouter (ou enlever) du contexte graphique, et comme ça tu traces sans te préoccuper à savoir si tu es dans un trou ou non, c'est le serveur X qui s'en charge..


    Exemple : des iles dans un lac dans un pays.

    Chaque ile est un polygone.

    Admettons que tu veuilles remplir le polygone du pays.

    • Tu définis la XRegion comme étant le polygone du pays.
    • Tu en définis une autre comme étant l'union des polygones des iles
    • Tu en définis une 3ième comme étant le polygone du lac.
    • Tu fais une petite opération booléenne (en jouant sur interesction & union), tu définis le Clip comme étant ce résultat, et le fait d'appeler le tacé du polygone du pays en rtracé plein te fer tout seul le tracé plein du pays et des iles en évid(t)ant le lac..



    A l'inverse une intersection pure peut servir en tant que telle : calculer un recouvrement de 2 zones et s'en servir dans le soft..

    En fait c'est de la "géométrie booléenne"..



    PS: je serais absent 2 semaines , donc plus de réponses de ma part avant le 18...
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Bonjour,
    Je reviens vers ce sujet car, je n'ai pas avancé.
    Comment fait t'on pour colorer une RegionX (quelle fonction utilisée) ?
    Ou trouver la doc officielle Xlib qui décrit les regions X ou tout autre doc de référence, je ne trouve rien via google.
    Lorsque j'utilise des fonctions XSubstractRegion ou XIntersectRegion, j'imagine qu'il existe un tableau de XPoint ou est défini les x,y de la région X resultat de ces opérations. Comment y accèder ?
    En particulier, je fais des XSubstractRegion et le résultat devrait être une région X vide (testé avec XEmptyRegion) mais il ne l'est pas. Je n'ai aucun moyen de comprendre/savoir la définition de la région X vue comme non vide : ou trouver la structure de données définissant cette région X.
    Merci de votre aide, car je suis dans une impasse.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par awalter1 Voir le message
    Bonjour,
    Je reviens vers ce sujet car, je n'ai pas avancé.
    Comment fait t'on pour colorer une RegionX (quelle fonction utilisée) ?
    Ou trouver la doc officielle Xlib qui décrit les regions X ou tout autre doc de référence, je ne trouve rien via google.
    Lorsque j'utilise des fonctions XSubstractRegion ou XIntersectRegion, j'imagine qu'il existe un tableau de XPoint ou est défini les x,y de la région X resultat de ces opérations. Comment y accèder ?
    En particulier, je fais des XSubstractRegion et le résultat devrait être une région X vide (testé avec XEmptyRegion) mais il ne l'est pas. Je n'ai aucun moyen de comprendre/savoir la définition de la région X vue comme non vide : ou trouver la structure de données définissant cette région X.
    Merci de votre aide, car je suis dans une impasse.
    je répondrais plus précisément demain, mais disons qu'on ne "colore" pas directement une région X.

    Une région X est, comme une pixmap ou une window dans X, une entité virtuelle..

    C'est simplement une structure (C)

    Cela permet de faire des masques (que l'on ajoute ou enlève au contexte graphique).. C'est à travers ce truchement que l'on "trace" ou "colore" une région... en faisant un XSetRegion...


    La VRAIE bible est le bouquin original :

    X Window System,
    Scheifler, Gettys, Newman,
    Digitial Press
    1984

    Normalement, la doc devrait être accessible sous Linux en faisant "man X"



    La région X retournée par XIntersectRegion peut par exemple servir à ajouter (ou soustraire) d'une autre région..

    Par exemple : XSubstractRegion ( XUnionRegion (r1,r2), XIntersectRegion(r1,r2))

    définira un masque permettant de tracer les 2 régions d'un coup SAUF l'intersection..

    Je donnerais quelques exemples plus précis demain..


    Quelques exemples de code :

    • Pour vérifier si quelque chose est déjà tracé à cet endroit-là sur la drawable (fenêtre ou pixmap dont on se sert) : (ici UsedSpace est une variable globale définissant l'espace de la fenêtre (éventuellement clippé)) :

      Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      Boolean CheckIfAlreadySomethingOnScreen ( int XLeft, int XRight,
                                                int YTop, int YBottom )
      {
         int    i ;
       
         i = XRectInRegion ( Used_Space, XLeft, YTop, (XRight-XLeft), (YBottom-YTop) ) ;
         if ( i == RectangleOut )
             return False ;
         else
             return True ;
      }

    • Si par exemple on a une variable globale (de type XRegion) dénomée UsedClip, on peut faire une routine pour incrémenter une zone de clipping :

      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
      void AddPolygonToClipRegion ( IFData *idata, MyPoint *Clip, int NClip )
      {
        IFData_X *xdata = (IFData_X *)idata->Parent ;
        Region    r1 ;
       
         if ( Used_Clip == (Region)NULL )  /* 1er polygone : Initialisation */
           {
             Used_Clip = XPolygonRegion ( (XPoint *)Clip, NClip, WindingRule ) ;
             XSetRegion ( xdata->dpy, xdata->gc, Used_Clip ) ;
             XFlushGC ( xdata->dpy, xdata->gc ) ;
             return ;
           }
       
         /* Polygones suivants */  
         r1 = XPolygonRegion ( (XPoint *)Clip, NClip, WindingRule ) ;
         XSubtractRegion ( Used_Clip, r1, Used_Clip ) ;
         XSetRegion ( xdata->dpy, xdata->gc, Used_Clip ) ;
         XFlushGC ( xdata->dpy, xdata->gc ) ;
         XDestroyRegion ( r1 ) ;
      }

    • ou, pour vérifier si un pixel est clippé ou non :

      Code C : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      Boolean IsPointClipped ( IFData *idata, int x, int y )
      {
        if ( Used_Clip == (Region)NULL )
          return False ;
       
        return ( XPointInRegion ( Used_Clip, x, y ) ) ;
      }


    Cela permet par exemple de pouvoir tracer d'un coup un lac avec plein d'iles : chaque ile est ajoutée au clip, puis on trace la frontière du lac (par exemple avec un fill) d'un coup. Tout sera tracé mais les iles seront évitées..

    et ainsi de suite...


    Sinon, une bonne référence de code (mais je ne sais pas si c'est toujours dispo) c'est le code de XFree86.

    Il y a en particulier tout le module des régions..

    Mais comme X est libre, normalement le code est dispo sous distrib unixoide..
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  5. #5
    Membre averti Avatar de awalter1
    Inscrit en
    Août 2004
    Messages
    994
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 994
    Points : 407
    Points
    407
    Par défaut
    Merci,
    ces éclaircissements m'ont bien aidé, je les mets en application.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. intersection et reunion de deux polygones
    Par anouar.g dans le forum C
    Réponses: 4
    Dernier message: 18/03/2009, 11h15
  2. Union de deux polygones
    Par aidos dans le forum C++
    Réponses: 4
    Dernier message: 21/12/2006, 03h15
  3. [debutant] intersection de deux plages horaires
    Par absolut75 dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 24/05/2006, 13h03
  4. Intersection de deux courbes quelconques
    Par ShootDX dans le forum Algorithmes et structures de données
    Réponses: 32
    Dernier message: 31/03/2006, 10h32
  5. [prg jeux ]Définir l'intersection de deux rectangles
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 30/07/2003, 18h11

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