Calculer une trajectoire d'interception

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
Titan.
Messages: 4
Enregistré le: 10 Mar 2013, 20:12

Calculer une trajectoire d'interception

par Titan. » 10 Mar 2013, 20:22

Bonjour,
j'ai un problème de math que je ne parvient pas à résoudre dans mon application,
j'ai une IA qui tir sur un joueur en mouvement, je cherche à calculer le vecteur direction du tir.
voici un shema:
Image
voici l'état de ma réflexion:

je dispose de:
-la position initial du joueur jp0
-la direction du joueur jd
-la vitesse du joueur jv

-la position initial du projectile pp0
-la vitesse de mon projectile pv

je cherche:
- la direction que doit prendre mon projectile pour intercepter le joueur s'il ne change pas de trajectoire. D
- nécessairement le temps de parcours, pour l'équation T

soit:
position à l'instant T du joueur: jp(T)
position à l'instant T du projectile: pp(T)

j'arrive à l'ensemble d'équation:
jp(T) = jp(0) + jd * jv * T;
pp(T) = pp(0) + D * pv * T ;

or je pose jp(T) = pp(T) puisque je cherche le point d'intersection,

je combine donc mes 2 équations:
jp(0) + jd * jv * T = pp(0) + D * pv * T
soit:
D = (jd * jv * T + jp(0) - pp(0)) / pv * T

j'arrive à exprimer mon vecteur direction en fonction du temps nécessaire au projectile pour atteindre ma cible. mais j'ai l'impression qu'il manque encore des donnée pour que ce soit soluble.
J'ai aussi l'impression d'avoir fait une erreur puisque il y a logiquement des cas sans solution (notamment lorsque la vitesse du joueur et supérieur à la vitesse du projectile) et je trouve ça bizarre comme résultat.

une idée ?



nodjim
Membre Complexe
Messages: 3241
Enregistré le: 24 Avr 2009, 17:35

par nodjim » 10 Mar 2013, 21:23

Comme tu connais l'angle a entre le segment qui rejoint les 2 joueurs au départ et la direction du fuyart, tu peux utiliser cette formule du triangle quelconque:
a²=b²+c²-2bc cosa, a angle entre B et C.
Tu sais aussi que, à l'interception, il y a un rapport de longueur k entre les 2 trajectoires (segments), ce rapport k étant le rapport de vitesse.
Avec ça tu as tout.

Titan.
Messages: 4
Enregistré le: 10 Mar 2013, 20:12

par Titan. » 11 Mar 2013, 01:25

merci,
j'avais pensé que la longueur des segments dépendait de la vitesse, et accesoirement j'était partit un peut trop loin, un bête Al-Kashi devrait résoudre le problème, effectivement.

Titan.
Messages: 4
Enregistré le: 10 Mar 2013, 20:12

par Titan. » 11 Mar 2013, 20:19

Bonjour,
théoriquement, avec un coté, un angle et un rapport je peut calculer les 2 autres cotés,
et avec les 3 cotés je peut calculer n'importe quel angle.

j'ai un peut avancé mais j'arrive à quelque chose d'illogique,

j'ai l'ensemble
c² = a² + b² - 2ca cos B et b = r c //avec r rapport de vitesse
avec ces informations je remplace et je déplace mes variables pour aboutir au polynôme du second degré:
(1-r²) c² + (2 a cos B) c + (-a²) = 0 //je cherche c d'abord

arriver à ça, je ressort un bouquin de math :lol3: , qui me rappelle gentiment qu'une équation du second degré à 2 solutions :doh: . Donc je comprend pas, comment la distance parcouru par le joueur avant d'être percuté par le projectile (puisque c'est ce que représente c), pourrait avoir 2 valeurs différente ?

Avatar de l’utilisateur
Lostounet
Admin
Messages: 9665
Enregistré le: 16 Mai 2009, 12:00

par Lostounet » 11 Mar 2013, 20:47

C'est à toi de déterminer les solutions valables dans le contexte de résolution de ton équation. Y'a-t-il des conditions sur c? Si c'est une distance, alors tu dois uniquement retenir les valeurs positives de c (je suppose que nous ne parlons pas d'une distance "algébrique").

Enfin, ça dépend du signe des solutions: http://www.wolframalpha.com/input/?i=%281-r%C2%B2%29+x%C2%B2+%2B+%282+a+cos+B%29+x+%2B+%28-a%C2%B2%29+%3D+0

Par exemple, pour trouver un entier naturel dont le carré diminué de 10 donne 90, nous pouvons poser l'équation:
n^2 - 10 = 90
n^2 = 100
n = 10 ou n = -10

Seul n = 10 est valable, comme nous cherchons un entier naturel >0


Ps: Ma réponse ne sert qu'en première approche... Il est bien possible de trouver deux solutions positives. Je laisse les plus compétents s'attaquer à ce problème de physique.
Merci de ne pas m'envoyer de messages privés pour répondre à des questions mathématiques ou pour supprimer votre compte.

Titan.
Messages: 4
Enregistré le: 10 Mar 2013, 20:12

par Titan. » 12 Mar 2013, 02:08

merci de votre aide, je ne sais pas si vous saurez m'aider pour la suite de mes problème,
voici mon code:
Code: Tout sélectionner
        private Vector2 calculateAttackDirection()
        {
            float a = (float)Math.Sqrt(target.getSquaredDistance(position));    // distance joueur - IA
            float b;                                                            // distance parcouru par le projectile
            float c;                                                            // distance parcouru par le joueur
            float B = (float)Math.Acos(target.Direction.X);                     // direction du joueur
            float C;                                                            // direction du tir
            float Vc = target.MoveSpeed;                                        // vitesse du joueur
            float Vb = projectileSpeed;                                         // vitesse du projectile

            float cosB = (float)Math.Cos(B);                                    // helper cos(B)
            float r = Vc / Vb;                                                  // helper rapport Vc / Vb

            // (1 - Vc²/Vb²) c² + (2a cosB) c + (-a) = 0
            float discriminant = (2 * a * cosB) * (2 * a * cosB) + 4 * a * (1 - r * r); // (2acosB)² - 4 * (1-Vc²/Vb²) * -a
            if (discriminant = 0 ? c1 : c2; // on garde le c positif
            b = r * c; // on calcul b à l'aide du rapport de longueur
            C = (float)Math.Acos((a * a + b * b - c * c) / 2 * a * b); // al-kashi pour trouver l'angle à partir des 3 longueurs
            return new Vector2((float)Math.Cos(C), (float) Math.Sin(C));
        }

j'obtient c1 et c2 toujours négatif, j'ai un probléme d'angle orienté je pense vu que je part du principe que angle = acos(cos(angle)) et que je cherche à obtenir un vecteur directeur, j'ai pas encore trop cherché comment le résoudre, mais je devrait simplement tiré "en miroir" dans la mauvaise direction si le probléme venait que de la a mon avis, c'est beaucoup demander je pense, mais si vous voyez une autre erreur dans cette resolution ça m'intérésse.

sinon j'ai peut être trouvé une approximation intéressante sur un autre forum:
Basically, the two factors are the speed of the target and the time it will take the attacker to get there. If we ignore the change in distance caused by the target's movement (moving away or approaching) then it hopefully becomes straightforward, and probably doesn't lose much accuracy since a target approaching or moving away will move less laterally anyway, so is easier to hit.

si le résultat est acceptable je vais m'en contenter et arrêter de me faire du mal :(, si un jour je suis en 3D avec un projectile soumis à la gravité, ralentit par les frottement de l'air et qui peut ricocher, je me suicide. ><

Valentin03
Membre Relatif
Messages: 429
Enregistré le: 23 Déc 2012, 14:08

par Valentin03 » 13 Mar 2013, 00:31

Bonjour Titan,
Si cela t'intéresse, j'ai un code d'interception de missile en applesoft (sorte de basic ancestral) .
Si tu me donne ton mail par MP, je le scanne et te l'envoie en pièce jointe.
Il fait à la louche dans les 300 lignes. (2 pages, à 3,7Mo la page)
Je ne sais pas si ça dépasse ou pas la limite de poids. ....Salut.

Nicoooo
Messages: 1
Enregistré le: 19 Jan 2020, 12:41

Re: Calculer une trajectoire d'interception

par Nicoooo » 19 Jan 2020, 12:52

Bonjour Titan,

je viens de lire avec attention ton message car je suis avec exactement le même problème que toi à savoir que j'ai:
un bateau A (position et vecteur vitesse connus)
un autre bateau B (position connue, module vitesse connu)

Je cherche à calculer le point d'interception des 2 bateaux, en d'autre terme la direction que doit prendre le bateau B pour intercepter le bateau A. (je néglige le temps de mise en virage et de rejointe du cap à adopter...)

peux-tu stp m'aider :D ?

Nico

Avatar de l’utilisateur
Sa Majesté
Membre Transcendant
Messages: 6275
Enregistré le: 23 Nov 2007, 15:00

Re: Calculer une trajectoire d'interception

par Sa Majesté » 19 Jan 2020, 18:36

Je doute que Titan, parti il ya bientôt 7 ans, va revenir t'aider ;)

Black Jack

Re: Calculer une trajectoire d'interception

par Black Jack » 21 Jan 2020, 16:17

Nicoooo a écrit:Bonjour Titan,

je viens de lire avec attention ton message car je suis avec exactement le même problème que toi à savoir que j'ai:
un bateau A (position et vecteur vitesse connus)
un autre bateau B (position connue, module vitesse connu)

Je cherche à calculer le point d'interception des 2 bateaux, en d'autre terme la direction que doit prendre le bateau B pour intercepter le bateau A. (je néglige le temps de mise en virage et de rejointe du cap à adopter...)

peux-tu stp m'aider :D ?

Nico



Salut,

Image

Soit A et B les positions initiales (connues) des bateaux A et B
Soit Va la vitesse du bateau A et Vb la vitesse du bateau B (connues)

On connait aussi la direction du bateau A ... et donc on connait ou on peut calculer l'angle alpha.

Il reste à trouver la direction à prendre pour le bateau B (par exemple par l'angle Beta) pour avoir rencontre entre les 2 bateaux (au point R)

Loi des sinus dans le triangle ABR :

Va*t/sin(beta) = Vb*t/sin(alpha)

--> sin(beta) = (Va/Vb) * sin(alpha)

Si on trouve |sin(beta)| > 1, c'est que la rencontre est impossible.
Sinon, la valeur de beta qui convient est celle comprise entre 0 et (Pi - alpha).

8-)

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 7 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite