Редактирование: КП: Прицельный бильярд

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 11: Строка 11:
  
 
== Аннотация проекта ==
 
== Аннотация проекта ==
Проект направлен на изучение динамики взаимодействия шаров при игре в [https://ru.wikipedia.org/wiki/Бильярд бильярд]. В ходе работы над проектом рассмотрен удар под названием "резка", написана программа, на языке JavaScript, моделирующая игровой процесс.
+
Проект направлен на изучение динамики взаимодействия шаров при игре в бильярд. В ходе работы над проектом рассмотрен удар под названием "резка", написана программа, на языке JavaScript, моделирующая игровой процесс.
  
 
== Формулировка задачи ==
 
== Формулировка задачи ==
Строка 21: Строка 21:
 
[[Файл:Russian_billiards_ball_at_a_corner_pocket.jpg|thumb|Бильярдный шар около угловой лузы.|250px]]
 
[[Файл:Russian_billiards_ball_at_a_corner_pocket.jpg|thumb|Бильярдный шар около угловой лузы.|250px]]
 
Характерной особенностью всех бильярдных игр является передвижение шаров с помощью кия.
 
Характерной особенностью всех бильярдных игр является передвижение шаров с помощью кия.
Основные характерные особенности: шары, незначительно уступающие по размерам створу лузы (диаметр шара 68-68,5 мм., а вес около 285 г.) ширина створа угловой лузы 72-73 мм, средней лузы 82-83 мм).  
+
Основные характерные особенности: шары, незначительно уступающие по размерам створу лузы (диаметр шара 68—68,5 мм., а вес около 285 г.) ширина створа угловой лузы 72—73 мм, средней лузы 82—83 мм).  
  
  
 
При реализации данной задачи используется стол с размерами игрового поля 2240 х 1120 мм, диаметром шара 68 мм и размерами луз 72 и 82 мм соответственно.
 
При реализации данной задачи используется стол с размерами игрового поля 2240 х 1120 мм, диаметром шара 68 мм и размерами луз 72 и 82 мм соответственно.
 +
  
 
== Программа для игры в Бильярд ==
 
== Программа для игры в Бильярд ==
Ниже приведена программа( созданная совместно с [[Булдаков Павел|Булдаковым Павлом]] на основании программы Динамика взаимодействующих частиц), в которой видно, что траектория разлета шаров схожа с расчетными траекториями полученными профессором [http://mathoverflow.net/questions/156263/perfectly-centered-break-of-a-perfectly-aligned-pool-ball-rack/156407#156407,_Джимом-Бэлк Джимом Белк] (рис.1). Взаимодействие между шарами описывается с помощью потенциала Леннарда-Джонса.
 
 
<big><math>\varPi(r) = D\left[\left(\frac{a}{r}\right)^{12}-2\left(\frac{a}{r}\right)^{6}\right]</math></big>
 
 
<big><math>
 
\left\{
 
\begin{array}{ll}
 
F(r) = \frac{12D}{a}\left[\left(\frac a r\right)^{13}-\left(\frac a r\right)^{7}\right], \qquad & r<d; \\
 
F(r) = 0, \qquad & r > d; \\
 
\end{array}
 
\right.
 
</math></big>
 
 
где
 
 
<big><math>r</math></big> — расстояние между частицами,
 
 
<big><math>D</math></big> — энергия связи,
 
 
<big><math>a</math></big> — длина связи.
 
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Stepanov/Billyard1version.html |width=500|height=780 |border=0 }} {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Stepanov/rezkanew.html |with=500|height=780 |border=0 }}
 
<div class="mw-collapsible mw-collapsed">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
Файл '''"Billyard1version.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
 
window.addEventListener("load", MainBalls, true);
 
function MainBalls(slider_01, text_01, slider_02, text_02) {
 
 
    // Предварительные установки
 
 
    var canvas = canvasBalls;
 
    var context = canvas.getContext("2d");                  // на context происходит рисование
 
    canvas.oncontextmenu = function (e) {return false;};    // блокировка контекстного меню
 
 
    var Pi = 3.1415926;                  // число "пи"
 
 
    var m0 = 1;                          // масштаб массы
 
    var T0 = 1;                          // масштаб времени (период колебаний исходной системы)
 
    var a0 = 1;        // масштаб расстояния (диаметр шара)
 
    var q = 90;                    // угол
 
 
 
 
    var g0 = a0 / T0 / T0;                // масштаб ускорения (ускорение, при котором за T0 будет пройдено расстояние a0)
 
    var k0 = 2 * Pi / T0;                // масштаб частоты
 
    var C0 = m0 * k0 * k0;                // масштаб жесткости
 
    var B0 = 2 * m0 * k0;                // масштаб вязкости
 
  var v0 = 1;      //начальная скорость
 
 
 
    // *** Задание физических параметров ***
 
 
    var Ny = 32;                          // число шаров, помещающихся по вертикали в окно (задает размер шара относительно размера окна)
 
    var m = 1 * m0;                      // масса
 
    var Cwall = 10 * C0;                  // жесткость стен
 
    var Cball = 0.1 * Cwall;              // жесткость между частицами
 
    var B = 0.008 * B0;                  // вязкость среды
 
    var Bwall = 0.03 * B0;                // вязкость на стенках
 
    var mg = 0.25 * m * g0;              // сила тяжести
 
    var r = 0.5 * a0;                    // радиус частицы в расчетных координатах
 
    var K = 0.85;                        // сила взаимодействия ограничивается значением, реализующимся при r/a = K
 
    var a = 2 * r;                        // равновесное расстояние между частицами
 
    var aCut = 2.00001 * r;              // радиус обрезания
 
 
    // *** Задание вычислительных параметров ***
 
 
    var fps = 50;                        // frames per second - число кадров в секунду (качечтво отображения)
 
    var spf = 100;                        // steps per frame  - число шагов интегрирования между кадрами (скорость расчета)
 
    var dt  = 0.045 * T0 / fps;          // шаг интегрирования (качество расчета)
 
 
    // Выполнение программы
 
 
    var scale = canvas.height / Ny / a0;  // масштабный коэффициент для перехода от расчетных к экранным координатам
 
    var r2 = r * r;                      // ___в целях оптимизации___
 
    var aCut2 = aCut * aCut;              // ___в целях оптимизации___
 
    var a2 = a * a;                      // ___в целях оптимизации___
 
    var D = a2 * Cball / 72;              // энергия связи между частицами
 
    var LJCoeff = 12 * D / a2;            // коэффициент для расчета потенциала Л-Дж
 
 
 
    var Ka = K * a;                      // ___в целях оптимизации___
 
    var K2a2 = K * K * a2;                // ___в целях оптимизации___
 
 
    var w = canvas.width / scale;          // ширина окна в расчетных координатах
 
    var h = canvas.height / scale;          // высота окна в расчетных координатах
 
 
    // Работа с массивом
 
 
    var balls = [];                            // массив шаров
 
    var addNewBall =  function(x, y) {
 
        // проверка - не пересекается ли новый шар со стенами или уже существующими шарами
 
        if (x - r < 0 || x + r > w || y - r < 0 || y + r > h) return null;
 
        for (var i = 0; i < balls.length; i++) {
 
            var rx = balls[i].x - x;
 
            var ry = balls[i].y - y;
 
            var rLen2 = rx * rx + ry * ry;
 
            if (rLen2 < 4 * r2) return null;
 
        }
 
        var b = [];
 
 
        b.x = x;                b.y = y;        // расчетные координаты шара
 
        b.fx = 0;              b.fy = 0;      // сила, действующая на шар
 
        b.vx = 0;              b.vy = 0;      // скорость
 
 
        balls[balls.length] = b;                // добавить элемент в конец массива
 
        return b;
 
    };
 
 
    // Основной цикл программы
 
 
    function control() {
 
        physics();
 
        draw();
 
    }
 
 
    // Расчетная часть программы
 
 
    function physics() {                        // то, что происходит каждый шаг времени
 
        for (var s = 1; s <= spf; s++) {
 
 
            // пересчет сил идет отдельным массивом, т.к. далее будут добавляться силы взаимодействия между шарами
 
            for (var i0 = 0; i0 < balls.length; i0++) {
 
                balls[i0].fx = - B * balls[i0].vx;
 
                balls[i0].fy = - B * balls[i0].vy;
 
            }
 
 
            for (var i = 0; i < balls.length; i++) {  // пеерсчет взаимодействия между шарами
 
 
 
    //попадание в лузу
 
   
 
      if ((balls[i].x >= (300/scale-r/2))  && (balls[i].y >= (300/scale-r/2)) && (balls[i].y <= (300/scale+r/2))) {balls.splice(i, 1)}; // когда координаты шара совпадают с координатами, записанными в условии цикла, шар удаляется с поля при помощи balls.splice
 
    if ((balls[i].x >= (300/scale-r/2))  && (balls[i].y <= (r/2))) {balls.splice(i, 1)};
 
    if ((balls[i].x >= (300/scale-r/2))  && (balls[i].y >= (600/scale -r/2))) {balls.splice(i, 1)};
 
    if ((balls[i].x <= (r/2))  && (balls[i].y >= (600/scale -r/2))) {balls.splice(i, 1)};
 
    if ((balls[i].x <= (r/2))  && (balls[i].y >= (300/scale-r/2)) && (balls[i].y <= (300/scale+r/2))) {balls.splice(i, 1)};
 
    if ((balls[i].x <= (r/2))  && (balls[i].y <= (r/2))) {balls.splice(i, 1)}; 
 
 
                // расчет взаимодействия производится со всеми следующими шарами в массиве,
 
                // чтобы не считать каждое взаимодействие дважды
 
                var b = balls[i];
 
                for (var j = i + 1; j < balls.length; j++) {
 
                    var b2 = balls[j];
 
                    var rx = b.x - b2.x;  var ry = b.y - b2.y;        // вектор смотрит на первый шар (b)
 
                    var r2 = rx * rx + ry * ry;                        // квадрат расстояния между шарами
 
                    if (r2 > aCut2) continue;                          // проверка на радиус обрезания
 
                    var rLen = (Math.sqrt(r2));
 
       
 
 
                    // если расстояние между частицами мало, силы будут посчитаны для K * a
 
                    if (r2 < K2a2) {
 
                        if (rLen > 0.00001) {                          // проверка, чтобы избежать деления на 0
 
                            rx = rx / rLen * Ka;
 
                            ry = ry / rLen * Ka;
 
                        }
 
                        r2 = K2a2;
 
                        rLen = Ka;                                      // корень K2a2
 
                    }
 
 
                    // сила взаимодействия
 
                    var s2 = a2 / r2;        var s4 = s2 * s2;        // ___в целях оптимизации___
 
                    var F = LJCoeff * s4 * s4 * (s4 * s2 - 1);          // сила взаимодействия Леннарда-Джонса
 
 
                    var Fx = F * rx;        var Fy = F * ry;
 
                    b.fx += Fx;            b.fy += Fy;
 
                    b2.fx -= Fx;            b2.fy -= Fy;
 
                }
 
 
                if (b.y + r > h) { b.fy += -Cwall * (b.y + r - h) - Bwall * b.vy; }    // рассчет взаимодействия со стенками : когда координаты шара совпадают с координатами в условии цикла, шару придается скорость и направление
 
                if (b.y - r < 0) { b.fy += -Cwall * (b.y - r) - Bwall * b.vy;}
 
                if (b.x + r > w) { b.fx += -Cwall * (b.x + r - w) - Bwall * b.vx; }
 
                if (b.x - r < 0) { b.fx += -Cwall * (b.x - r) - Bwall * b.vx; }
 
 
                b.vx += b.fx / m * dt;        b.vy += b.fy / m * dt;
 
                b.x += b.vx * dt;            b.y += b.vy * dt;
 
            }
 
        }
 
    }
 
 
    // Рисование
 
 
    var rScale13 = r * scale * 1.3;        // ___в целях оптимизации___
 
    var rScaleShift = r * scale / 5;        // ___в целях оптимизации___
 
  var line ;
 
  var radi = 30;              // линия которая показывает предполагаему траекторию "битка"
 
 
 
    function draw() {
 
        context.clearRect(0, 0, w * scale, h * scale);      // очистить экран
 
        for (var i = 1; i < balls.length; i++){
 
            var xS = balls[i].x * scale;          var yS = balls[i].y * scale;
 
            // расчет градиента нужно проводить для каждого шара
 
            var gradient = context.createRadialGradient(xS, yS, rScale13, xS - rScaleShift, yS + rScaleShift, 0);
 
            gradient.addColorStop(0, "#fdebeb");
 
            gradient.addColorStop(1, "#fffcfc");
 
            context.fillStyle = gradient;
 
 
            context.beginPath();
 
            context.arc(xS, yS, r * scale, 0, 2 * Math.PI, false);
 
            context.closePath();
 
            context.fill();
 
        }
 
    for (var i = 0; i < 1; i++){
 
            var xS = balls[i].x * scale;          var yS = balls[i].y * scale;
 
            // расчет градиента нужно проводить для каждого шара
 
            var gradient = context.createRadialGradient(xS, yS, rScale13, xS - rScaleShift, yS + rScaleShift, 0);
 
            gradient.addColorStop(0, "#cd0000");
 
            gradient.addColorStop(1, "#fffcfc");
 
            context.fillStyle = gradient;
 
 
            context.beginPath();
 
            context.arc(xS, yS, r * scale, 0, 2 * Math.PI, false);
 
            context.closePath();
 
            context.fill();
 
        }
 
 
   
 
   
 
      context.lineWidth="3";
 
      context.strokeStyle="#fff506";
 
            context.beginPath();
 
            context.moveTo(balls[0].x * scale, balls[0].y * scale);                                                                                                                                                       
 
      context.lineTo(radi*v0*Math.cos(q*Pi/180) + balls[0].x * scale,radi*v0*Math.sin(q*Pi/180)+balls[0].y * scale);
 
            context.stroke();
 
   
 
 
    // прорисовка луз
 
    // verh lev
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff ";
 
    context.beginPath();
 
    context.moveTo(0, 0);                                                                                                                                                       
 
    context.lineTo(0,14 +2.5 );
 
    context.stroke();
 
 
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(0, 0);                                                                                                                                                       
 
    context.lineTo(14 +2.5,0 );
 
    context.stroke();
 
 
 
      // verh prav
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(286 - 2.5, 0);                                                                                                                                                       
 
    context.lineTo(300,0 );
 
    context.stroke();
 
 
 
  context.lineWidth="3";
 
    context.strokeStyle="##ffffff";
 
    context.beginPath();
 
    context.moveTo(300, 0);                                                                                                                                                       
 
    context.lineTo(300,14 +2.5 );
 
    context.stroke();
 
 
 
        // niz lev
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(0, 600);                                                                                                                                                       
 
    context.lineTo(14 +2.5,600 );
 
    context.stroke();
 
 
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(0, 586 - 2.5);                                                                                                                                                       
 
    context.lineTo(0,600 );
 
    context.stroke();
 
   
 
   
 
    // niz prav
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(300, 600);                                                                                                                                                       
 
    context.lineTo(300,586 - 2.5);
 
    context.stroke();
 
 
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(300, 600);                                                                                                                                                       
 
    context.lineTo(286 - 2.5,600 );
 
    context.stroke();
 
 
 
  //sered lev
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(0, 289);                                                                                                                                                       
 
    context.lineTo(0,311);
 
    context.stroke();
 
 
 
  //sered prav
 
 
 
  context.lineWidth="3";
 
    context.strokeStyle="#ffffff";
 
    context.beginPath();
 
    context.moveTo(300, 289);                                                                                                                                                       
 
    context.lineTo(300,311 );
 
    context.stroke();
 
   
 
 
 
    }
 
 
 
 
    // Запуск системы
 
                      // добавляем 20 частиц, сдвинув их от стен
 
    addNewBall(16*w/32, 16*h/32 );
 
    addNewBall(16*w/32, 8*h/32 ); 
 
    addNewBall(16*w/32 - r,  8*h/32 - 1.7321*r); 
 
    addNewBall(16*w/32 + r,  8*h/32 - 1.7321*r );
 
    addNewBall(16*w/32,    8*h/32 - 2*1.7321*r );   
 
    addNewBall(16*w/32 - 2*r,  8*h/32 - 2*1.7321*r );
 
    addNewBall(16*w/32 + 2*r,  8*h/32 - 2*1.7321*r );
 
    addNewBall(16*w/32 + r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32 - r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32 + 3*r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32 - 3*r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32,    8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 - 2*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 + 2*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 - 4*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 + 4*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32, 16*h/32 ); 
 
   
 
  this.setSlider_01 = function(c) { q=-c ;}; // функция для слайдера угла
 
  this.setSlider_02 = function(c) { v0=c ;}; // функция для слайдера угла
 
 
// Настройка интерфейса
 
 
    slider_01.min = 0;              slider_01.max =360;
 
    slider_01.step = 0.5;
 
    slider_01.value = q;          // начальное значение ползунка должно задаваться после min и max
 
    text_01.value = Math.abs(q);
 
    slider_02.min = 0;              slider_02.max = 10;
 
    slider_02.step = 0.5;
 
    slider_02.value = v0;                // начальное значение ползунка должно задаваться после min и max
 
    text_02.value = v0;
 
 
 
  this.setSlider_01(q);
 
  this.setSlider_02(v0);
 
   
 
    this.newSystem = function() {
 
    balls[0].vx = v0* Math.cos(q*Pi/180);
 
        balls[0].vy = v0* Math.sin(q*Pi/180);
 
  }
 
 
  this.newSystem1 = function() {
 
  for (var i = 20; i >= 0; i--)
 
  {balls.splice(i, 1)};
 
  addNewBall(16*w/32, 16*h/32 );
 
    addNewBall(16*w/32, 8*h/32 ); 
 
    addNewBall(16*w/32 - r,  8*h/32 - 1.7321*r); 
 
    addNewBall(16*w/32 + r,  8*h/32 - 1.7321*r );
 
    addNewBall(16*w/32,    8*h/32 - 2*1.7321*r );   
 
    addNewBall(16*w/32 - 2*r,  8*h/32 - 2*1.7321*r );
 
    addNewBall(16*w/32 + 2*r,  8*h/32 - 2*1.7321*r );
 
    addNewBall(16*w/32 + r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32 - r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32 + 3*r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32 - 3*r,  8*h/32 - 3*1.7321*r );
 
    addNewBall(16*w/32,    8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 - 2*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 + 2*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 - 4*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32 + 4*r,  8*h/32 - 4*1.7321*r );
 
    addNewBall(16*w/32, 16*h/32 ); 
 
 
 
}
 
    setInterval(control, 1000 / fps);
 
}
 
 
 
 
 
</syntaxhighlight>
 
Файл '''"Billyard1version.html"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
<!DOCTYPE html>
 
