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++Builder Discussion :

détecter un click sur un polygone


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 60
    Points : 50
    Points
    50
    Par défaut détecter un click sur un polygone
    Bonsoir à tous,

    Je voudrais savoir comment je peux détecter un click ou un passage de la souris sur un polygone que j'ai dessiné sur une image. J'avais déjà posé cette question il y à 2 ou 3 ans et ont avait pu me répondre. Malheureusement je ne sais plus comment on fait. Je travaille avec C++Builder 6.

    D'avance merçi.

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Tu dois te servir de MouseDown et MouseMove sur ton image. Ensuite avec les coordonnées tu regardes si c'est dans le polygone.

    Est-ce que tu dessine ton polygone avec la fonction Polygon sur un Canvas?
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Points : 3 766
    Points
    3 766
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    S'il n'y a pas de solution simple existante, je pourrai en suggérer une faisant appel à la géométrie : savoir si un point est à l'intérieur ou à l'extérieur d'un polygone.
    Il s'agit de faire la somme des aires des triangles successifs obtenus ayant comme un des sommet le point donné et les 2 autres points étant constitués par les points pris successivement sur le pourtour du polygone.
    Gilbert PASQUALINI

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Il y a au moins deux moyens :
    - remplir le polygone avec une teinte différente du reste.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TColor polygone;
    Canvas->FloodFill(....);
    A tout moment on pourra tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(Canvas->Pixels[X][Y] == polygone)
    - utiliser un algorithme permettant de calculer si (X,Y) appartient au polygone comme l'indique Pasqualini.
    Faire un tour sur le forum Algorithmes car il me semble que le sujet y a été abordé.

    A plus !

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Août 2002
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 481
    Points : 242
    Points
    242
    Par défaut
    Comme le sujet m'a intéressé, j'ai cherché une solution.
    Hypothèses
    1 - Le polygone a n sommets
    2 - Le polygone est non croisé, c'est à dire pas de point double.

    Les coordonnées x et y des sommets du polygone sont rangées dans 2 tableaux d'entiers PtX et PtY. Ils se succèdent dans lordre où on trouverait les sommets successifs si on parcourait le pourtour du polygone sans jamais changer de sens.

    Les valeurs x et y données au sous-programme sont les valeurs X et Y données par l' évènement OnMouseDown,
    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
    boolTfPolygone::PointDsPolygone(int x, int y)
    {
      double xm = double(x), ym = double(y),
    	x1 = double(PtX[0]), y1 = double(PtY[0]), x2, y2, Cos, Sin;
      int i;
      double AngleTotal = 0, AngleTr;
      bool bDans = [B]true[/B;
      Image1->Canvas->Pen->Color=clRed;
      for(i = 1; i < NombrePts ; i++)
      {
    	x2 = double(PtX[i]); y2 = double(PtY[i]);
    	
    	Cos = (x1 - xm)*(x2 - xm) + (y1 - ym)*(y2- ym);
    	Sin = (x1 - xm)*(y2 - ym) - (x2 - xm)*(y1 - ym);
    	if( (Cos == 0) && (Sin == 0))       // sur un sommet du polygone
    	{
    	  bDans = true;
    	  return bDans;
    	}
    	AngleTr = atan2(Sin, Cos);
    	AngleTotal +=AngleTr;
    	x1 = x2; y1 = y2;
    
      }
      x2 = double(PtX[0]); y2 = double(PtY[0]);
      Cos = (x1 - xm)*(x2 - xm) + (y1 - ym)*(y2- ym);
      Sin = (x1 - xm)*(y2 - ym) - (x2 - xm)*(y1 - ym);
      AngleTr = atan2(Sin, Cos);
    
      AngleTotal +=AngleTr;
      AngleTotal /=2*M_PI;
      if(fabs(AngleTotal) > 0.01) bDans = true;
    	else bDans = false;
    
      return bDans;
    }
    //---------------------------------------------------------------------------
    Cela semble marcher quelle que soit la forme du polygone.
    Gilbert PASQUALINI

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 60
    Points : 50
    Points
    50
    Par défaut détecter un click sur un polygone
    Bonjour à tous,

    Je voudrais d'abord vous remercier pour l'intérêt que vous avez portés à ma question.
    J'ai retrouvé mon code qui traitait de mon problème.
    Voici comment procéder très facilement.


    // création d'un tableau de point pour créer un polygone : TPoint pt1[500];
    // définir les point du polygone.
    // créer un handle : HWND hnd;
    // BOOL reg1;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
    	int X, int Y)
    {
        hnd=CreatePolygonRgn((TPoint*)pt1,i,ALTERNATE);  // i étant le nombre   de points
        reg1=PtInRegion(hnd,X,Y);
        DeleteObject(hnd);
        hnd=NULL;
        if(reg1)
        {
             // Si le point fait partie du polygone faire...
        }
    }

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

Discussions similaires

  1. Détecter le click sur une bannière de pub
    Par jaljal dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/07/2010, 17h28
  2. Réponses: 1
    Dernier message: 13/04/2010, 08h44
  3. [DOM] [debutant] comment détecter un click sur un div
    Par junior68 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 07/06/2009, 15h26
  4. Détecter le click sur une combobox d'une datagridview
    Par Delphi-ne dans le forum Windows Forms
    Réponses: 11
    Dernier message: 21/04/2009, 11h22
  5. Réponses: 2
    Dernier message: 09/09/2005, 10h45

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