Санкт-Петербургский государственный политехнический университет
Институт Прикладной математики и механики
Кафедра Теоретической механики
П.Ю. Булдаков
ДИНАМИКА БИЛЬЯРДА
Курсовой проект
Направление подготовки бакалавров: 010800 Механика и математическое моделирование
Группа 23604/1
Руководитель проекта: Панченко А.Ю.
Допущен к защите:
«__»_____________20__ г.
Санкт-Петербург
2015
1
Оглавление
Оглавление.............................................................................................................................................2
Введение.................................................................................................................................................3
Глава 1. Общие сведения....................................................................................................................4
1.1 История возникновения бильярда...............................................................................................4
1.2 Виды бильярда..............................................................................................................................4
1.3 Потенциал Леннарда-Джонса......................................................................................................5
Глава 2. ...................................................................................................................................................6
2.1 Задачи, поставленные перед программой..................................................................................6
2.2 Написание кода.............................................................................................................................7
Итоги работы .......................................................................................................................................11
Литература............................................................................................................................................12
2
Введение
Проект направлен на изучение динамики взаимодействия шаров при игре в бильярд. В процессе
выполнения курсовой работы необходимо решить следующие задачи:
Написать программу, моделирующую динамику взаимодействия шаров при игре в
Бильярд. Взаимодействие между шарами описывается с помощью потенциала
Леннарда-Джонса.
Рассмотреть классическое центрально разбиение в русском бильярде, проследить
траекторию разлета.
В первой главе приведены общие сведения по теме: история возникновения бильярда как
такового, а также его виды, потенциала Леннарда-Джонса. Во второй главе описывается то, как
создавалась программа с примерами кодов.
3
Глава 1. Общие сведения
1.1 История возникновения бильярда
Первый бильярдный стол (согласно сохранившимся документам) был изготовлен мастером
Анри де Винемом в 1469 году для короля Франции Людовика XI. Этот стол был похож на
современный бильярдный: у него было каменное основание, ограждение, он был покрыт сукном.
Документально подтверждены утверждения об игре в бильярд королевы Шотландии Марии
Стюарт накануне ее казни и о ее просьбе архиепископу Глазго подыскать столу подходящее
помещение после ее смерти. В Россию бильярд был завезен из Голландии Петром I. Новинка
быстро завоевала популярность. После смерти Петра I обучение игре на бильярде было
включено Верховным тайным советом в курс наук Петра II, его внука и наследника. Екатерина II
указом от 7 декабря 1770 года приказала в трактирах и на постоялых дворах «для увеселения
приходящих дозволить иметь биллиарды». На рубеже XVIII и XIX веков бильярд являлся частью
«обязательной» программы воспитания дворян в Европе и в России.
Впервые о математическом базисе бильярдной игры заговорил Гаспар Густав Кориолис в
своей книге «Théorie mathématique du jeu de billard» (Русск. перевод: «Математическая теория
явлений бильярдной игры») в 1835 году. Он использовал в своей работе элементы теории
вероятностей, теории пределов и общего анализа. Однако особого интереса у современников (по
мнению Лемана) книга не вызвала: ни у математиков, ни у игроков в бильярд.
Прошло более полутораста лет, и математический бильярд развился в свою теорию,
породив несколько побочных. «Теория бильярдов» сегодня неотъемлемая часть эргодической
теории и теории динамических систем, имеет важнейшее применение в физике.
Математиком Гальперином создан способ определения числа с помощью бильярда. Так же
известны результаты исследований математиков Штейнгауза, Альхазена и Гарднера.
1.2. Виды бильярда
Бильярд чаще всего подразделяют на четыре основных вида:
1) Русский бильярд
Столы в Русском бильярде имеют размеры в 12 футов, 16 шаров (диаметр 68 мм). 15-
ть шаров, участвующие в игре, пронумерованы, оставшийся 16-й, имеет другой цвет, но
не имеет номера.
2) Американский Пул
Американский пул – одна из самых несложных разновидностей игры в бильярд.
4
3) Английский Снукер
Столы в 12 футов, лузы примерно в 120 мм, 20 цветных шаров размером 52,4 мм
каждый.
4) Французский Карамболь
Участники играют на 10-ти футовых столах, используя шары по 60 миллиметров. Два
шара – белые, один – красный. Название игре дал особый удар, который так и
называется – Карамболь.
1.3. Потенциал Леннарда-Джонса
Парный силовой потенциал взаимодействия. Определяется формулой:
Π(r) = D [( r )12 − 2( r )6 ],
a a
где
r — расстояние между частицами,
D — энергия связи,
a — длина связи
Потенциал является частным случаем потенциала Ми и не имеет безразмерных параметров.
Сила взаимодействия, соответствующая потенциалу Леннард-Джонса, вычисляется по формуле
[( r )13 − ( ar ) ].
D a
F(r) = 12 a
7
Для потенциала Леннард-Джонса жесткость связи, критическая длина связи и прочность связи,
соответственно, равны
√ √
D 13 504 7 D D
C = 72 a
2
, b= 6
7
a ≈ 1.11 a , P = 169
6
13 a
≈ 2.7 a .
Векторная сила взаимодействия определяется формулой
[( r )14 − ( ar ) ] r.
D a
F(r) = −∇Π(r) = 12 a
8
Данное выражение содержит лишь четные степени межатомного расстояния r, что позволяет при
численных расчетах методом динамики частиц не использовать операцию извлечения корня.
5
Глава 2. Написание программы
2.1 Задачи, поставленные перед программой
Программа должна выполнять следующие функции:
1. Визуализация стола, шаров и луз для игры в бильярд.
2. Взаимодействие между шарами должно описывается с помощью потенциала Леннарда-
Джонса.
3. У игрока должна быть возможность выбирать направление и силу удара.
4. Игрок, при выборе угла и силы удара, должен видеть примерную траекторию движения
“битка”
5. Кнопки “PLAY” и “AGAIN” для удобства.
2.2 Написание кода
Ниже приведены части кода, которые отвечают за:
1) Взаимодействие шаров.
2) Задание пирамиды из шаров.
3) Нажатие кнопок “PLAY” и “AGAIN”.
1) Взаимодействие шаров.
1. var balls = []; // массив шаров
2. var addNewBall = function(x, y) {
3. // проверка - не пересекается ли новый шар со стенами или уже
существующими шарами
4. if (x - r < 0 || x + r > w || y - r < 0 || y + r > h) return null;
5. for (var i = 0; i < [Link]; i++) {
6. var rx = balls[i].x - x;
7. var ry = balls[i].y - y;
8. var rLen2 = rx * rx + ry * ry;
9. if (rLen2 < 4 * r2) return null;
10. }
6
11. var b = [];
12.
13. b.x = x; b.y = y; // расчетные
координаты шара
14. [Link] = 0; [Link] = 0; // сила, действующая
на шар
15. [Link] = 0; [Link] = 0; // скорость
16.
17. balls[[Link]] = b; // добавить элемент в
конец массива
18. return b;
19. };
20.
21. // Основной цикл программы
22.
23. function control() {
24. physics();
25. draw();
26. }
27.
28. // Расчетная часть программы
29.
30. function physics() { // то, что происходит
каждый шаг времени
31. for (var s = 1; s <= spf; s++) {
32.
33. // пересчет сил идет отдельным массивом, т.к. далее будут
добавляться силы взаимодействия между шарами
34. for (var i0 = 0; i0 < [Link]; i0++) {
35. balls[i0].fx = - B * balls[i0].vx;
36. balls[i0].fy = - B * balls[i0].vy;
37. }
38.
39. for (var i = 0; i < [Link]; i++) { // пеерсчет
взаимодействия между шарами
1. // расчет взаимодействия производится со всеми следующими шарами в
массиве,
2. // чтобы не считать каждое взаимодействие дважды
3. var b = balls[i];
4. for (var j = i + 1; j < [Link]; j++) {
5. var b2 = balls[j];
6. var rx = b.x - b2.x; var ry = b.y - b2.y; //
вектор смотрит на первый шар (b)
7. var r2 = rx * rx + ry * ry; //
квадрат расстояния между шарами
7
8. if (r2 > aCut2) continue; //
проверка на радиус обрезания
9. var rLen = ([Link](r2));
10.
11.
12. // если расстояние между частицами мало, силы
будут посчитаны для K * a
13. if (r2 < K2a2) {
14. if (rLen > 0.00001) {
// проверка, чтобы избежать деления на 0
15. rx = rx / rLen * Ka;
16. ry = ry / rLen * Ka;
17. }
18. r2 = K2a2;
19. rLen = Ka;
// корень K2a2
20. }
21.
22. // сила взаимодействия
23. var s2 = a2 / r2; var s4 = s2 * s2;
// ___в целях оптимизации___
24. var F = LJCoeff * s4 * s4 * (s4 * s2 - 1);
// сила взаимодействия Леннарда-Джонса
25.
26. var Fx = F * rx; var Fy = F * ry;
27. [Link] += Fx; [Link] += Fy;
28. [Link] -= Fx; [Link] -= Fy;
29. }
30.
31. if (b.y + r > h) { [Link] += -
Cwall * (b.y + r - h) - Bwall * [Link]; } // рассчет взаимодействия со
стенками : когда координаты шара совпадают с координатами в условии цикла,
шару придается скорость и направление
32. if (b.y - r < 0) { [Link] += -
Cwall * (b.y - r) - Bwall * [Link];}
33. if (b.x + r > w) { [Link] += -
Cwall * (b.x + r - w) - Bwall * [Link]; }
34. if (b.x - r < 0) { [Link] += -
Cwall * (b.x - r) - Bwall * [Link]; }
35.
36. [Link] += [Link] / m * dt; [Link] += [Link] / m * dt;
37. b.x += [Link] * dt; b.y += [Link] * dt;
38. }
39. }
40. }
2) Задание пирамиды из шаров.
8
1. addNewBall(16*w/32, 16*h/32 );
2. addNewBall(16*w/32, 8*h/32 );
3. addNewBall(16*w/32 - r, 8*h/32 - 1.7321*r);
4. addNewBall(16*w/32 + r, 8*h/32 - 1.7321*r );
5. addNewBall(16*w/32, 8*h/32 - 2*1.7321*r );
6. addNewBall(16*w/32 - 2*r, 8*h/32 - 2*1.7321*r );
7. addNewBall(16*w/32 + 2*r, 8*h/32 - 2*1.7321*r );
8. addNewBall(16*w/32 + r, 8*h/32 - 3*1.7321*r );
9. addNewBall(16*w/32 - r, 8*h/32 - 3*1.7321*r );
10. addNewBall(16*w/32 + 3*r, 8*h/32 - 3*1.7321*r );
11. addNewBall(16*w/32 - 3*r, 8*h/32 - 3*1.7321*r );
12. addNewBall(16*w/32, 8*h/32 - 4*1.7321*r );
13. addNewBall(16*w/32 - 2*r, 8*h/32 - 4*1.7321*r );
14. addNewBall(16*w/32 + 2*r, 8*h/32 - 4*1.7321*r );
15. addNewBall(16*w/32 - 4*r, 8*h/32 - 4*1.7321*r );
16. addNewBall(16*w/32 + 4*r, 8*h/32 - 4*1.7321*r );
17. addNewBall(16*w/32, 16*h/32 );
3) Нажатие кнопок “PLAY” и “AGAIN”.
1. this.setSlider_01 = function(c) { q=-c ;}; // функция для слайдера угла
2. this.setSlider_02 = function(c) { v0=c ;}; // функция для слайдера угла
3.
4. // настройка интерфейса
5.
6. slider_01.min = 0; slider_01.max =360;
7. slider_01.step = 0.5;
8. slider_01.value = q; // начальное значение ползунка должно
задаваться после min и max
9. text_01.value = [Link](q);
10. slider_02.min = 0; slider_02.max = 10;
11. slider_02.step = 0.5;
12. slider_02.value = v0; // начальное значение
ползунка должно задаваться после min и max
13. text_02.value = v0;
14.
15. this.setSlider_01(q);
16. this.setSlider_02(v0);
17.
18. // кнопка “PLAY”
19.
20. [Link] = function() {
21. balls[0].vx = v0* [Link](q*Pi/180);
22. balls[0].vy = v0* [Link](q*Pi/180);
9
23. }
24. // кнопка “AGAIN”
25.
26. this.newSystem1 = function() {
27. for (var i = 20; i >= 0; i--)
28. {[Link](i, 1)};
29. addNewBall(16*w/32, 16*h/32 );
30. addNewBall(16*w/32, 8*h/32 );
31. addNewBall(16*w/32 - r, 8*h/32 - 1.7321*r);
32. addNewBall(16*w/32 + r, 8*h/32 - 1.7321*r );
33. addNewBall(16*w/32, 8*h/32 - 2*1.7321*r );
34. addNewBall(16*w/32 - 2*r, 8*h/32 - 2*1.7321*r );
35. addNewBall(16*w/32 + 2*r, 8*h/32 - 2*1.7321*r );
36. addNewBall(16*w/32 + r, 8*h/32 - 3*1.7321*r );
37. addNewBall(16*w/32 - r, 8*h/32 - 3*1.7321*r );
38. addNewBall(16*w/32 + 3*r, 8*h/32 - 3*1.7321*r );
39. addNewBall(16*w/32 - 3*r, 8*h/32 - 3*1.7321*r );
40. addNewBall(16*w/32, 8*h/32 - 4*1.7321*r );
41. addNewBall(16*w/32 - 2*r, 8*h/32 - 4*1.7321*r );
42. addNewBall(16*w/32 + 2*r, 8*h/32 - 4*1.7321*r );
43. addNewBall(16*w/32 - 4*r, 8*h/32 - 4*1.7321*r );
44. addNewBall(16*w/32 + 4*r, 8*h/32 - 4*1.7321*r );
45. addNewBall(16*w/32, 16*h/32 );
10
2.4 Итог работы.
В ходе работы над проектом была написана программа, моделирующая процесс игры в
бильярд. Данная программа показывает, что траектория разлета шаров после центрального
удара не зависит от силы удара, но зависит от малейшего изменения угла, так как меняется
распространение ударной волны в пирамиде. При силе, достаточной для визуально заметного
разлета шаров, при изменении угла на 1 градус - полное отклонение от симметрии, при 0.1 -
заметное отклонение от симметрии, при 0.01 - трудно различимое.
Профессор Джим Белк (Jim Belk) рассчитал направление и скорость движения каждого из 15
шаров пирамиды, а также битка , после соударения.Для сравнения, помните, что начальная
скорость битка была 10 ед/сек.
11
Список литературы
1. Баррет Д. JavaScript. Web-профессионалам. - Киев: БХВ - Киев, 2001.
2. Вайк А. JavaScript в примерах. - Киев: ДиаСофт, 2000.
3. Математическая теория явлений бильярдной игры - Г. Кориолис.
4. Ландау Л.Д., Лифшиц Е.М., Механика
12