<html>
 
<head>
 
    <title>Billyard</title>
 
    <script src="Billyard1version.js"></script>
 
</head>
 
<body>
 
    <canvas id="canvasBalls" width="300" height="600" style="border:1px none #000000;background: #008000"></canvas>
 
<br>
 
    <div>Угол:
 
        <input type="range" id="slider_01" style="width: 150px;" oninput="app.setSlider_01(this.value); document.getElementById('text_01').value = this.value;">
 
      q =
 
        <input id="text_01" style="width: 5ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)"  oninput="
 
            // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
 
            if (!this.checkValidity()) return;
 
            app.setSlider_01(this.value);
 
            document.getElementById('slider_01').value = this.value;
 
        ">
 
    </div><br>
 
 
    <div>Начальная скорость:
 
        <input type="range" id="slider_02" style="width: 150px;" oninput="app.setSlider_02(this.value); document.getElementById('text_02').value = this.value;">
 
      v0 =
 
        <input id="text_02" style="width: 5ex;" required pattern="[-+]?([0-9]*\.[0-9]+|[0-9]+)" oninput="
 
            // если введено не число - строка не пройдет валидацию по паттерну выше, и checkValidity() вернет false
 
            if (!this.checkValidity()) return;
 
            app.setSlider_02(this.value);
 
            document.getElementById('slider_02').value = this.value;
 
        ">
 
    </div><br>
 
 
 
 
 
  <input type="button" style="width: 50px" name="" onclick="app.newSystem();return false;" value="PLAY"/>
 
 
 
 
 
