Как рассчитать время, в которое два круга будут касаться внешне? - PullRequest
0 голосов
/ 29 ноября 2018

Это может быть больше математический вопрос, чем вопрос программирования, но здесь идет.

Я пытаюсь придумать формулу для того, когда два круга будут касаться друг друга в 2D-пространстве, учитывая исходные позиции, радиусы и силы (такие как гравитация), действующие на круги.Мне удалось придумать формулу, но я пытаюсь выяснить, можно ли ее решить за «т» (время).

var c1r, // radius of circle #1
    c1x, // x position of circle #1 at time 0
    c1y, // y position of circle #1 at time 0
    c1vx, // x velocity of circle #1 at time 0
    c1vy, // y velocity of circle #1 at time 0
    c1fx, // x force (such as gravity) on circle #1 at time 0
    c1fy; // y force (such as gravity) on circle #1 at time 0

var c2r, // radius of circle #2
    c2x, // x position of circle #2 at time 0
    c2y, // y position of circle #2 at time 0
    c2vx, // x velocity of circle #2 at time 0
    c2vy, // y velocity of circle #2 at time 0
    c2fx, // x force (such as gravity) on circle #2
    c2fy; // y force (such as gravity) on circle #2

Учитывая это, я знаю, что мне нужно вычислитькогда центры окружностей являются суммой радиусов друг от друга.

var targetDist = c1r + c2r;

Я знаю формулу траектории для отдельного круга:

function c1_position(t) (
    return {
        x: c1x + (c1vx * t) + (.5 * c1fx * Math.pow(t, 2)),
        y: c1y + (c1vy * t) + (.5 * c1fy * Math.pow(t, 2))
    }
 }

И, конечно, формула расстояния:

function distance(c1x, c1y, c2x, c2y) {
    return Math.sqrt(Math.pow(c2x - c1x, 2) + Math.pow(c2y - c1y, 2));
}

Объединение этих двух формул и времени (t) как неизвестного:

var t;

Math.pow(targetDist, 2) = Math.pow((c2x + (c2vx * t) + (.5 * c2fx * Math.pow(t, 2))) - (c1x + (c1vx * t) + (.5 * c1fx * Math.pow(t, 2))), 2) + Math.pow((c2y + (c2vy * t) + (.5 * c2fy * Math.pow(t, 2))) - (c1y + (c1vy * t) + (.5 * c1fy * Math.pow(t, 2))), 2);

Что мне нужно сделать, это решить это для времени (t).Я не мог понять, как это сделать, поэтому я использовал метод грубой силы, чтобы сделать это.Это можно решить для t, или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 29 ноября 2018

Во-первых: мы можем преобразовать проблему касания окружности в проблему касания большого круга (r=r1+r2) и точки

Во-вторых: чтобы немного упростить уравнения, мы можем применить принцип Галилея: работа в движущейся системе связана содин центр.Эта система не является инерционной, но она не важна для расчета столкновений.

Так что зафиксируйте центр первой окружности как неподвижную точку (0,0) и найдите момент, когда второй центр находится на расстоянии r=r1+r2,В этой системе координат начальная позиция, относительная скорость, относительное ускорение составляют

 x0 = c2x - c1x
 y0 = c2y - c1y
 vx = c2vx - c1vx
 vy = c2vy - c1vy
 ax = c2fx - c1fx   //I assume that force is really acceleration (force/mass)
 ay = c2fy - c1fy

Теперь, используя уравнение перемещения точки, мы можем получить формулу для момента столкновения, такую ​​как ваша:

r^2 = (x0 + vx*t+ ax*t^2/2)^2 + (y0 + vy*t+ ay*t^2/2)^2

Открытые скобки:

r^2 = x0^2 + vx^2*t^2 + ax^2*t^4/4 + 2*x0*vx*t + 2*vx*ax*t^2/2 + 2*vx*ax*t^3/2 + 
      y0^2 + vy^2*t^2 + ay^2*t^4/4 + 2*y0*vy*t + 2*vy*ay*t^2/2 + 2*vy*ay*t^3/2
or
      t^4 * 1/4*(ax^2 + ay^2) + 
      t^3 * (vx*ax + vy*ay) +
      t^2 * (vx^2 + vy^2 + vx*ax + vy*ay) + 
      t *   (vx^2 + vy^2 + 2*x0*vx + 2*y0*vy) +
            (x0^2 + y0^2 - r^2) = 0 

Это квартическое уравнение для неизвестного t.Это может быть решено аналитически и дать от 0 до 4 реальных решений. Вики-страница .Нет сомнений в том, что вы легко можете найти готовый код / ​​библиотеку JS, предназначенную для этой цели.

Корень с наименьшим положительным значением t (если изначально круги были разнесены!) - это моменттрогательно

...