Partage
  • Partager sur Facebook
  • Partager sur Twitter

colision entre un arc de cercle et un cercle

Sujet résolu
    4 janvier 2011 à 10:55:34

    Bonjour à tous.
    Je suis actuellement occupé à la création d'un petit jeu utilisant la balise canvas pour en tester les capacités et je me bloque à un problème mathématique.
    J'ai un arc de cercle (de 90°) et j'aimerais savoir quand est-ce qu'il rentre en colision avec un cercle qui se déplace sur mon canvas.
    J'ai suivit le tutoriel disponible sur le sdz sur le problème des colisions qui est cela dit en passant, très bien fait :) .
    Par contre je n'ai pas réussi à adapter la colision entre deux cercles à mon cas qui est d'un arc de cercle sur un cercle.
    Pour schématiser ça, on peux voir l'arc de cercle comme un mur qui empêche le cercle (boule) de passer.
    je connais le centre de l'arc de cercle,son rayon ainsi que son angle de début et de fin (en radian) et le centre de la boule ainsi que son rayon.

    Auriez vous des pistes de réflexion pour m'aider à régler mon problème s'il vous plait? J'ai posté ici car je développe en JS mais je devrais peut être poster dans un forum plus spécialiser aux mathématiques.
    • Partager sur Facebook
    • Partager sur Twitter
      4 janvier 2011 à 11:16:44

      Salut,
      Je pense que pour faire ce que tu veux le plus précisément possible, il va te falloir vérifier chaque pixel du tour de ton cercle et de ton arc de cercle, et ensuite faire des comparaisons ( > ; < ) pour savoir s'il se trouve à l'intérieur. Il faudra savoir l'orientation de ton arc de cercle, aussi, si tu peux le tourner.

      Au rendez-vous; Pythagore pour savoir où se trouvera chaque point.
      Je suis pas sûr d'être clair :/
      • Partager sur Facebook
      • Partager sur Twitter
        4 janvier 2011 à 13:02:47

        Personnellement, j'aurais fait un truc plus simple (enfin je crois que c'est plus simple).

        Tu mesures la distance entre les 2 centres ainsi que l'angle de ce segment.
        Si l'angle est inclus dans l'intervalle [angle de début, angle de fin] et que la longueur de ce segment est <=(rayon arc+rayon boule), alors il y a collision.
        • Partager sur Facebook
        • Partager sur Twitter
          4 janvier 2011 à 14:44:40

          merci birdy42 j'avais pensé a cette solution mais je pense que le pauvre navigateur va pleurer devant la somme de calcul qu'il devra faire toutes les 10ms :) .

          par contre la solution de Golmote me plait bien. Je sais faire le test de collision entre deux cercles mais pas entre un arc et un cercle, je n'avais pas pensé a calculer l'angle formé par les deux cercles et un axe quelconque. Ca devrait régler mon problème.
          Merci pour la solution je test ça et je vous tiens au courant :).
          • Partager sur Facebook
          • Partager sur Twitter
            5 janvier 2011 à 10:52:12

            Voici les code des fonctions que j'ai créés. ça fonctionne, me reste plus qu'à optimiser un petit peu.
            la première fonction test la colision avec un cercle, la seconde test la colision avec un arc de cercle. Je n'appel la seconde que si la première retourne vrai. Je commente brièvement la seconde fonction à la fin du post.
            function colision(x1, y1, r1, x2, y2, r2){
            	var retour = false;
            
            	var distance = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2);
            	if(distance < (r1+r2)*(r1+r2))
            		retour = true;
            	
            	return retour;
            }
            

            function colisionMur(x1, y1, x2, y2, a1, a2){
            	var retour = false;
            	
            	//calcul de l'angle (C: centre, b: centre boule, a: intersection abscisse
            	if(y1 < y2){ 
            		if(x1 < x2){
            			var AB = y2 - y1;
            			var AC = x2 - x1;
            		}else{
            			var AB = y2 - y1;
            			var AC = x1 - x2;
            		}
            	}else{
            		if(x1 < x2){
            			var AB = y1 - y2;
            			var AC = x2 - x1;
            		}else{
            			var AB = y1 - y2;
            			var AC = x1 - x2;
            		}
            	}
            	var BC = Math.sqrt((AB*AB)+(AC*AC));
            	var acos_ABC = Math.acos(AB/BC);
            	var ABC = acos_ABC * 180 / Math.PI;
            	var ACB = 90 - ABC;//somme des angles d'un triangle = 180 soit 180 - 90 - ABC
            	
            	if(y1 < y2){ 
            		if(x1 < x2)
            			ACB = 180 + ACB;
            		else
            			ACB = 360 - ACB;
            	}else{
            		if(x1 < x2)
            			ACB = 180 - ACB;
            	}
            	
            	ACB = (Math.PI/180) * ACB;
            	
            	if(a1 < a2){
            		if(a1 < ACB && a2 > ACB)
            			retour = true;
            	}else{
            		if(y1 < y2)
            			a2 = 360 + a2;
            		else
            			a1 = - (360 - a1);
            		if(a1 < ACB && a2 > ACB)
            			retour = true;
            	}
            	
            	return retour;
            }
            

            La function retourne true si il y a colision false si non.
            x1 et y1 sont les coordonnées du centre de la balle.
            x2 et y2 sont les coordonnées du centre de l'arc de cercle.
            a1 et a2 sont respectivement l'angle de debut et de fin de l'arc de cercle.

            Premièrement on à le triangle ABC avec C de coordonnées x2 et y2, B de coordonnées x1 et y1 et A le point d'intersection avec l'axe des abscisses (l'axe ayant pour origine le centre de l'arc du cercle donc x2 et y2).
            On calcul les coté AB ET AC, suivant dans quel cadran la balle se trouve, le calcul n'est pas le même. On calcul ensuite le dernier coté grâce au théorème de Pythagore.
            Un peu de trigonométrie pour avoir l'angle ABC et on fait un petit calcul pour que l'angle soit pris dans le même interval que ceux de l'arc de cercle, c'est à dire avec pour point de départ l'axe des abscisses et sens horaire.
            Un dernier test pour savoir si l'arc de cercle n'est pas a cheval sur le point de départ et on vérifie que l'angle calculé est compris ou non dan l'arc de cercle.

            Merci de votre aide!
            • Partager sur Facebook
            • Partager sur Twitter

            colision entre un arc de cercle et un cercle

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown