Avant de me lancer dans des calculs math de l'époque , vais regarder un peu dans swing. Peut etre y a t il un moyen de creer une Ligne et d ensuite tester si un point passe par cette ligne
Me semblait avoir vu ca , donc
Avant de me lancer dans des calculs math de l'époque , vais regarder un peu dans swing. Peut etre y a t il un moyen de creer une Ligne et d ensuite tester si un point passe par cette ligne
Me semblait avoir vu ca , donc
Grrrr pas capable de faire une bete equation du premier degré ... genre ...
pourtant ca me semble correct ...
OnClick dans le Tableau :
Et ensuite la methode pointDansLigne qui recoit les deux extremites de la droite + le point où l'on a clicker
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 public void mouseClicked(MouseEvent e) { int nbLiaisons = liaisons.size(); for (int i = 0; i < nbLiaisons; i++) { Liaison l = (Liaison) liaisons.get(i); Point p1 = l.getP1(); Point p2 = l.getP2(); if (pointDansLigne(p1, p2, e.getPoint())) System.out.println(l); } }
Je vois pas ce qui a de mauvais la dedans, j essaie d analyer en faisant des system.out mais je pige pas la logique du pourquoi ca va pas ... saoulant cette histoire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 private boolean pointDansLigne(Point p1, Point p2, Point p3) { double m = 0; if (p1.x>p2.x) m = (double)(p1.y-p2.y)/(p1.x-p2.x); else m = (double)(p2.y-p1.y)/(p2.x-p1.x); int p = Math.min(p1.y, p2.y); int y = p3.y; int x = p3.x; return y == ((m*x)+p); }
Le truc c est que un JPanel se comporte totalement a l opposé d un graphe normal (x grandit en descendant et y aussi), donc ca me fais inverser des trucs, mais là je pense que c est bon :s
ta conversion n'est pas bien mise.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (p1.x>p2.x) m = (double)(p1.y-p2.y)/(p1.x-p2.x); else m = (double)(p2.y-p1.y)/(p2.x-p1.x);
voilà comment ça se passe (à mon avis) :
- calcul du numérateur -> résultat de type int
- calcul du dénominateur -> résultat de type int
- division entière
- conversion vers double.
ce qui donne par exemple (18 - 3)/(3 - 1) = 15 / 2 = 7 = 7.
ce qui devrait être (18 - 3)/(3 - 1) = 15 / 2 = 15. / 2. = 7.5 (par exemple)
Donc je te conseille plutot un truc du genre :
Cependant, je suis convaincu que l'une des deux conversions est inutile (je parierais sur la 2e)
Code : Sélectionner tout - Visualiser dans une fenêtre à part m = ((double)(p2.y-p1.y))/((double)(p2.x-p1.x));
et tu ne traites pas le cas p1.x = p2.x
c'est voulu?
Si t'as une ligne verticale, ça va joliment planter
En regardant de plus près, d'autres trucs ne me semblent pas bons...
ça ne sert à rien, car on a le même résultat dans le if et dans le else (mutliplication par -1 en haut et en bas).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if (p1.x>p2.x) m = (double)(p1.y-p2.y)/(p1.x-p2.x); else m = (double)(p2.y-p1.y)/(p2.x-p1.x);
de plus, le p n'est pas bon.
Si tu veux avoir y = m*x + p, alors p = y - m.x (x et y du même point)
ce qui donne :
et pour le test, je conseille de faire qqchose de plus large pour éviter le pb d'arrondi et pour pouvoir sélectionner la ligne plus facilement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 double m = 0; if (p1.x != p2.x) { m = ((double)(p1.y-p2.y))/(p1.x-p2.x); } else { return (p3.x - p2.x) < 3; // explication du 3 juste après } double p = p1.y - m*p1.x;
il est peut être nécessaire de caster en double par endroit, j'ai pas vérifié...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 double y = p3.y; double x = p3.x; return (y - ((m*x)+p)) < 3;
Là ça vérifie que le point appartient à la droite, il reste encore à vérifier que le point appartient au segment, mais le plus dur est fait.
J'avais fais cela comme conversion avant mais ca n'allait pas non plus.
Pour ce qui est de l'inutilité d'un des deux, he bien je trouve que c est utile, voir indispensable, car selon je pourrai avoir un résultat négatif ou un positif ... donc je pourrai passer par ABS mais pas top a ce niveau .
Voici un exemple de résultat :
System.out.println(y+"="+((m*x)+p));
Cette ligne est dans pointDansLigne (...) (voir post précédent) et est apellée a chaque fois que je bouge ma souris.
Les chiffres ici resultent d un déplacement horizontal de ma souris aux alentours de la ligne
comme tu peux le voir, il est un bon 30 + haut ... et puis meme la partie decimale est tellement grande que jamais ca tombera dessus ...
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 148=165.18297872340426 148=166.96170212765958 148=169.62978723404254 149=170.5191489361702 149=171.40851063829786 149=172.29787234042553 149=173.18723404255317 149=174.07659574468084 149=174.96595744680852 149=175.85531914893616 149=177.63404255319148 149=178.52340425531915 149=180.30212765957447 149=181.1914893617021 149=182.08085106382978 149=182.97021276595743 149=183.8595744680851 149=184.74893617021274
je t'assure que c'est inutile, exemple :Envoyé par Bardack
on a toujours (a - b) / (c - d) = (b - a) / (d - c).(5 - 3) / (2 - 1) = 2 / 1 = 2
(3 - 5) / (1 - 2) = (-2) / (-1) = 2
Je vois pas quoi te dire de plus là...
En ce qui concerne le décalage d'environ 25, je me demande si ça vient pas du décalage de l'en-tête de ta fenêtre, car la barre de titre fait entre 20 et 30 pixels de hauteur il me semble.
Essaie de tracer aussi les coordonées des extrémités, du point où tu cliques, et de cliquer sur une des extrémités.
comme ça tu verras si ça correspond
C'est pour ça que je ne fais pas un test d'égalité dans ce que je propose, mais la différence et j'utilise un seuil de tolérance. J'avais mis 3 comme ça, mais d'un point de pratique, je pense que ça devrait rester dans cet ordre de grandeur.Envoyé par Bardack
en fait je calculais pas de p ... boulet inside ... on voit que les debuts secondaires sont loin. Je m occupe de ca
en tt cas, merci pour ton aide dans ttes ces questions...
Car ils sont bien gentils a l'armée (je fais mon stage au ministere de la defense), mais ils ont la notion de rien
pas de soucis, c'est en période creuse au boulot, je croule pas sous le travail.
Donc tu me permets de m'occuper
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager