IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

2D Java Discussion :

Savoir si deux cercles se touchent


Sujet :

2D Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut Savoir si deux cercles se touchent
    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

  2. #2
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 27
    Points : 15
    Points
    15
    Par défaut
    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.

  3. #3
    Membre éclairé Avatar de zorm
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    584
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 584
    Points : 672
    Points
    672
    Par défaut
    Citation Envoyé par forumde Voir le message
    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.
    Je me trompe peut être, mais ce n'est pas toujours vrai. si un des 2 cercles contient l'autre sans pour autant avoir une intersection avec, ton cas est vrai tout de même!

  4. #4
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par zorm Voir le message
    Je me trompe peut être
    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.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    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 ...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    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....

  7. #7
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Quand le 2eme cercle est a la droite du premier ca marche
    mais quand le 2eme est a gauche ca marche pas.
    Salut,

    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0 < x2 - x1 < somme rayons
    Mais si le 2ème cercle est à gauche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -somme rayons < x2 - x1 < 0
    Bonne journée

  8. #8
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par bibx Voir le message
    Bon ben je sais pas pkoi ca marche pas
    [...]
    mais quand le 2eme est a gauche ca marche pas.
    ce qui serait bien, ce serait de détailler un peu ce que tu entends exactement par "ça marche pas"... un ordi, ça n'a pas de jambes, donc c'est sûr que ça ne va pas marcher!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    Feriaman : Que represente x1 et x2 ???
    plegat : Desole, le probleme est que je detecte pas si les disques se touchent.

  10. #10
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 362
    Points : 410
    Points
    410
    Par défaut
    Citation Envoyé par bibx Voir le message
    Feriaman : Que represente x1 et x2 ???
    Les abscisses des centres des cercles.

    Note : prendre du temps à rédiger ses notes, c'est s'assurer à la fois que les ses interlocuteurs prendrons du temps à répondre, et qu'ils auront bien compris.

  11. #11
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par Feriaman Voir le message
    Les abscisses des centres des cercles.
    Si il parle de disques, il est au moins dans un plan. Donc il faut calculer la distance entre les deux centres, et pas une différence d'abscisses.

    Si tu nous montrais ton code bibx, ça irait sans doute plus vite...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    Voici mon bout de code ...

    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;
    	}
    Bon c'est schematise lool

  13. #13
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     		Point centreCercle1 = null;
     		[...]
     		distCentre = calcDist(centreCercle1,centreCercle2);
    avec un argument null, c'est sûr que ça ne va pas "marcher"
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    		// celui la est fixe
    		centreCible =  new Point(150,150);
    Tellement fixe qu'il n'est utilisé nulle part...

    Citation Envoyé par bibx
    Bon c'est schematise lool
    tu entends quoi par là?
    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).
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    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

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    Bon je n'y arrive pas je suis trop mauvais je bloque ...

    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;
    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

    Mais ca marche pas

    Merci de m'aider SVP

  16. #16
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par bibx
    Mais ca marche pas
    On est super avancé avec ça comme précision...
    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...
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    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 fait voici la methode paintComponent
    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));
    		}
    	}
    Au click sur la cible je definie un evenement mouseClick qui ajoute des impactes grace a la methode add de JPanel.
    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)
    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;
    	}
    Le probleme :
    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

  18. #18
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    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).
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 124
    Points : 76
    Points
    76
    Par défaut
    J'attend avec impatience ce que tu vas me proposer

    Merci pour ton aide.

    ++

  20. #20
    Expert éminent

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 813
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 813
    Points : 7 641
    Points
    7 641
    Par défaut
    Citation Envoyé par bibx Voir le message
    J'attend avec impatience ce que tu vas me proposer
    Je t'ai déjà proposé quelque chose ce midi, teste déjà si ça résoud le problème!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/04/2007, 15h25
  2. Comment savoir que deux dates sont égales ?
    Par bassim dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 19/12/2006, 19h36
  3. [C#] Comment savoir si deux fichiers sont identiques
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 6
    Dernier message: 06/11/2006, 15h59
  4. savoir si deux IXMLNode correspondent au même noeud ?
    Par Bruno75 dans le forum Langage
    Réponses: 8
    Dernier message: 26/10/2005, 11h02
  5. Réponses: 4
    Dernier message: 28/02/2005, 18h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo