Dessin

sebmime Messages postés 11 Date d'inscription mardi 23 mars 2004 Statut Membre Dernière intervention 8 septembre 2004 - 28 juin 2004 à 10:08
cs_akrame Messages postés 18 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 9 janvier 2006 - 28 oct. 2005 à 12:37
Bonjou,
Je développe un petit logiciel de dessin en delphi. Je dois pouvoir dessiner des lignes entre 2 points par exemple (pour ceci j'utilise des polyline). Ensuite, je veux savoir si l'utilisateur clique sur une ligne. Et je ne sais pas comment faire!! Apparemment c'est impossible avec les polyline car il n'y a pas d'évenements associés. Y'a t'il des objets qui font çà? Comment puis-je faire?

Merci

6 réponses

cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 32
28 juin 2004 à 19:46
L'unité Types déclare la fonction :

function PtInRect(const Rect: TRect; const P: TPoint): Boolean;

Description
PtInRect renvoie True si le point, P, se trouve à l'intérieur du rectangle, Rect, et False si P n'est pas dans Rect.

Or, un ligne n'est-elle pas un rectangle plat ? :)

Sinon, il reste la possibilité de vérifier la couleur du pixel là où a eu lieu le clic sur le composant graphique.
May Delphi be with you
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
29 juin 2004 à 17:43
Autre solution (mathématique) :

-Une ligne est définie par deux points (X1,Y1) et (X2,Y2).
-Pour tout point de la ligne (X,Y) on a les égalités : (X2-X1)/(Y2-Y1) (X-X1)/(Y-Y1) (X2-X)/(Y2-Y);

Comme tu risques de cliquer à coté (les points de la ligne théoriques ne sont pas forcément entiers), il faut regarder si la valeur absolue de la différence entre deux systèmes est inférieur à une tolérance, par exemple
if abs((X2-X1)/(Y2-Y1) - (X-X1)/(Y-Y1) ) < 0.05 then
EnPleinDedans
// Touché coulé !
else
SegmentSuivant;
// tu vérifies pour chaque segment du polyline.

Ken@vo
____________________
Code, Code, Codec !
0
cs_Kenavo Messages postés 702 Date d'inscription vendredi 21 mars 2003 Statut Membre Dernière intervention 1 octobre 2009 5
30 juin 2004 à 12:07
Ah m.... ,
1 - Fais gaffe quand même, vérifie que X1<=X<=X2 ou
X2<=X<=X1, sinon ça identifie un point situé dans le prolongement de la ligne comme faisant partie de la ligne.
2 - Si Y1=Y2 (horizontale) ça plante grave ! (division par zéro) : cas à traiter à part. on doit avoir Y=Y1=Y2 (à un ou deux pixels près, ça dépend de ce que tu as bu avant) et (X1<=X<=X2 ou X2<=X<=X1)
3- Pour les verticales (X1=X2) il faut avoir X=X1=X2 (à un ou deux pixels près) et Y1<=Y<=Y ou Y2<=Y<=Y1

Et tout ça, ça ne simplifie pas le code !

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 à 14:25
Et pour la solution du " PtInRect", est-ce que ca marche quand les rectangles se chevauchent ???????

Urgent.
0

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

Posez votre question
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:31
Tu peux tester le résultat de la fonction

PtInRect(Rect(10,10,10,500),Point(10,200));
Pour moi ça marche pas !
Donc pour les lignes verticales (ou horizontales) pas de résultat. Et il est impossible de distinguer les deux diagonales d'un rectangle ....!

Ken@vo
____________________
Code, Code, Codec !
0
cs_akrame Messages postés 18 Date d'inscription dimanche 9 mai 2004 Statut Membre Dernière intervention 9 janvier 2006
28 oct. 2005 à 12:37
pour la solution mathméatique , kenavo a utilisé l'equation d'une
droite dans l'espace , mais puisque tu travaille sur un plan il suffit
d'utiliser l'equation :

a * Y + b * X + c = 0



pour trouver les réels a ,b et c il suffit de connaitre 2 points (
M(x,y) et N(x',y') , une fois que tu as ces 3 réels , a chaque clique
tu vérifie si l'equation est égale à zéro , tu n'aura pa s de problème
de virgule . pour un meilleur résultat tu peux faire :

-0.1 < ay+bx+c < 0.1





fais attention :



Si l'objet en question est un ségment
et non une droite , il faut faire attention a ce que X >
inf(x,x') et Y > inf(y,y') et X < sup(x,x') et Y <
sup (y,y')



bonne chance
Akrame ------ www.informaticien.tk
0
Rejoignez-nous