Угол наклона движущегося шара от инертного шара - PullRequest
4 голосов
/ 04 апреля 2011

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

Координаты центра движущегося шарика (X0, Y0), радиус (R0) и угол перемещения до удара (A0)

Координаты центра неподвижного шара (X1, Y1) и радиус (R1)

Ответы [ 5 ]

12 голосов
/ 04 апреля 2011

Если ваш второй шар имеет бесконечную массу:

enter image description here

Где фи (после длинного вычисления):

phi=  -ArcTan[
         ( 2 R^2 Sin[A0] + 2 (YD Cos[A0] - XD Sin[A0]) (2 H Cos[A0] + 
           2 XD Sin[A0]^2 - YD Sin[2 A0]))  /
         ((2 R^2 - XD^2 - 3 YD^2) Cos[A0] + (XD^2 - YD^2) Cos[3 A0] + 
           8 XD YD Cos[A0]^2 Sin[A0] + 4 H Sin[A0] (-YD Cos[A0] + XD Sin[A0]))
           ]

Где:

H   = (R0 + R1)^2 - ((Y0 - Y1) Cos[A0] + (X0 - X1) Sin[A0])^2  
R^2 = (R0 + R1)^2
XD  =  X1 - X0
YD  =  Y1 - Y0

Редактировать

Чтобы определить всю траекторию, вам также понадобятся координаты центра движущегося шара во время удара.Это:

  {X,Y}= {X1+Sin[A0] ((Y1-Y0) Cos[A0]+ (X0-X1) Sin[A0])-Cos[A0] Sqrt[H],
          Y1+Cos[A0] ((Y0-Y1) Cos[A0]+(-X0+X1) Sin[A0])-Sin[A0] Sqrt[H]}
4 голосов
/ 04 апреля 2011

Страница 3 из Уроки бильярдного зала Джо ван ден Хеувела, Майлз Джексон дает прекрасный пример того, как это сделать.

// First, find the normalized vector n from the center of circle1 to the center of circle2
Vector n = circle1.center - circle2.center;
n.normalize();
// Find the length of the component of each of the movement vectors along n. 
float a1 = v1.dot(n);
float a2 = v2.dot(n);

float optimizedP = (2.0 * (a1 - a2)) / (circle1.mass + circle2.mass);

// Calculate v1', the new movement vector of circle1
// v1 = v1 - optimizedP * m2 * n
Vector v1 = v1 - optimizedP * circle2.mass * n;

// Calculate v2', the new movement vector of circle2
// v2 = v2 + optimizedP * m1 * n
Vector v2 = v2 + optimizedP * circle1.mass * n;

circle1.setMovementVector(v1);
circle2.setMovementVector(v2);

Прочитайте хотя бы третью страницу, чтобы понять, чтоздесь происходит.

3 голосов
/ 04 апреля 2011

Вам стоит взглянуть на статью elastic collision в Википедии.Я бы объяснил здесь, но все, что я мог бы сказать, Википедия говорит это лучше и с ясными примерами и уравнениями.

2 голосов
/ 04 апреля 2011

[Давным-давно я изучал это как старшекурсник.]

Тебе нужно быть ясным в массах.Вероятно, вы принимаете равную массу для обоих шаров, в отличие от одного существа бесконечной массы.

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

Хотите ли вы это сделать?

Если это так, вам необходимо учитывать трение между вращающимся шариком и поверхностью.

Например, в «простом»«прямолинейное столкновение между вращающимся шариком и неподвижным, если мы предположим, что оно совершенно упругое (опять-таки, не совсем верно):

  • : первоначальное столкновение останавливает движущийся шарик« A »
  • неподвижный шар «B» начинает двигаться со скоростью удара «A»
  • «A» по-прежнему вращается, захватывает поверхность и набирает небольшую скорость
  • «B» запускаетсябез вращения и должен соответствовать его скорости, чтобы катиться.Это приводит к незначительному замедлению.

В упрощенном случае вычисление будет намного проще, если вы преобразуете его в координаты центра масс.В этом кадре столкновение всегда является прямым столкновением, меняющим направление движения шаров.Затем вы просто трансформируетесь обратно, чтобы получить результирующие значения.

Предполагая, что массы и скорости будут неопределенными до воздействия v1 и w1.

V0 = centre of mass speed = (v1+w1)/2
v1_prime = v of mass_1 in transformed coords = v1 - V0
w1_prime = w1 - V0

После столкновения у нас есть простое отражение:

v2_prime = -v1_prime  (== w1_prime)
w2_prime = -vw_prime  (== v1_prime)

v2 = v2_prime + V0
w2 = w2_prime + V0
0 голосов
/ 04 апреля 2011

Это просто отражается от неподвижного шара. Поэтому вычислите точку контакта (центры шариков будут на расстоянии R0 + R1), а осью отражения будет линия, соединяющая центры.

РЕДАКТИРОВАТЬ: Я имею в виду, что линия, соединяющая центры в точке соприкосновения, будет иметь угол, и вы можете использовать этот угол, чтобы помочь вычислить новый угол движущегося шара.

...