[Résolu]Collision de projectiles

Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

[Résolu]Collision de projectiles

par alexandre_h » 10 Mai 2008, 17:12

Bonjour à tous,

Je profite de mon premier message pour me présenter rapidement, je m'appel Alexandre et je suis étudiant en informatique. Je travail en fait sur un projet de réalité virtuelle et je cherche à faire quelque chose que je pensais simple mais qui commence sérieusement à me taper sur le système :marteau:

Je cherche à calculer la plage de temps pendant laquelle 2 projectiles circulaires de rayon R lancés à des vitesses instantanées V1 et V2 depuis des points P1 et P2 sont en collision.

Je suis arrivé à l'équation suivante que j'espère correcte :

( (P1 + tV1) - (P2 + tV2) )² < (2R)²

Je suppose que le résultat de cette équation doit être le résultat d'une équation du second degré avec des racines correspondantes au 2 instants t pour lesquels les projectiles entrent et sortent de collision, avec l'impossibilité de la calculer dans le cas ou les vecteurs vitesses sont égaux.

Mais j'imagine que je fais des opérations sur les vecteurs qui ne sont pas autorisées. L'un de vous aurait il le temps et les connaissances pour m'aider à résoudre ce problème ?


Merci à vous,

Alex



Avatar de l’utilisateur
mathelot
Habitué(e)
Messages: 13685
Enregistré le: 08 Juin 2006, 08:55

un peu de cinématique

par mathelot » 10 Mai 2008, 19:27

bjr,
on assimile les solides à deux points M1 et M2 assujettis sur
des cercles de centre A(a,b) et B(c,d).

la trajectoire des points sont connus par la loi de leur angles polaires
et , fonctions quelconques
du temps.

Les deux mobiles sont en collision s'ils ont même coordonnées à un instant t:



d'où



cette équation d'inconnue t se résoud avec la fonction si l'on connait les angles polaires en fonction du temps.

alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 10 Mai 2008, 19:33

Hum, je ne suis pas sur d'avoir bien saisi toute ta réponse mais je peux ajouter trois choses :

- Pourquoi faire intervenir des coordonnées polaires alors que la trajectoire des projectiles est rectiligne ? (pas de freinage rien, ça va tout droit, et ça avance linéairement :id:)

- L'affirmation : "Les deux mobiles sont en collision s'ils ont même coordonnées à un instant t" me semble erronée, dans la mesure ou elle ne fait pas intervenir le rayon des projectiles !

- Le problème se passe bien entendu dans le plan, vous l'aurez compris je crois.

Avatar de l’utilisateur
mathelot
Habitué(e)
Messages: 13685
Enregistré le: 08 Juin 2006, 08:55

Données initiales

par mathelot » 10 Mai 2008, 19:37

Les vecteurs vitesse sont donnés par:






à l'instant initial , le vecteur-vitesse
V1 a pour coordonnées
V2 a pour coordonnées
et le point P1 a pour coordonnées

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 11:17

par Jean_Luc » 10 Mai 2008, 20:34

Salut,

[quote="alexandre_h"]
Je suis arrivé à l'équation suivante que j'espère correcte :

( (P1 + tV1) - (P2 + tV2) )² pas de collision.
Mais attention, cette équation est une équation vectorielle.



La base est
Le "au carré" dans le premier membre désigne le produit scalaire.

Avatar de l’utilisateur
mathelot
Habitué(e)
Messages: 13685
Enregistré le: 08 Juin 2006, 08:55

par mathelot » 10 Mai 2008, 20:41

alexandre_h a écrit:Je cherche à calculer la plage de temps pendant laquelle 2 projectiles circulaires de rayon R



ah, j'ai compris: tu as écrit "solides circulaires" pour "solides sphériques". :hum:

alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 10 Mai 2008, 22:30

mathelot a écrit:ah, j'ai compris: tu as écrit "solides circulaires" pour "solides sphériques". :hum:


Disons que ce sont des cercles dans le plan :) désolé.

Sinon @Jean_Luc j'ai bien compris (et c'est la prédiction que j'avais faite) que si les vecteurs vitesses sont égaux, l'équation ne peut être résolue.

L'équation que tu donnes reviens à ce que j'ai trouvé, mais je n'arrive pas à en déduire correctement les solutions t1 et t2 !

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 11:17

par Jean_Luc » 10 Mai 2008, 23:14

alexandre_h a écrit:L'équation que tu donnes reviens à ce que j'ai trouvé, mais je n'arrive pas à en déduire correctement les solutions t1 et t2 !


