2017-04-23 4 views
1

Je continue de trébucher sur des solutions de jeu/simulation pour trouver de la distance pendant que le temps passe, et ce n'est pas ce que je cherche.Calcul des temps de collision entre deux cercles - Physique

Je cherche une formule O (1) pour calculer le (s) temps d'horloge (0 ou 1 ou 2) dans lequel deux cercles sont exactement à distance r1 + r2 l'un de l'autre. Le temps négatif est possible. Il est possible que deux cercles n'entrent pas en collision, et qu'ils ne puissent pas avoir d'intersection (comme dans 2 voitures "se coupant" en conduisant trop près du milieu de la route dans des directions opposées), ce qui gâche tout mon mx + b solutions. Techniquement, une collision ponctuelle devrait être possible. J'ai environ 100 lignes de code en profondeur, et je suis sûr qu'il doit y avoir un meilleur moyen, et je ne suis même pas sûr si mes cas de test sont corrects ou non. Ma configuration initiale était:

dist(x1+dx1*t, y1+dy1*t, x2+dx2*t, y2+dy2*t) == r1+r2 

En supposant la distance à tout instant t peut être calculé avec Pythagore, je voudrais savoir les deux points dans le temps où la distance entre les centres est précisément la somme des rayons . J'ai résolu pour a, b, et c et appliqué la formule quadratique, et je crois que si je suppose qu'ils étaient des objets fantômes, cela me donnerait le premier moment de collision et le dernier moment de collision, et je pourrais supposer à à chaque instant, ils se chevauchent. Je travaille sous la condition qu'il est impossible que 2 objets se chevauchent à t0, ce qui signifie qu'une collision infinie de "coincé l'un dans l'autre" n'est pas possible. Je filtre également et utilise la manipulation spéciale pour quand la pente est 0 ou infinie, qui fonctionne. J'ai essayé de calculer la distance quand, pour le moment, l'objet 1 est au point d'intersection, c'est la distance de l'objet 2, et de même quand o2 est au point d'intersection, mais cela n'a pas fonctionné car il est possible ils ne sont pas à leur intersection.

J'ai des problèmes lorsque les pentes sont égales, mais de magnitude différente.

Existe-t-il déjà une formule physique/mathématique simple pour cela? Le langage de programmation n'a pas d'importance, le pseudo serait génial, ou n'importe quelle formule mathématique qui n'a pas de symboles complexes (je ne suis pas un math/physicien) ... mais rien d'ordre supérieur (je suppose que python probablement a déjà une méthode de collision (p1, p2)

+0

Est-ce que les objets ont une vitesse constante comme dans votre équation? Si oui, vous devriez simplement pouvoir résoudre le problème pour _t_. Qu'est-ce qui ne fonctionne pas? – pingul

Répondre

1

Il existe une solution simple (-ish). Vous avez déjà mentionné l'utilisation de la formule quadratique, ce qui est un bon début.

D'abord définir votre problème où la formule quadratique peut être utile, dans ce cas, la distance entre les centres, dans le temps.

  • Définissons notre temps t
  • Parce que nous utilisons deux dimensions que nous pouvons appeler nos dimensions x & y
  • Tout d'abord nous allons définir les deux points centraux à t = 0 de nos cercles a & b
  • Définissons aussi notre vitesse à t = 0 de a & b comme u & v respectivement.
  • Enfin, en supposant une constante accélération de a & b comme o & p respectivement.
  • L'équation pour une position le long de toute une dimension (que nous appellerons i) par rapport au temps t est le suivant: i(t) = 1/2 * a * t^2 + v * t + i0;a avec une accélération constante étant, v étant la vitesse initiale, et étant i0 position initiale le long de la dimension i.
  • Nous savons la distance entre deux points 2D à tout moment t est la racine carrée de ((a.x(t) - b.x(t))^2 + (a.y(t) - b.y(t))^2)
  • En utilisant la formule de la position le long d'une dimension que nous pouvons substituer tout dans l'équation de la distance en termes de juste t et les constantes que nous avons définies plus tôt. Pour raccourcir nous appellerons la fonction d(t);
  • Enfin en utilisant cette équation, nous saurons que les valeurs td(t) = a.radius + b.radius sont où la collision commence ou se termine.
  • Pour mettre cela en termes de formule quadratique on déplace le rayon vers la gauche pour que nous obtenons d(t) - (a.radius + b.radius) = 0
  • On peut alors se développer et simplifier l'équation résultante, donc tout est en termes de t et les valeurs constantes qui nous ont été donnés. En utilisant ce résoudre pour les deux valeurs négatives positives avec la formule quadratique.
  • Cela gérera également les erreurs, car si vous obtenez deux objets qui n'entreront jamais en collision, vous obtiendrez un nombre indéfini ou imaginaire.

Vous devriez être en mesure de traduire le reste en code assez facilement. Je suis à court de temps atm et écrira une solution simple quand je peux.