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 confirm�
    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
    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 Expert
    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
    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?

  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

  4. #4
    Membre �clair�
    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
    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.

  5. #5
    Membre Expert

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

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    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 �clair�
    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
    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.

  7. #7
    Membre confirm�
    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
    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