Ben c'est bizarre...
Pourrais-tu poster ton code (ou tes equations) ?

alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 11 Mai 2008, 01:30

Bonsoir,

Alors je suis parti de :

( (P1 + tV1) - (P2 + tV2) )² < (2R)²

J'ai posé (2R)² = K

Ensuite j'ai fais :

(P1+tV1)² + (P2+tV2)² - 2*(P1+tV1)(P2+tV2) < K

t²V1² + t²V2 - 2t²V1V2 + 2tP1V1 + 2T P2V2 - 2tP1V2 - 2tV1P2 - 2P1P2 + P1² + P2² < K

t²(V1² + V2² - 2V1V2) + 2t(P1V1 + P2V2 - P1V2 - V1P2) + (P1² + P2² - 2P1P2 - K) < 0

t²(V1 - V2)² + 2t(P1-P2)(V1 - V2) + (P1 - P2)² - K < 0

Comme les coef sont des réels j'ai utilise b² - 4ac pour résoudre l'équation :

delta = 4 * (P1-P2)(V1 - V2)(P1-P2)(V1 - V2) - 4*(V1 - V2)²((P1 - P2)² - K)

Le problème c'est que j'obtiens des delta négatifs alors qu'il devrait y avoir collision (donc une solution !). Avec certains jeu d'essais j'obtiens en revanche quelque chose de plausible... bizarre donc. Il doit y avoir une opération que j'ai mal réalisée.

L'algorithme que j'ai réalisé résultant de cette résolution ne marche pas correctement.

Si vous trouve la faille ça me retirerait une grosse épine du pied :)

Merci à vous !

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 11:17

par Jean_Luc » 11 Mai 2008, 01:55

OK,

Je réecris cette équation sous forme vectorielle.


Elle ressemble à la tienne, je fais faire quelques tests pour voir...

alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 11 Mai 2008, 02:04

Merci beaucoup !

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 11:17

par Jean_Luc » 11 Mai 2008, 02:48

OK, j'ai fait des tests et pour moi ça marche.
Image

Le code que tu comprendras sans problème:
Code: Tout sélectionner

  public double dot(Point2D.Double P1,Point2D.Double P2) {
    return P1.x*P2.x + P1.y*P2.y;
  }

  public Point2D.Double v(Point2D.Double P1,Point2D.Double P2) {
    return new Point2D.Double(P2.x-P1.x, P2.y-P1.y);
  }

    double R = 10.0;
    Point2D.Double Vnull = new Point2D.Double(0.0,0.0);
    Point2D.Double P1 = new Point2D.Double(100,100);
    Point2D.Double P2 = new Point2D.Double(200,170);
    Point2D.Double V1 = new Point2D.Double(10,10);
    Point2D.Double V2 = new Point2D.Double(-12,-10);
    paintPart(g,P1,V1,R);
    paintPart(g,P2,V2,R);

    Point2D.Double V2V1 = v(V2,V1);
    Point2D.Double P2P1 = v(P2,P1);
    double a = dot(V2V1,V2V1);
    double b = 2.0*dot(V2V1,P2P1);
    double c = dot(P2P1,P2P1) - 4.0*R*R;

    double delta = b*b - 4.0*a*c;
    if( delta>0.0 ) {
      double sD = Math.sqrt(delta);
      double t1 = (-b-sD)/(2.0*a);
      double t2 = (-b+sD)/(2.0*a);
      System.out.println("Col at "+t1+","+t2);
      g.setColor(Color.RED);
      double xC1 = P1.x + t1*V1.x;
      double yC1 = P1.y + t1*V1.y;
      double xC2 = P2.x + t1*V2.x;
      double yC2 = P2.y + t1*V2.y;
      double xCol = (xC1 + xC2)/2.0;
      double yCol = (yC1 + yC2)/2.0;
      g.drawLine((int)(xCol-2.0),(int)(yCol-2.0),(int)(xCol+2.0),(int)(yCol+2.0));
      g.drawLine((int)(xCol-2.0),(int)(yCol+2.0),(int)(xCol+2.0),(int)(yCol-2.0));
      paintPart(g,new Point2D.Double(xC1,yC1),Vnull,R);
      paintPart(g,new Point2D.Double(xC2,yC2),Vnull,R);
    } else {
      System.out.println("No col");
    }


alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 11 Mai 2008, 03:13

Merci d'avoir vérifié çà !

Donc selon toi ceci marche bien, mais c'est exactement ce que j'ai trouvé.

Je vais retourner vérifier mes jeux d'essais... j'ai peu être commis une erreur ailleurs...

Merci beaucoup en tout cas.

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 11:17

