Comparaison avec drawLine ?!

Comparaison avec drawLine ?! - Java - Programmation

Marsh Posté le 28-10-2012 à 16:27:17    

Bonjour,
 
Je souhaite pouvoir comparer le trait que je fais avec ma souris avec drawLine.
 
Je m'explique : Je récupère les coordonnées du trait que je trace avec ma souris. Ensuite, je voudrai savoir si ce que j'ai tracé correspond à un trait vertical, horizontal, ou en diagonal. Puis, je veux déterminer le sens.
J'ai pensé qu'en utilisant drawLine, en traçant la droite parfaite en passant la 1ère coordonnée et la dernière, je pourrai comparer avec le trait que j'ai tracé.
Sauf que, je ne vois pas comment faire après...
 
Je ne sais pas si c'est très clair...  :pt1cable:  
 
Merci de votre aide !

Reply

Marsh Posté le 28-10-2012 à 16:27:17   

Reply

Marsh Posté le 28-10-2012 à 18:38:09    

Je confirme, votre description n'est pas claire :D
 
Si votre but est de déterminer la direction et le sens des mouvements effectués avec la souris, pourquoi dessiner le trait, au lieu de faire les calculs sur les coordonnées ?

Reply

Marsh Posté le 28-10-2012 à 18:50:05    

Je pensait qu'en faisant les dessins, je pourrai avec une méthode pour comparer; a priori non...
Si je fais les calculs, je peux trouver quand je fais, par exemple, un trait vertical, mais il faut que le trait soit parfait. Je voudrai introduction un pourcentage d'erreur.
En gros, si le trait est à peut près vertical, je le valide comme un trait vertical.

Reply

Marsh Posté le 28-10-2012 à 18:55:27    

Dans ce cas-là, à partir des coordonnées et de la fonction atan2, vous récupérez l'angle et définissez des seuils (du genre entre -5° et 5 ° c'est horizontal).
Note : la fonction renvoie l'angle en radians, entre -pi et pi


Message édité par Farian le 28-10-2012 à 18:57:32
Reply

Marsh Posté le 28-10-2012 à 19:06:29    

Je ne comprend pas comment utiliser cette fonction !
Je récupère les coordonnées du trajet de ma souris (les x et les y). Ensuite, je compare chaque x avec chaque y ??? Et ça me retourne un angle ?

Reply

Marsh Posté le 28-10-2012 à 19:29:11    

si vous avez P1 (x1,y1) et P2 (x2,y2), vous utilisez atan2(y2-y1, x2-x1) qui vous renvoie l'angle du segment de P1 vers P2

Reply

Marsh Posté le 28-10-2012 à 21:50:43    

Je ne comprend pas.
Voici ce que j'ai fait :

Code :
  1. public Boolean HorizontalLineToLeft(List<Integer> lx, List<Integer> ly) {
  2.         int size = 0;
  3.  double x1;
  4.  double x2;
  5.  double y1;
  6.  double y2;
  7.  for (int i = 0; i <= lx.size() - 2; i++) {
  8.   x1 = lx.get(i);
  9.   x2 = lx.get(i + 1);
  10.   y1 = ly.get(i);
  11.   y2 = ly.get(i + 1);
  12.   System.out.println(Math.atan2(y2 - y1, x2 - x1));
  13.   if (Math.atan2(y2 - y1, x2 - x1) <= 0.02) {
  14.    size++;
  15.   }
  16.  }
  17.  if (size == lx.size()) {
  18.   return true;
  19.  }
  20.  return false;
  21. }
  22. }


 
Et le j'ai comme résultat :
(Dans mon main, j'ai un println qui affiche les coordonnées.)

Code :
  1. La liste des X est : [79, 80, 81, 83, 88, 95, 104, 112, 119, 126, 132, 135, 137, 139, 140, 142, 143, 144, 145, 146, 148, 149, 150, 151, 152, 152]
  2. La liste des Y est : [78, 78, 79, 79, 79, 79, 81, 83, 84, 85, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86]
  3. 0.7853981633974483
  4. 0.7853981633974483
  5. 0.7853981633974483
  6. 0.7853981633974483
  7. 0.7853981633974483
  8. 0.7853981633974483
  9. 0.7853981633974483
  10. 0.7853981633974483
  11. 0.7853981633974483
  12. 0.7853981633974483
  13. 0.7853981633974483
  14. 0.7853981633974483
  15. 0.7853981633974483
  16. 0.7853981633974483
  17. 0.7853981633974483
  18. 0.7853981633974483
  19. 0.7853981633974483
  20. 0.7853981633974483
  21. 0.7853981633974483
  22. 0.7853981633974483
  23. 0.7853981633974483
  24. 0.7853981633974483
  25. 0.7853981633974483
  26. 0.7853981633974483
  27. 0.0


 
Pourquoi ça affiche toujours le même résultat ?

Reply

Marsh Posté le 29-10-2012 à 16:42:25    

Je ne sais pas, il n'y a rien dans ton code qui indique une possibilité de "même résultat". Mais il y a quelques fantaisies dans ton code...
A) Pourquoi convertir des Integer en double (donc réel long)?
B) tu as 26 points donc 13 couples Pdepart(x1,y1) et PArrivée(x2,y2),  
je suppose que tu souhaites faire 13 calcul de direction : P1 et P2, P3 et P4, ... P23 et P24, P25 et P26  
... tu as codé 25 calculs de direction soit P1 et P2, P2 et P3, p3 et P4 ... P24 et P25, P25 et P26
C) seule possibilité pour un même résultat : tu t'es trompé à la déclaration / instanciation de lx et ly


Message édité par willy le kid le 29-10-2012 à 16:45:02
Reply

Marsh Posté le 29-10-2012 à 23:07:15    

Après réflexion, 0,7853...., cela donne exactement 45 degrés, ce qui correspond à x = y (et x > 0) ...
 
Par le plus grand des hasards, n'auriez vous pas passé deux fois X (si c'était 2 fois Y, il y aurait eu des résultats incohérents si (x1=x2) et (y1=y2) ) ? (ce qui correspondrait à l'appel de "HorizontalLineToLeft(X, X)"  )  
 
A priori, je sens bien une erreur du même niveau, le truc bête sur lequel on passe sans le voir et qui va tout régler d'un coup, le code ayant l'air propre.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed