Bonjour,
J'ai un dessin avec 2 cercles.
Je voudrais savoir si les deux cercles se touches.
J'ai les coordonnes du centre et le rayon de chaque cercle.
Merci de votre aide
Bonjour,
J'ai un dessin avec 2 cercles.
Je voudrais savoir si les deux cercles se touches.
J'ai les coordonnes du centre et le rayon de chaque cercle.
Merci de votre aide
Tu calcules la distance entre les deux centres des cercles et ensuite tu soustrais le rayons de chaque cercle à cette distance.
Si c'est =<0, alors ils se touchent.
Avant de poster, venez tenter votre chance ici
Non, tu ne te trompes pas.
La distance entre les deux centres doit être comprise (au sens large) entre la valeur absolue de la différence des deux rayons, et la somme des deux rayons.
Mais la méthode de forumde est valable pour savoir si deux "disques" se touchent.
Reste à savoir si bibx parlaient effectivement de cercles, ou de disques.
Je parle effectivement de disque donc ca me parait bien.
Je suis en train de tester, et pour l'instant j'ai des petits soucis,
je confirme et je vous dis ...
Bon ben je sais pas pkoi ca marche pas
je dessine un disque puis quand je click avec la souris j'en dessine un autre ben ca marche pas.
Quand le 2eme cercle est a la droite du premier ca marche
mais quand le 2eme est a gauche ca marche pas.
Comprend pas pourquoi....
Salut,Quand le 2eme cercle est a la droite du premier ca marche
mais quand le 2eme est a gauche ca marche pas.
Ca sent fort que tu as du oublier une valeur absolue quelque part :
Si les deux cercles sont sur la même ligne horizontale.
Si le 2ème cercle est à droite :
Mais si le 2ème cercle est à gauche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part 0 < x2 - x1 < somme rayons
Bonne journée
Code : Sélectionner tout - Visualiser dans une fenêtre à part -somme rayons < x2 - x1 < 0
Feriaman : Que represente x1 et x2 ???
plegat : Desole, le probleme est que je detecte pas si les disques se touchent.
Voici mon bout de code ...
Bon c'est schematise lool
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
20
21
22
23
24 public static double calcDist(Point p1,Point p2){ double dx,dy; dx=p1.x-p2.x; dy=p1.y-p2.y; return java.lang.Math.sqrt(dx*dx+dy*dy); } public boolean testSiTouche(int positionx, int positiony) { int rayon1 = 150; int rayon2 = 5; Point centreCercle1 = null; Point centreCercle2 = new Point(positionx, positiony); double distCentre = 0; int point = 0; // celui la est fixe centreCible = new Point(150,150); distCentre = calcDist(centreCercle1,centreCercle2); if ((distCentre - rayon2 - rayon1) <= 0) { return true; } return false; }
avec un argument null, c'est sûr que ça ne va pas "marcher"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Point centreCercle1 = null; [...] distCentre = calcDist(centreCercle1,centreCercle2);
D'ailleurs tu as dû récupérer un méchant message d'erreur qui nous aurait bien aidé pour résoudre le problème.
Tellement fixe qu'il n'est utilisé nulle part...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 // celui la est fixe centreCible = new Point(150,150);
tu entends quoi par là?Envoyé par bibx
Tu sais, à force d'approximer tes questions, tes réponses et les infos, on va mettre dix plombes à te répondre...
La définition de ta méthode testSiTouche est mauvaise. Normalement elle devrait s'appliquer à un objet, et c'est sur cet objet que tu récupères le centre (et pas en définir un autre dans le corps de la méthode).
Je sais que le code implemente n'est pas la bonne j'ai voulu faire un extract.
Je cherche juste a determiner si la maniere de chercher si ca se touche est bonne.
Et non pas verifier l'implementation...
j'ai fait une erreur pour avoir ce bout de code errone DESOLE
Bon je n'y arrive pas je suis trop mauvais je bloque ...
Bon je donne l'explication : dans la methode paintComponent je dessine une cible et donc je veux savoir que donne comme point sur le click de la souris
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
20
21
22
23
24
25
26
27 public int calculPoint(int positionx, int positiony) { double rayon1 = 5/2; double rayon2 = 0; Point centreCible = null; int point = 0; for (int i = 0; i < 11; i++) { rayon2 = ((D - (2 * i * D / 22))/2); centreCible = new Point((D/2),(D/2)); System.out.println("rayon2 :"+rayon2); if (0 < centreCible.x - positionx && centreCible.x - positionx < (rayon2+rayon1)) { point = i+1; System.out.println(positionx + "-" + positiony); System.out.println("0 < "+(centreCible.x - positionx)); System.out.println((centreCible.x - positionx)+" < "+(rayon2+rayon1)); } if (-(rayon2+rayon1) < centreCible.x - positionx && centreCible.x - positionx < 0) { point = i+1; System.out.println(positionx + "-" + positiony); System.out.println(-(rayon2+rayon1)+" < "+(centreCible.x - positionx)); System.out.println((centreCible.x - positionx)+" < 0"); } } return point;
Mais ca marche pas
Merci de m'aider SVP
On est super avancé avec ça comme précision...Envoyé par bibx
Si tu étais un peu plus précis, ça fait une semaine que tu aurais eu ta réponse...
Je me répète mais bon...
Il suffisait de définir centreCercle1 dans la méthode que tu avais présentée précédemment et c'était bon, et là tu nous sors une usine à gaz qui fait on ne sait quoi...
Petits conseils:
- met des parenthèses dans tes conditions de test. Là je ne sais même pas ce que ça calcule (mais je fais confiance au compilo pour sortir un résultat... par contre, lequel...???)
- attention, tu fais des divisions entières... 5/2=2.0 dans ton code...
Bonjour,
je vais donner une explication beaucoup plus claire comme ca tu pourras me donner une reponse plus claire toi aussi loool
Et peut etre meme essayer de me donner un bout de code avec ce que je vais te donner la.....
J'ai redefinit une classe qui extends de JPanel,
Cette classe permet de redefinir la methode paintComponent afin d'y dessiner une cible de tir
Le diametre de la cible faitvoici la methode paintComponent
Code : Sélectionner tout - Visualiser dans une fenêtre à part int D = 250;
Au click sur la cible je definie un evenement mouseClick qui ajoute des impactes grace a la methode add de JPanel.
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
20
21
22
23
24
25
26
27
28 protected void paintComponent(Graphics arg0) { super.paintComponent(arg0); Graphics2D g = (Graphics2D)arg0 ; g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); Color[] listcouleur = {new Color(255,255,255), new Color(255,255,255), new Color(0,0,0), new Color(0,0,0), new Color(66,171,218), new Color(66,171,218), new Color(205,48,67),new Color(205,48,67), new Color(255,231,88),new Color(255,231,88),new Color(255,231,88)}; for (int i = 0; i < 11; i++) { g.setColor(listcouleur[i]); g.fillOval((2 * i * D / 22) / 2, (2 * i * D / 22) / 2, D - (2 * i * D / 22), D - (2 * i * D / 22)); } g.setColor(Color.black); for (int i = 0; i < 11; i++) { if (i==3) { g.setColor(Color.white); } else { g.setColor(Color.black); } g.drawOval((2 * i * D / 22) / 2, (2 * i * D / 22) / 2, D - (2 * i * D / 22), D - (2 * i * D / 22)); } }
Les impactes sont en faite des petits JPanel en forme de rond (j'ai egalement redefinit paintComponent). Ces impactes ont un diametre de 5.
Voici la methode paintComponent
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 protected void paintComponent(Graphics arg0) { super.paintComponent(arg0); Graphics2D g = (Graphics2D)arg0 ; g.setColor(bgColor); g.fillOval(0, 0, 5, 5); }
L'idee est donc que je puisse determiner les points marques en fonction de la place des l'impactes, bien entendu il faut prendre en compte le diametre de l'impacte mais egalement le diametre des differentes couleurs, chaque couleur represente un nombre de point.
NB : Si un impact est sur le 1er rouge mais qu'il touche un peu le jaune alors ca vaut la valeur de la couleur jaune.
Voici maintenant ma methode pour calculer les points :
(positionx, positiony, sont les points du centre de l'impacte)
Le probleme :
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 public int calculPoint(int positionx, int positiony) { int resolutionCible = D/2; double dx,dy; dx=resolutionCible-positionx; dy=resolutionCible-positiony; double distance = 0; distance = Math.sqrt(dx*dx+dy*dy); int s = 0; s = 11 - (int) (11 * distance / resolutionCible); if (s < 1) return 0; return s; }
Ca ne prend pas bien en compte les points, la valeur n'est pas toujours juste.
Surtout quand je suis a raz d'une couleur, du cote gauche (au ras des deux rond jaune) "Je devrais trouver le point superieur, comme explique plus haut"
Bon ca c'est pas evident a expliquer, alors j'espere avoir etait claire.
J'attend de l'aide rapide de votre part, et je peux vous fournir plus de code si besoin mais la il y a presque tous.
Merci d'avance
Là, on a de quoi travailler!
Par contre, je n'ai pas super le temps tout de suite de regarder ça, je regarderai plus en détail ce soir.
En attendant, pour ton problème de précision, je vais répéter mais VIRE TES DIVISIONS ENTIERES! (ou vérifie que tu les contrôles bien et que ça ne vient pas de là)
Tu as des approximations sur le tracé (avec les D/22), tu as des approximations sur le calcul (avec le D/2 et le cast en (int) sauvage), donc normal que ça ne soit pas précis.
Regarde aussi les fonctions d'arrondi de la classe Math plutôt que d'utiliser un cast en int, tu auras plus de contrôle (ceil, round, rint, floor... il faut voir laquelle convient le mieux suivant que tu veux arrondir au-dessus ou en-dessous).
J'attend avec impatience ce que tu vas me proposer
Merci pour ton aide.
++
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