par Jean_Luc » 11 Mai 2008, 03:42

De rien :we:

Pour moi, aucun doute, cette solution marche. Il faut quand même
détecter la collision la plus proche (en vue d'un calcul de rebond éventuel)
et eliminer les solution négatives.
Mais bon, la ça depends de ton besoin.

alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 11 Mai 2008, 03:51

Le reste est dans la poche ! Soit le t n'est pas calculable s'il n'y a pas de collision, soit t < 0 si la collision à lieu "avant" si on peut dire. En fait j'essaie de prédire si un mobile entrera en collision dans les T secondes, mais rien ne viendra après.

Sinon l'instant t de l'entré en collision sera toujours (-b-sqrt(delta))/2a non ?

Le problème venait en fait d'un jeu d'essai foireux que j'ai réutilisé sans le vérifier à plusieurs reprises... grossière erreur.

Merci beaucoup !

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 11:17

par Jean_Luc » 11 Mai 2008, 03:56

alexandre_h a écrit:Sinon la solution la plus proche sera toujours (-b-sqrt(delta))/2a non ?


Pas sur, b peut être négatif ou positif, non ?? j'commence à être fatigué là....

alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 11 Mai 2008, 04:25

Hum a priori oui...

Mais on retranche une valeur toujours positive (racine(delta)/2a) donc ça devrait je pense être toujours la valeur inférieur. Comme on ne se soucis pas des t négatif ce doit être bon.

Enfin pour mon application je pense que ça importe peu de savoir si t est l'entrée en collision ou la sortie, étant donnée que c'est une application temps réelle je dois essayer de simplifier autant que possible.

Jean_Luc
Membre Relatif
Messages: 158
Enregistré le: 25 Avr 2008, 11:17

par Jean_Luc » 11 Mai 2008, 04:31

Si tu veux juste savoir si il y a eu collision ou non, dans ce cas tu testes juste
que t1>0.0 || t2>0.0. si tu veux vraiment les coordonnées du point de contact
je pense qu'il faut faire:
if( t1>0.0 && t2>0.0 ) {
t = MIN(t1,t2);
} else if( t1>0.0 && t2<0.0 ) {
t = t1;
} else if( t1<0.0 && t2>0.0 ) {
t = t2;
}

EDIT: Corrigé

alexandre_h
Membre Naturel
Messages: 10
Enregistré le: 10 Mai 2008, 17:02

par alexandre_h » 11 Mai 2008, 04:45

Oui je vois très bien !

Merci pour tout en tout cas :) je vais pas tarder à dormir maintenant :p 3j non stop :D

Merci beaucoup pour ton/votre aide !

Dominique Lefebvre
Membre Légendaire
Messages: 8007
Enregistré le: 03 Déc 2005, 13:00

par Dominique Lefebvre » 11 Mai 2008, 11:12

alexandre_h a écrit:Bonjour à tous,

Je profite de mon premier message pour me présenter rapidement, je m'appel Alexandre et je suis étudiant en informatique. Je travail en fait sur un projet de réalité virtuelle et je cherche à faire quelque chose que je pensais simple mais qui commence sérieusement à me taper sur le système :marteau:

Je cherche à calculer la plage de temps pendant laquelle 2 projectiles circulaires de rayon R lancés à des vitesses instantanées V1 et V2 depuis des points P1 et P2 sont en collision.

Je suis arrivé à l'équation suivante que j'espère correcte :

( (P1 + tV1) - (P2 + tV2) )² < (2R)²

Je suppose que le résultat de cette équation doit être le résultat d'une équation du second degré avec des racines correspondantes au 2 instants t pour lesquels les projectiles entrent et sortent de collision, avec l'impossibilité de la calculer dans le cas ou les vecteurs vitesses sont égaux.

Mais j'imagine que je fais des opérations sur les vecteurs qui ne sont pas autorisées. L'un de vous aurait il le temps et les connaissances pour m'aider à résoudre ce problème ?


Merci à vous,

Alex

Bonjour,

Sur le plan strictement physique, j'ai l'impression que tu considères que la collision est parfaitement élastique, et donc qu'il n'y a aucune déformation des solides.
Sous cette hypothèse, je me demande comment tu trouves un temps non nul de contact entre les deux solides en collision? Dans le cas d'une collision parfaitement élastique (ce qui n'existe pas dans la pratique), la durée du choc tend vers 0.

Si tu veux coller à la réalité et calculer le temps de contact pendant le choc, tu dois évaluer la déformation des solides.

Retourner vers ✯✎ Supérieur

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 15 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