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

JavaScript Discussion :

Intersection entre 2 cercles


Sujet :

JavaScript

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut Intersection entre 2 cercles
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    function AreCirclesIntersecting(c0,c1) {
     
        x0 = c0['center']['x'];
        y0 = c0['center']['y'];
        r0 = c0['center']['r'];
        x1 = c1['center']['x'];
        y1 = c1['center']['y'];
        r1 = c1['center']['r'];
     
     
        var a, dx, dy, d, h, rx, ry;
        var x2, y2;
     
        /* dx and dy are the vertical and horizontal distances between
         * the circle centers.
         */
        dx = x1 - x0;
        dy = y1 - y0;
     
        /* Determine the straight-line distance between the centers. */
        d = Math.sqrt((dy*dy) + (dx*dx));
     
        /* Check for solvability. */
        if (d > (r0 + r1)) {
            /* no solution. circles do not intersect. */
            return false;
        }
        if (d < Math.abs(r0 - r1)) {
            /* no solution. one circle is contained in the other */
            return false;
        }
     
        /* 'point 2' is the point where the line through the circle
         * intersection points crosses the line between the circle
         * centers.  
         */
     
        /* Determine the distance from point 0 to point 2. */
        a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ;
     
        /* Determine the coordinates of point 2. */
        x2 = x0 + (dx * a/d);
        y2 = y0 + (dy * a/d);
     
        /* Determine the distance from point 2 to either of the
         * intersection points.
         */
        h = Math.sqrt((r0*r0) - (a*a));
     
        /* Now determine the offsets of the intersection points from
         * point 2.
         */
        rx = -dy * (h/d);
        ry = dx * (h/d);
     
        /* Determine the absolute intersection points. */
        var xi = x2 + rx;
        var xi_prime = x2 - rx;
        var yi = y2 + ry;
        var yi_prime = y2 - ry;
     
        return [xi, xi_prime, yi, yi_prime];
     
    }
    const circles = [
        {center: {x: 10.0, y: 10.0}, radius: 5.0},
        {center: {x: 20.0, y: 20.0}, radius: 15.0},
        {center: {x: 20.0, y: 10.0}, radius: 5.0},
        {center: {x: 20.0, y: 25.0}, radius: 7.5},
    ];
     
    const q7_result1 = AreCirclesIntersecting(circles[0], circles[1]);
    console.log(q7_result1); // Expected output: true
     
    const q7_result2 = AreCirclesIntersecting(circles[0], circles[2]);
    console.log(q7_result2); // Expected output: true
     
    const q7_result3 = AreCirclesIntersecting(circles[1], circles[3]);
    console.log(q7_result3); // Expected output: false
     
    const q7_result4 = AreCirclesIntersecting(circles[2], circles[3]);
    console.log(q7_result4); // Expected output: false
    Salut, j'essaye de faire une fonction pour détecter des intersections entre 2 cercles. Si oui il marque true, sinon il marque false, Mais je crois bien que je me suis perdu du coup il n'affiche ce que je veux. Si quelqu'un peut bien m'aider svp . Merci

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 234
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 234
    Points : 15 531
    Points
    15 531
    Par défaut
    nous ne connaissons pas les équations qui vous ont amené a faire ce code. donc le plus rapide est que vous débuguiez en affichant le contenu des variables.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    D'autant plus que s'il ne s'agit que de renvoyer true ou false suivant qu'il y ait ou non une intersection c'est simple :

    • cas 1 : un cercle dans l'autre → si distance entre les centres + le plus petit rayon < plus grand rayon → renvoyer false
    • cas 2 : cercles disjoints et extérieurs l'un à l'autre → si distance entre les centre > somme rayons → renvoyer false
    • cas 3 : cercles non disjoints → dans tous les autres cas → renvoyer true


    Il suffit de faire un dessin.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Donc si j'ai bien compris les deux cas false se résumerait comme ca ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (d > (r0 + r1)) {
            /* no solution. circles do not intersect. */
            return false;
        }
        if (d < Math.abs(r0 - r1)) {
            /* no solution. one circle is contained in the other */
            return false;
        }

  5. #5
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    fais un dessin et cela te paraîtra évident.

    Par exemple pour le cas 1 : Nom : cas1.png
Affichages : 397
Taille : 376,7 Ko

    Tu vois bien que si d (la distance entre les centres) + r1 (le plus petit des deux rayons) est strictement inférieur à r0 (le plus grand des deux rayons) alors il n'y a pas d'intersection.
    Fais des dessins pour le cas 2 et quelques dessins pour les autres cas … et tu comprendras très vite.

    Le trick de la valeur absolu fonctionne évidemment … mais vois-tu pourquoi ?

  6. #6
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    non justement , d'ailleurs c'est pour ca que je me suis perdu . ET je me suis demandé si les quatre dernières lignes de la fonction était nécessaire ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    écris ta propre fonction, n'essaye pas d'en prendre une et de l'adapter alors que tu n'y comprends pas grand chose.
    C'est un exo facile, fais les dessins … tu verras. Tu as tout en main.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Nom : Capture.PNG