<script type="text/javascript">var app = new MainBalls(
 
            document.getElementById('slider_01'),
 
            document.getElementById('text_01'),
 
            document.getElementById('slider_02'),
 
            document.getElementById('text_02')
 
    );</script>
 
</body>
 
</html>
 
</syntaxhighlight>
 
</div>
 
 
 
 
[[Файл:WHVJA1.png|thumb|рис.1.Траектория разлета шаров при центральном разбиении пирамиды.|слева|250px]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
  
  
 
== Решение ==
 
== Решение ==
 +
'''''Задача:''''' Рассчитать скорость и угол направления удара, при котором оба шара (рис.1) окажутся в верхних лузах.[[Файл:pravilo_udara_rezka (1).gif|thumb| Удар "резка". |250px]]
  
'''''Задача:''''' Рассчитать скорость и угол направления удара, а так же возможные расположения шаров, при которых оба шара (рис.2) окажутся в верхних лузах.
 
[[Файл:pravilo_udara_rezka (1).gif|thumb| Удар "резка". |250px]]
 
 
На рис.2, один из шаров(биток) смещен с оси прямого удара, таким образом появляется резка. Нужно попасть битком в точку на прицельном шаре, от которой через математический центр прицельного шара до центра лузы проходит прямая линия. При малой резке эта точка на прицельном шаре еще видна, но по мере увеличения резки она становится практически невидимой.
 
  
{{начало цитаты}}'''''Правило 90°:''''' когда "биток" ударяет прицельный шар, скользя по сукну без переднего или заднего вращения, шары разлетаются под углом 90° друг к другу. Правило работает независимо от угла резки.{{конец цитаты}}
+
На рис.1, один из шаров(биток) смещен с оси прямого удара, таким образом появляется резка. Нужно попасть битком в точку на прицельном шаре, от которой через математический центр прицельного шара до центра лузы проходит прямая линия. При малой резке эта точка на прицельном шаре еще видна, но по мере увеличения резки она становится практически невидимой.
{{начало цитаты}} <big><math> v_{1},v_{2} </math></big> - скорость "битка" до и после соударения.
 
 
 
<big><math> v_{2}' </math></big> - скорость прицельного шара после соударения.
 
 
 
Из ЗСИ:
 
 
 
<big><math> v_{1} = v_{1}' + v_{2}'</math></big>  (1)
 
 
 
Из ЗСЭ:
 
 
 
<big><math> v_{1}^2 = v_{1}' ^2 + v_{2}' ^2</math></big>  (2)
 
 
 
Скалярное произведине ур-ния (1) самого на себя дает:
 
 
 
<big><math> v_{1}^2 = v_{1}' ^2 + 2v_{1}'v_{2}'\cos\left(θ\right) + v_{2} '^2</math></big>  (3)
 
 
 
(3) - (2):
 
 
 
<big><math>  2v_{1}'v_{2}'\cos\left(θ\right) = 0 </math></big>, а это возможно, если <big><math>  v_{1}' = 0 </math></big>(что соответствует прямому удару), или при <big><math> θ = 90° </math></big>
 
 
 
''Примечание :''Вывод правила 90° основан на двух существенных допущениях: трение между шарами равно нулю и столкновение шаров – абсолютно упругое.  
 
 
 
{{конец цитаты}}
 
  
 
Будем считать, что шары однородные и совершенно сферической формы.
 
Будем считать, что шары однородные и совершенно сферической формы.
  
<math> θ_{1}, θ_{2} </math> - углы отклонения первого и второго шаров после столкновения по отношению к направлению удара.<math> χ</math> - угол поворота первого шара в системе центра инерции.
+
<math> θ_{1}, θ_{2} </math> - углы отклонения первого и второго шаров после столкновения по отношению к направлению удара. χ - угол поворота первого шара в системе центра инерции.
  
<big><math> θ_{1} =\frac{χ}{2} </math></big>  <math>\qquad</math> <big><math> θ_{2} =\frac{π - χ}{2} </math></big>
+
<math> θ_{1} =\frac{χ}{2} </math> , <math> θ_{2} =\frac{π - χ}{2} </math>
  
<big><math> ú_{1} , ú_{2} </math></big>  - абсолютные величины скоростей шаров после столкновения.
+
<math> ú_{1} , ú_{2} </math>  - абсолютные величины скоростей шаров после столкновения.
  
<big><math> ú_{1} = \cos\left(\frac{θ}{2}\right) v </math></big> <math>\qquad</math> <big><math> ú_{2} = \sin\left(\frac{θ}{2}\right)v </math></big> , <math>\qquad</math>где <big><math> v = v_{2} - v_{1} </math></big>
+
<math> ú_{1} = \cos(\frac{θ}{2})*v </math> , <math> ú_{2} = \sin(\frac{θ}{2})*v </math> , где <math> v = v_{2} - v_{1} </math>
  
 +
Рассмотрим частный случай (рис.1):
 +
<math> l_{1} = 560 </math>мм. - расстояние от прицельного шара до верхней левой лузы.<math> l_{2} = 969 </math>мм. - расстояние от битка до верхней правой лузы, в момент соприкосновения шаров.<math> l = 700</math>мм. - расстояние между шарами в начальный момент времени.
  
'''''Рассмотрим частный случай''''' (рис.2):
+
<math> χ = \frac{π}{3}\ </math>
<math> l_{1} = 560 </math>мм. - расстояние от прицельного шара до верхней левой лузы, <math> l_{2} = 969 </math>мм. - расстояние от битка до верхней правой лузы, в момент соприкосновения шаров, <math> l = 700</math>мм. - расстояние между шарами в начальный момент времени.
 
 
 
Угол разлета шаров после удара 90°, значит можем рассчитать <big><math> θ_{1}, θ_{2} </math></big>
 
  
 
<math>\Downarrow </math>
 
<math>\Downarrow </math>
  
<big><math> θ_{1} =\frac{π}{6}\ </math> </big> <math>\qquad</math> <big><math> θ_{2} =\frac{π}{3}\ </math></big>
+
<math> θ_{1} =\frac{π}{6}\ </math> , <math> θ_{2} =\frac{π}{3}\ </math>
 
 
В таком случае, после соударения шаров, они приобретут скорости:
 
  
<big><math> ú_{1} =\frac{\sqrt3}{2}\ v </math></big> <math>\qquad</math> <big><math> ú_{2} =\frac{1}{2}\ v </math></big> ,<math>\qquad</math> где искомая скорость <big><math> v = v_{2} </math></big>, т.к. в нашем случае прицельный шар в начальный момент времени неподвижен.
+
<math> ú_{1} =\frac{\sqrt3}{2}\ *v </math> , <math> ú_{2} =\frac{1}{2}\ *v </math> , <math> v = v_{2} </math>, т.к. в нашем случае прицельный шар в начальный момент времени неподвижен.
  
В рассмотренном случае угол, под которым производится удар, по отношению к оси OX равен <big><math> \frac{π}{2}\ </math></big>. В  общем случае этот угол зависит от расположения битка.
+
В рассмотренном случае угол, под которым производится удар, по отношению к оси OX равен <math> \frac{π}{2}\ </math>. В  общем случае этот угол зависит от расположения битка.
  
 
== Обсуждение результатов и выводы ==
 
== Обсуждение результатов и выводы ==
[[Файл:RaspolpzhenieBitka.PNG|справа|600px]]
 
Таким образом, в ходе работы над проектом была написана программа, моделирующая процесс игры в бильярд, а так же смоделирован рассматриваемый удар, целью, которого являются оба шара. Были рассчитаны скорость и угол направления удара в рассматриваемом случае.
 
Установлены возможные положения шаров, когда целью удара является один или оба шара (рис.3 и рис.4). А на рис.5 указана область расположения для прицельного шара, когда стоит задача загнать в верхние лузы оба шара.
 
  
  
 
<br>
 
<br>
Скачать отчет:[[Медиа:KursStepanovBilliard.docx|docx]]
+
Скачать отчет:
 
<br>
 
<br>
Скачать презентацию:[[Медиа:Presentation.pptx|pptx]]
+
Скачать презентацию:
  
 
== Ссылки по теме ==
 
== Ссылки по теме ==
* [http://publ.lib.ru/ARCHIVES/K/KORIOLIS_Gaspar_Gyustav/_Koriolis_G.G..html, Математическая теория явлений бильярдной игры - Г. Кориолис.]
+
Математическая теория явлений бильярдной игры - Г. Кориолис.
* [http://inis.jinr.ru/sl/vol2/Physics/%D0%9A%D1%83%D1%80%D1%81%D1%8B/%D0%9B%D0%B0%D0%BD%D0%B4%D0%B0%D1%83,%D0%9B%D0%B8%D1%84%D1%88%D0%B8%D1%86/%D0%9B%D0%B0%D0%BD%D0%B4%D0%B0%D1%83%20%D0%9B.%D0%94.,%20%D0%9B%D0%B8%D1%84%D1%88%D0%B8%D1%86%20%D0%95.%D0%9C.,%20%D0%9C%D0%B5%D1%85%D0%B0%D0%BD%D0%B8%D0%BA%D0%B0,%20%D0%A2%D0%A4%20%D1%821,%201988.pdf, Ландау Л.Д., Лифшиц Е.М., Механика]
 
* [[Потенциал_Леннард-Джонса|потенциала Леннарда-Джонса]]
 
* [https://ru.wikipedia.org/wiki/Бильярд бильярд]
 
*  [http://mathoverflow.net/questions/156263/perfectly-centered-break-of-a-perfectly-aligned-pool-ball-rack/156407#156407,_Джимом-Бэлк Джимом Белк]
 
  
 
== См. также ==
 
== См. также ==
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)

Шаблоны, используемые на этой странице: