Differencier 2 traits qui ont été dessines sur un Timage!!!!!!

Résolu
atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005 - 6 sept. 2004 à 11:12
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 - 7 sept. 2004 à 12:31
Je dessine un aprés l'autre des traits qui doivent se croiser, et le but est que lorsque je clique sur l'un de ces traits, je dois affciher
dans un message la position à laquelle ce trait à été crée: premier, deuxieme,....dernier!

C'est bete, mais c'est DURRR de différencier deux traits qui se coupent sous delphi. J'ai déja pensé aux couleurs, mais je dois dessiner 2000 lignes!!!!!!! Alors, HELP.

merci d'avance.

12 réponses

atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005
7 sept. 2004 à 11:45
Alors la chapeau!! Ca marche du tonnere de dieu. Je pense , et meme j'en suis sur, que ca va marcher à merveille!!!! 8-)

Merci bcp Kenavo. Eh en fait, je ne t'ai pas dit ca avant, mais tu viens de sauver mon stage en Allemagne! En effet, je suis a sarrebrucken, et je travaille sur un projet de stage pour un diplome d'ingenieur franco-allemand. Il ne me reste plus que 2 semaines. Donc voila, tu sais tout de moi, ou presque!!

Ce qui me fais un peu HONTE, c'est d'utiliser une maniére de programmation déja trés Pro avec les déclarations comme les tableau de lignes:

TLigne = Record
X1,Y1,X2,Y2 : Integer;
end;

ou bien encore :

TabLigne[i].X1 := Random(ClientWidth);

Mais bon je vais me documenter et avancer doucement.

@+
3
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
6 sept. 2004 à 11:50
bonjour atupac1,
Je suppose que tu mémorises les coordonnées des lignes que tu trace dans un tableau (Pt1 X,Y) et (Pt2 X,Y).
Comme une ligne peut être considéré comme un rectangle, tu peux utilisé la function PtInRect qui t'indique si ton clique appartient ou non à la zone passer en paramètre. Si tu passes les Coordonnées de tes lignes en paramètre en dépilant ton tableau par ton dernier enregistrement tu sauras sur quelle ligne tu as cliqué.

exemple :
// Pt est le tableau ou tu enregistre les positions de tes lignes.
// X et Y sont les coordonnées de ta souris.

var
  ARect : TRect;
  i  : integer;
begin
  for i := High(Pt) downto 0 do
  begin  
    ARect := Rect(Pt[i,0].x,Pt[i,0].Y,Pt[i,1].x,Pt[i,1].Y);
    
    if PtInRect(ARect,Point(X,Y)) then
    begin
      ShowMessage('Vous avez cliqué sur la ligne ' + IntToStr(i + 1));
      break;
    end;
  end;
end;


En espérant avoir été clair ;)

Bonne Prog,

Olivier.
0
atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005
6 sept. 2004 à 12:33
Cette fonction "PtInRect" existe deja sous delphi ???????

ca met une erreur ché moi!
0
atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005
6 sept. 2004 à 12:48
En fait, si j'ai compris, on va verifier si les coordonnés de la souris se trouvent bien dans l'un des carrés stockés dans notre tableau.

Mais, si deux carrées se chevauchent, on forcément confondre 2 traits non????
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Loulibier Messages postés 309 Date d'inscription jeudi 6 juin 2002 Statut Membre Dernière intervention 24 septembre 2008 2
6 sept. 2004 à 14:42
La classe comportant la function PtInRect est Types.

Pour ce qui de confondre les 2 traits si tu regarde bien mon code,
je dépiles mon tableau en partant du dernier élément, je part du principe que le dernier trait dessiner chevauche les autres. lorsque je trouve un trait selectionner je sors de ma boucle, donc je ne peux pas confondre les traits.

Je ne peux pas te certifier que cela marche car je ne l'ai pas testé, mais je te donne une piste ;)

bonne prog,