Affichages : 358
Taille : 21,1 Ko
    le deuxième cas ressemble à ça ?

  9. #9
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    [...]
    • cas 2 : cercles disjoints et extérieurs l'un à l'autre → si distance entre les centre > somme rayons → renvoyer false


    [...]
    Non, cercles disjoints ( = qui ne se coupent pas ) et extérieurs l'un à l'autre ( = un n'est pas dans l'autre ) …

  10. #10
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Nom : &.PNG
Affichages : 339
Taille : 26,0 Ko

    Ok d'accord donc c'est comme ca ?

    la commence a être clair du coup le code des conditions devraient ressembler à ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if (d +r1 < r0 )
           {
            return false;
           }
        if (d > (r0 + r1) 
          {
            return false;
          }

  11. #11
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    ça commence à ressembler à quelque chose (à l'indentation près). Mais n'essaye pas de le faire tomber en marche par hasard ou par tâtonnements … Il faut comprendre ce que tu veux faire (notre discussion), comment tu peux le faire (mon premier message qui te donnait tout) et comment tu l'implémentes …

    Citation Envoyé par WhiteCrow Voir le message
    D'autant plus que s'il ne s'agit que de renvoyer true ou false suivant qu'il y ait ou non une intersection c'est simple :

    • cas 1 : un cercle dans l'autre → si distance entre les centres + le plus petit rayon < plus grand rayon → renvoyer false
    • cas 2 : cercles disjoints et extérieurs l'un à l'autre → si distance entre les centre > somme rayons → renvoyer false
    • cas 3 : cercles non disjoints → dans tous les autres cas → renvoyer true


    Il suffit de faire un dessin.
    Dans le cas 1 il y a les mots plus petit et plus grand … je ne les vois pas dans ton code.

    Si tu fais un dessin pour le cas 3, peux-tu constater qu'effectivement on n'est ni dans le cas 2 ni dans le cas 1 ?

  12. #12
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup , je crois que j'ai quasiment tous fais de la même façon ? a moins que je me sois trompé en quelque part mais justement je sais pas ou.

  14. #14
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par WhiteCrow Voir le message
    ça commence à ressembler à quelque chose (à l'indentation près). Mais n'essaye pas de le faire tomber en marche par hasard ou par tâtonnements … Il faut comprendre ce que tu veux faire (notre discussion), comment tu peux le faire (mon premier message qui te donnait tout) et comment tu l'implémentes …



    Dans le cas 1 il y a les mots plus petit et plus grand … je ne les vois pas dans ton code.

    Si tu fais un dessin pour le cas 3, peux-tu constater qu'effectivement on n'est ni dans le cas 2 ni dans le cas 1 ?
    plus petit et plus grand ne serait pas ro et r1 ? et pour le 3ème cas : Si d = 0 et r 0 = r 1 alors les cercles coïncident ? Mais je vois pas trop comment le faire en dessin par contre

  15. #15
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Bah non, a priori tu ne sais pas lequel des deux cercles passés en paramètres est celui de plus grand rayon …
    Les trois cas de figures :
    Nom : 3_cas.png
Affichages : 363
Taille : 35,8 Ko

    Le cas bleu est ce que j'ai appelé le cas 2, le cas rouge est le cas 3 et le cas vert est le cas 1.
    Ajoute les rayons, détermine les tests … pour obtenir les minimum m de deux nombres a et b → m=Math.min(a,b) ; pour le max la fonction est Math.max.

  16. #16
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    Le A, B c’est le rayon des cercles ?

  17. #17
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    oui.

  18. #18
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    pour le 1er cas cercle bleu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m=Maths.min(ro,r1), m=Maths.max(r0,r1)
    Nom : Capture.PNG
Affichages : 299
Taille : 30,3 Ko

  19. #19
    Membre expérimenté
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juillet 2020
    Messages
    352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juillet 2020
    Messages : 352
    Points : 1 376
    Points
    1 376
    Par défaut
    Quel est ton niveau en géométrie ? en math ?
    J'ai l'impression que tu ne comprends pas ce que je te raconte, me trompe-je ?

  20. #20
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2021
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2021
    Messages : 27
    Points : 13
    Points
    13
    Par défaut
    assez moyenne dois je dire je vois a peu près mais c'est pas suffisante

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Intersection entre segment et cercle
    Par chadliii dans le forum Mathématiques
    Réponses: 15
    Dernier message: 03/10/2019, 18h52
  2. Calcul des surfaces d'intersections entre les cercles
    Par Midou45 dans le forum Mathématiques
    Réponses: 6
    Dernier message: 14/03/2012, 10h21
  3. Intersection entre droite et un plan
    Par Dark-Water dans le forum Développement 2D, 3D et Jeux
    Réponses: 7
    Dernier message: 24/03/2009, 17h47
  4. Intersection entre 1 droite et un parallélépipède rectangle
    Par mathieu_t dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 25/05/2005, 18h29
  5. Intersection entre 2 triangles?? (3D)
    Par supergrey dans le forum DirectX
    Réponses: 1
    Dernier message: 25/08/2004, 09h22

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