Новая скорость после столкновения с кругом

На круглом бильярдном столе бильярдный шар сталкивается с границей этого стола с некоторой скоростью v1. Это столкновение обнаруживается следующим образом:

double s = sqrt( (p.x-a)*(p.x-a) + (p.y-b)*(p.y-b) );
if (s<r)        // point lies inside circle
                    // do nothing
else if (s==r)  // point lies on circle
                    // calculate new velocity
else if (s>r)   // point lies outside circle 
                    // move point back onto circle (I already have that part)
                    // calculate new velocity

Теперь как можно рассчитать новую скорость v2 после столкновения, чтобы угол падения = угол отражения (упругое столкновение)?

PS: Бильярдный шар представлен точкой p (x, y) с вектором скорости v (x, y). Симуляция без трения.


person Ben    schedule 08.12.2011    source источник
comment
Этот вопрос, похоже, не относится к C ++. Фактически, это больше похоже на математический вопрос, чем на вопрос программирования.   -  person Björn Pollex    schedule 08.12.2011
comment
Где ваша начальная скорость и как вы ее представляете?   -  person Tim    schedule 08.12.2011
comment
Что-то вроде v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal); для серьезно упрощенной физики?   -  person Bart    schedule 08.12.2011
comment
Это вопрос механики, и было бы полезно, если бы вы указали, что представляет каждый символ. Кроме того, выровнены ли границы таблицы по X и Y или нет? Поглощают ли они энергию или они идеально эластичны? В простейшем случае вы переворачиваете Vx или Vy соответственно и вычисляете новую величину. Который должен быть таким же, как перед столкновением ...   -  person juanchopanza    schedule 08.12.2011
comment
Основы физики - см .: en.wikipedia.org/wiki/Coefficient_of_restitution   -  person Paul R    schedule 08.12.2011
comment
@Tim Я обновил вопрос, скорость - это просто вектор.   -  person Ben    schedule 08.12.2011
comment
@Bart Симуляция без трения. Не могли бы вы объяснить, как найти коэфф и граничный_нормальный?   -  person Ben    schedule 08.12.2011
comment
Граничная нормаль - это просто нормаль (направленная внутрь) круглого бильярдного стола в точке удара. Если вас не волнует точность, то коэфф - это просто вымышленный коэффициент между 0 и 1. В противном случае это то, на что Пол намекает (все еще между 0 и 1).   -  person Bart    schedule 08.12.2011
comment
@juanchopanza Это круг в 2D, как бы он был выровнен по оси, он не вращается, если вы это имеете в виду. Совершенно эластичное столкновение. Переворачивание vx или vy работает для прямоугольника, а не для круга. Я пробовал это.   -  person Ben    schedule 08.12.2011
comment
Контакт окружности с краем находится по касательной к окружности, поэтому радиус от центра масс окружности (центра) перпендикулярен краю. Так что проблема такая же, как если бы вы правы. Представьте точку как круг бесконечно малого радиуса. Увеличение радиуса не должно влиять на динамику.   -  person juanchopanza    schedule 08.12.2011
comment
Вы не учитывали скорость равновесия вашего рельса. он будет эластичным на бильярдном столе только в том случае, если скорость, с которой мяч ударяется о направляющую, соответствует равновесной скорости. Если он катится слишком быстро для удара ногой (по рельсам), угол отражения мяча будет меньше угла падения. Если он катится слишком медленно, угол отражения будет больше, чем угол отражения. Но все рельсы разные. :-) И насчет английского. Чтобы сделать это более правильным, нам нужно иметь скорость вращения и ось вращения для англичан. Отличный вопрос!   -  person MacGyver    schedule 22.01.2012
comment
а угол падения изменяется экспоненциально в зависимости от начального угла удара о рельс.   -  person MacGyver    schedule 22.01.2012


Ответы (2)


Предполагая, что вы делаете простую (игровую) симуляцию бильярда, вы можете использовать что-то вроде:

v_new = coeff*(v_old - 2*dot(v_old, boundary_normal)*boundary_normal);

Здесь v_old - это ваш текущий вектор скорости, а boundary_normal - это направленная внутрь нормаль вашего круглого бильярдного стола в точке удара. Если вы знаете центр c вашего круглого стола и у вас есть точка удара p, тогда нормальным будет просто normalize(c-p). То есть нормализованный вектор, полученный при вычитании p из c.

Теперь я принял coeff за коэффициент смешения между 0 (больше никакой скорости после удара) и 1 (та же скорость после удара). Вы можете сделать это более правдоподобным с физической точки зрения, определив правильный коэффициент восстановления.

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

person Bart    schedule 08.12.2011
comment
Я обновил свой вопрос, чтобы показать результаты, полученные с вашей формулой. Кажется, там ошибка? - person Ben; 08.12.2011
comment
Ваш нормальный человек неправильный. Я написал normalize (c-p). Так что ваш нормальный никогда не может иметь длину 250. Вам нужно его нормализовать. - person Bart; 08.12.2011
comment
Спасибо, ты прав, я забыл об этом. Итак, теперь это работает для случая, указанного в моем первом вопросе-обновлении. Однако в других случаях скорость увеличивается (см. Второе обновление). - person Ben; 08.12.2011
comment
Что вы получаете? Какой у тебя коэфф? Ваши нормальные значения по-прежнему ошибочны. Как нормализовать? - person Bart; 08.12.2011
comment
Я добавил свой исходный код в свой вопрос (внизу). Не могли бы вы посмотреть, что не так? Я использовал коэффициент 1 для получения той же скорости после удара, что и до удара. - person Ben; 08.12.2011
comment
Формулу можно получить без особых проблем, просто нарисовав геометрическое представление рассматриваемых векторов. Мне приходилось самому приходить к выводу несколько раз для интервью, когда сеть недоступна ... - person Michael Dorgan; 08.12.2011
comment
Вы снова используете нормализованный n.x при нормализации n.y - person Bart; 08.12.2011
comment
Здорово. Возможно, теперь вы сможете прояснить вопрос до самого важного. Тогда это может снова пригодиться будущим посетителям. - person Bart; 09.12.2011

Как говорится в комментариях, это вопрос механики. Взгляните на определение импульса. В частности, то, что вам нужно, описано в разделе упругие столкновения.

person jap1968    schedule 08.12.2011