Olivier.
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
6 sept. 2004 à 15:09
Bon, ben j'ai testé mon idée et ça donne ça : (et ça marche !)
{ les déclarations :
Uses
  Math;
type
  TLigne = Record
             X1,Y1,X2,Y2 : Integer;
           end;
  TTabLignes = Array[0..NombreLigne-1] of TLigne;
var
  TabLigne  : TTabLignes;
}

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i, n : Integer;
  d, Resu : integer;
begin
  Resu:=99999;
  n:=-1;
  for i:=0 to NombreLigne-1 do
    begin
      With TabLigne[i] do
      begin
        if PtInRect(Rect(Min(X1,X2)-1,Min(Y1,Y2)-1,Max(X1,X2)+1,Max(Y1,Y2)+1),Point(X,Y)) then
        begin
          d := abs (X*Y2-X2*Y + X1*Y-X*Y1 + X2*Y1-X1*Y2);
          if (d<Resu)  then
            begin
              n:=i;
              Resu := d;
            end;
        end;
      end;
    end;
  Trouve := n;
  Invalidate;
end;


PtInRect me sert à vérifier que le point cliqué est bien dans le rectangle (agrandi d'un pixel dans chaque sens) décrit par une ligne (= une diagonale).

 d := abs (X*Y2-X2*Y + X1*Y-X*Y1 + X2*Y1-X1*Y2);

permet de calculer l'erreur de positionnement du clic sur la droite.
Plus l'erreur est faible plus près de la ligne on a cliqué.

Ken@vo
____________________
Code, Code, Codec !
0
atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005
6 sept. 2004 à 15:17
Je vais essayer d'intégrer ton idée dans mon programme monstrueux, et je vous dirais SI MON BOSS KIFF LE PROG. OU PAS, OK!!!

MERCI BCP POUR LE KOUDEPOUCE,C'EST GRAVE COOL CE FORUM!!!!

A+
0
atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005
6 sept. 2004 à 16:06
Dans Uses, "Types" n'est pas reconnu !!

dit KENAVO, ca te derangerait pas de remettre le code complet sur e forum(ZIP), pour éviter les problémes d'intégration.
(c à dire perdre du tps à ráadapter....)

En plus, j'ai plus bcp de tps pour chercher, c Surtout ca. Thanks.
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
6 sept. 2004 à 17:53
Ho là doucement !

"Types" c'est "type" sans "s" : déclaration des types TLigne et TTabLignes tels que je les ai définis pour mon programme de test

Si tu ne les a pas définis comme moi, tu devras de toutes les façons adapter le code.

Mais je vais quand même mettre le source pour que toutle monde en profite.

Ken@vo
____________________
Code, Code, Codec !
0
atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005
7 sept. 2004 à 10:12
Ok! je te remercie, comme ca , je pourrais analyser assez rapidement le truc.

Dis moi Kenavo, en fait je voulais une petite précision, tu utilises la longueur de la diagonale ou alors l'équation de la diagonale pour vérifier si le point est ds le carré???

Tu pourrai m'indiquer ou tu as déposé la source du prog?
Si jamais ya un probléme avec le prog, je te recontacte, et tu sera le 1er au courant si mon prog. tourne.

Bonne prog.
0
atupac1 Messages postés 73 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 5 juillet 2005
7 sept. 2004 à 10:13
Ok! je te remercie, comme ca , je pourrais analyser assez rapidement le truc.

Dis moi Kenavo, en fait je voulais une petite précision, tu calcule la longueur de la diagonale ou alors l'équation de la diagonale pour vérifier si le point est ds le carré???
Parce que avec l'équation, on risque de confondre 2 droites!! Donc dis-moi voir.

Tu pourrai m'indiquer ou tu as déposé la source du prog?
Si jamais ya un probléme avec le prog, je te recontacte, et tu sera le 1er au courant si mon prog. tourne.

Bonne prog. @+
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
7 sept. 2004 à 12:31
Bon Courage !

Ken@vo
____________________
Code, Code, Codec !
0
Rejoignez-nous