Dessin

Messages postés
11
Date d'inscription
mardi 23 mars 2004
Statut
Membre
Dernière intervention
8 septembre 2004
- - Dernière réponse : 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
Afficher la suite 

6 réponses

Messages postés
4580
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
24
0
Merci
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
Commenter la réponse de cs_Delphiprog
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
1
0
Merci
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 !
Commenter la réponse de cs_Kenavo
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
1
0
Merci
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 !
Commenter la réponse de cs_Kenavo
Messages postés
73
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2005
0
Merci
Et pour la solution du " PtInRect", est-ce que ca marche quand les rectangles se chevauchent ???????

Urgent.
Commenter la réponse de atupac1
Messages postés
702
Date d'inscription
vendredi 21 mars 2003
Statut
Membre
Dernière intervention
1 octobre 2009
1
0
Merci
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 !
Commenter la réponse de cs_Kenavo
Messages postés
18
Date d'inscription
dimanche 9 mai 2004
Statut
Membre
Dernière intervention
9 janvier 2006
0
Merci
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
Commenter la réponse de cs_akrame