Partage
  • Partager sur Facebook
  • Partager sur Twitter

Calcul d'angle & trigonométrie sous javascript

Calculer un angle.

Sujet résolu
    19 août 2011 à 0:21:02

    Bonsoir, alors voilà 2 jours que je me creuse la tête sur un petit truc et je n'arrive pas à en trouver le bout ...

    alors je vous explique mon soucis : (Pour ceux qui sont fort en math ou qui n'ont pas sécher leurs cours de 4 eme ^^)

    Je suis en train de programmer un jeux en javascript/php (avec socket) et là je dois faire en sorte que javascript me renvois l'angle de l'écran vers lequelle est orienté la souris ...

    mais voilà, même en cherchant les cours sur internet et en appliquant la solution je seche toujours ...

    Je dispose de 2 informations, X et Y

    donc X est obtenu par la différence entre la position de la souris sur un DIV et la position de la souris par rapport à l'écran et de même pour Y

    X pour l'axe horizontal et Y pour l'axe vertical.

    lorsque X est négative, c'est que la souris est à gauche
    lorsque X est positive c'est que la souris se trouve à droite
    lorsque Y est négative, c'est que la souris se trouve en bas
    lorsque Y est positive, c'est que la souris se trouve en haut.

    j'ai donc découpé mon écran en 4 zones comme vous pouvez le voir sur la screen ci-dessous :
    Image utilisateur

    donc en gros j'ai l'angle droit qui se situe en haut à droite du centre, à partir duquelle est calculé X et Y

    si par exemple je positione ma souris à 50x, 50y je sais que mon angle sera à 45°, mais je ne vois pas comment faire pour calculer le ° par rapport X et Y ?

    Petit exemples de position de la souris :

    x50 : y50 => 45° (Rapport X-Y : 1/1)
    x50 : y25 => 67.5° (Rapport X-Y : 1/0.5)
    x25 : y50 => 22,5°(Rapport X-Y : 0.5/1)

    donc j'en conclus donc ...

    si X est égale à Y donc l'angle est égale à 45° (soit la moitié de 90° logique ...)

    si X est inférieur à Y donc l'angle se situe inférieur ou égale à 22.5°
    si X est supérieur à Y donc l'angle se situe supérieur ou égale à 67.5°

    CQFD

    quelqu'un à une idée pour transformer ça en formule oO ?

    vrai casse tête pour moi :/

    je serais infiniment reconnaissant à la personne qui voudras bien éclairer ma lenterne :)

    Petite hypothèse :

    Comme vous le voyez sur l'écran, les 4 zones sont divisé en 2 sous zones, contenant chacune 2 triangles réctangles aussi, la formule avec cos peut s'appliqué aux 2 autres triangles vu que l'angle droit se trouveras au côté opposé au centre, l'hypothénus (côté le plus grand du triangle réctangle opposé à l'angle), sera donc celui qui pointera du centre vers la position de la souris

    EDIT : trouvé sans formule, je poste pour ceux que ça pourrait aider :

    if (DIFF_X < 0)
    					{
    						angle += 90;
    						// Souris vers la droite
    							
    						if (DIFF_Y < 0)
    						{
    								if (Math.abs(DIFF_X) == Math.abs(DIFF_Y))
    								{
    									angle = 90;
    								}
    								else if (Math.abs(DIFF_X) > Math.abs(DIFF_Y)) // < 22.5
    								{
    									angle = (45+(45-(Math.abs(DIFF_Y)/Math.abs(DIFF_X)*45)));
    								}
    								else if (Math.abs(DIFF_X) < Math.abs(DIFF_Y)) // > 67.5
    								{
    									angle = Math.abs(DIFF_X)/Math.abs(DIFF_Y)*45;
    								}
    								
    								angle = 90-angle;
    								angle += 90;
    							
    						}
    						else if (DIFF_Y > 0)
    						{
    						
    								if (Math.abs(DIFF_X) == Math.abs(DIFF_Y))
    								{
    									angle = 45;
    								}
    								else if (Math.abs(DIFF_X) > Math.abs(DIFF_Y)) // < 22.5
    								{
    									angle = (45+(45-(Math.abs(DIFF_Y)/Math.abs(DIFF_X)*45)));
    								}
    								else if (Math.abs(DIFF_X) < Math.abs(DIFF_Y)) // > 67.5
    								{
    									angle = Math.abs(DIFF_X)/Math.abs(DIFF_Y)*45;
    								}
    								
    								
    								
    						}
    					}
    					else if (DIFF_X > 0)
    					{
    						angle += 180;
    						// Souris vers la gauche
    						if (DIFF_Y < 0)
    						{
    							angle += 90;
    							// Souris vers le bas
    							
    								
    								
    						
    								if (Math.abs(DIFF_X) == Math.abs(DIFF_Y))
    								{
    									angle = 180;
    								}
    								else if (Math.abs(DIFF_X) > Math.abs(DIFF_Y)) // < 22.5
    								{
    									angle = (45+(45-(Math.abs(DIFF_Y)/Math.abs(DIFF_X)*45)));
    								}
    								else if (Math.abs(DIFF_X) < Math.abs(DIFF_Y)) // > 67.5
    								{
    									angle = Math.abs(DIFF_X)/Math.abs(DIFF_Y)*45;
    								}
    								
    								angle += 180;
    						}
    						else if (DIFF_Y > 0)
    						{
    						
    								if (Math.abs(DIFF_X) == Math.abs(DIFF_Y))
    								{
    									angle = 0;
    								}
    								else if (Math.abs(DIFF_X) > Math.abs(DIFF_Y)) // < 22.5
    								{
    									angle = (45+(45-(Math.abs(DIFF_Y)/Math.abs(DIFF_X)*45)));
    								}
    								else if (Math.abs(DIFF_X) < Math.abs(DIFF_Y)) // > 67.5
    								{
    									angle = Math.abs(DIFF_X)/Math.abs(DIFF_Y)*45;
    								}
    								
    								angle = 90-angle;
    								angle += 270;
    						}
    					}
    					
    					
    						if (angle >= 360)
    						{
    							angle = 0;
    						}
    						
    						angle = Math.floor(angle/10)*10;
    


    voilà, vous avez l'angle à 360° divisé par 10 :) donc 36 possibilitées
    • Partager sur Facebook
    • Partager sur Twitter
      19 août 2011 à 10:54:37

      Un seul mot, trigonométrie !
      Tu connais, t'as déjà appris ?
      Parce que ta solution est pour le moins hasardeuse !
      http://fr.wikipedia.org/wiki/Cercle_trigonom%C3%A9trique
      Et en JS, y a de belles fonctions qui te donnent l'angle voulu (en ° Radians, soit dit en passant, faudra pas oublier de convertir), sans trop te casser la tête.
      • Partager sur Facebook
      • Partager sur Twitter

      Calcul d'angle & trigonométrie sous javascript

      × 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