 |  | |  | |
Модель соударения двух бильярдных шаров | Полный текст материала
Другие публикации автора: Сергей Басков
Цитата или краткий комментарий: «... Программа "Бильярд" реализует математическую модель соударения двух шаров.
...» |
Важно:- Страница предназначена для обсуждения материала, его содержания, полезности, соответствия действительности и так далее. Смысл не в разборке, а в приближении к истине :о) и пользе для всех.
- Любые другие сообщения или вопросы, а так же личные эмоции в адрес авторов и полемика, не относящаяся к теме обсуждаемого материала, будут удаляться без предупреждения авторов, дабы не мешать жителям нормально общаться.
- При голосовании учитывайте уровень, на который расчитан материал. "Интересность и полезность" имеет смысл оценивать относительно того, кому именно предназначался материал.
- Размер одного сообщений не должен превышать 5К. Если Вам нужно сказать больше, сделайте это за два раза. Или, что в данной ситуации правильнее, напишите свою статью.
Всегда легче осудить сделанное, нежели сделать самому. Поэтому, пожалуйста, соблюдайте правила Королевства и уважайте друг друга.
Добавить свое мнение.
[Преобразование и расчет координат]
Отслеживать это обсуждение 
Всего сообщений: 2108-03-2007 04:01Уважаемые участники и автор!
Я решил разобраться таки с геометрией данного процесса (столкновения шаров) и оптимизировать расчёты. Вот что у меня вышло: (привожу только смысловой кусок кода, остальное, имхо, вполне ясно)
type
TBall = record
mx,my:extended; //координаты центра шара
dx,dy:extended;// текущее приращение изменения координат
end;
var
balls:array [1..2] of Tball;
a,b,p1,p2,p3,d1,d2,dist:extended;
//проверка столкновения двух шаров
a:=balls[i].mx-balls[j].mx;
b:=balls[i].my-balls[j].my;
dist:=sqrt(sqr(a)+sqr(b));
if dist<=30 {диаметр шара} then begin
p1:=a*b/sqr(30);
p2:=sqr(a/30);
p3:=sqr(b/30);
d1:=balls[i].dy*p1+balls[i].dx*p2-balls[j].dy*p1-balls[j].dx*p2;
d2:=balls[i].dx*p1+balls[i].dy*p3-balls[j].dx*p1-balls[j].dy*p3;
balls[i].dx:=balls[i].dx-d1;
balls[i].dy:=balls[i].dy-d2;
balls[j].dx:=balls[j].dx+d1;
balls[j].dy:=balls[j].dy+d2;
end;
Вот и всё! :) |
|
11-05-2006 21:41Я проверил - ссылки не битые. |
|
11-05-2006 11:11Ссылка битая, киньте кто-нибудь исходники пожалуйста. |
|
19-01-2006 07:31говорить нечего, вот кусок кода
bet=atan2(b.y-a.y,b.x-a.x);
x1=a.dx*cos(-bet)-a.dy*sin(-bet);
y1=a.dx*sin(-bet)+a.dy*cos(-bet);
x2=b.dx*cos(-bet)-b.dy*sin(-bet);
y2=b.dx*sin(-bet)+b.dy*cos(-bet);
a.dx=x2*cos(bet)-y1*sin(bet);
a.dy=x2*sin(bet)+y1*cos(bet);
b.dx=x1*cos(bet)-y2*sin(bet);
b.dy=x1*sin(bet)+y2*cos(bet);
много раз проверял, физика соблюдается,
можно много добавить, например кручение
принцип прост, вычисляем угол соударения относительно экранной системы координат, затем поворачиваем, тогда ось соударения превращается в ось Х
а формула соударения проще простого
Y-составляющие скоростей не меняются, а Х-состовляющие шаров меняются местами,
после этого все поворачиваем на тот же угол но с минусом.
при этой формуле при попадании лол в лоб в стоячий шар, биток останется на месте
|
|
10-06-2004 03:37нужен сам принцип столкновения а не физический расчет заранее спасибо |
|
10-06-2004 03:35Помогите достать код столкновения шара от стены через сообщения в Vb.Net |
|
11-05-2004 10:34Спасибо, люди, очень помогли. Не надо будет гемориться. Такая незначительная часть проета, а столько возни! |
|
09-09-2003 13:58Запустил Вашу программу под Win98.
Вылезло два глюка:
1) Мигает при перерисовке экран
2)Чего то шарик с места не двигается,а кий вокруг него кружит,хотя anykey я нажимал ( |
|
02-06-2003 09:18
11-02-2003 17:28Конечно модель не похожа на настоящую, исключая пожалуй столкновение шаров.
Могу посоветовать литературу "Amateur Physics for amateur pool player", и книгу 56 кажеца года выпуска, в библиотеках еще можно найти, автор Кориолис "Изложение основ теории и построений, объясняющих движение шаров". Чтение мягко скажем "занимательное".
Само движение шаров у вас неверное, хотя теория столкновений оригинальна, но пока мне непонятна. Ещеб кручение добавить :) |
|
11-11-2002 16:28
10-11-2002 15:23сообщение от автора материала Попробуйте использовать такой файл settings.ini:
[Phisics]
ballSize=1
PocketSize=0
MaxEnergy=40
CueLength=200
PyramidHeight=23
Friction=1
AngleStep=0,03
MovementLimit=0
TimeInterval=20
ColorBalls=1
Чем-то похоже на броуновское движение... |
|
06-11-2002 15:26Это ещё упрощенная модель, учитывая то, что мы не в праве рассматривать процесс соударения как мгновенный и недеформационный))) |
|
06-11-2002 15:23з-н сохранения импульса тут не при чем. Он отвечает только за направление скорости. Сама скорость вычисляется по з-ну сохранения энергии, который помимо всего содержит энергию вращающегося тела (это важно!) (I*w^2)/2, где I-момент инерции (для шара (2/5)*m*r^2), а w - угловая скорость. + Потеря энергии на трение м/у ворсом сукна и поверхностью другого шара. Там будет интегральная величина, поскольку чужой начинает двигаться в процессе удара, следовательно относительная скорость точек поверхности двух шаров меняется. А с кручением все достаточно тривиально. Вводим полярную 3D-систему и ,оперируя векторами сил трения при кручении, высчитываем интегральное воздействие на шар со стороны другого. А там обратный ход - зная получаемыю энергию и скорость, легко найти и угловую скорость чужого шара.
|
|
05-11-2002 12:53А закон сохранения импульса у тебя стал соблюдаться! |
|
05-11-2002 11:35сообщение от автора материала Посмотрите изменения в программе... Вроде бы, стало более реальным соударение (без кручения ;)) |
|
05-11-2002 09:12сообщение от автора материала to: Кода Виктор
В файле settings.ini можно поменять коэффициент трения Friction и MovementLimit - значение минимального приращения скорости, при котором шар считается остановленным.
Всем спасибо за обсуждение и уместную критику - при возможности я это учту... |
|
05-11-2002 09:04сообщение от автора материала Я не задавался целью реализовать ПОЛНУЮ ФИЗИЧЕСКУЮ МОДЕЛЬ соударения двух шаров. Кстати, закон сохранения импульса у меня там не соблюдается (т.е, при центральном ударе по стоящему шару биток должен остаться на месте, а вся энергия должна перейти второму шару, с некоторой потерей, естественно): m1*v1+m2*v2 = m1"*v1"+m2"*v2". А так как массы шаров равны, то v1+v2 = v1"+v2"(в векторной форме).
Вообще, я специально и предоставил исходники для доработки тому, кто хочет сделать совершенную модель.
|
|
03-11-2002 10:19to Пользователь
Кручение передаётся, это факт, поскольку иначе бы не выполнялся закон сохранения энергии. А насчёт физики согласен. Разработанный вариант сильно идеален. Пожелание автору смоделировать модель сукна. Это выполняется на основе моделирования взаимодействия и сил упругости на одной ворсинке. |
|
02-11-2002 10:33Надо бы немного переделать физику программы - шары в конце двигаются очень медленно и долго, надо как-то ускорить процесс остановки хоть немного. |
|
02-11-2002 03:37А как же быть с "закрученными" шарами?
И всегда интересовал вопрос: Если мы закручиваем биток, то передается ли кручение следующему шару по которому он попадает? |
|
|
|