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

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 29: Строка 29:
 
Ниже приведена программа( созданная совместно с [[Булдаков Павел|Булдаковым Павлом]] на основании программы Динамика взаимодействующих частиц), в которой видно, что траектория разлета шаров схожа с расчетными траекториями полученными профессором [http://mathoverflow.net/questions/156263/perfectly-centered-break-of-a-perfectly-aligned-pool-ball-rack/156407#156407,_Джимом-Бэлк Джимом Белк] (рис.1). Взаимодействие между шарами описывается с помощью потенциала Леннарда-Джонса.
 
Ниже приведена программа( созданная совместно с [[Булдаков Павел|Булдаковым Павлом]] на основании программы Динамика взаимодействующих частиц), в которой видно, что траектория разлета шаров схожа с расчетными траекториями полученными профессором [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>
+
{{#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 }}
 
 
<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">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
Файл '''"Billyard1version.js"'''
 
Файл '''"Billyard1version.js"'''
Строка 68: Строка 49:
 
     var T0 = 1;                          // масштаб времени (период колебаний исходной системы)
 
     var T0 = 1;                          // масштаб времени (период колебаний исходной системы)
 
     var a0 = 1;        // масштаб расстояния (диаметр шара)
 
     var a0 = 1;        // масштаб расстояния (диаметр шара)
     var q = 90;                    // угол  
+
     var q = -90;                    // угол  
 
    
 
    
  
Строка 153: Строка 134:
 
             }
 
             }
  
             for (var i = 0; i < balls.length; i++) { // пеерсчет взаимодействия между шарами
+
             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))  && (balls[i].y >= (300/scale-r)) && (balls[i].y <= (300/scale+r))) {balls.splice(i, 1)};
     if ((balls[i].x >= (300/scale-r/2))  && (balls[i].y <= (r/2))) {balls.splice(i, 1)};
+
     if ((balls[i].x >= (300/scale-r))  && (balls[i].y <= (r))) {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 >= (300/scale-r))  && (balls[i].y >= (600/scale -r))) {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))  && (balls[i].y >= (600/scale -r))) {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))  && (balls[i].y >= (300/scale-r)) && (balls[i].y <= (300/scale+r))) {balls.splice(i, 1)};
     if ((balls[i].x <= (r/2))  && (balls[i].y <= (r/2))) {balls.splice(i, 1)};   
+
     if ((balls[i].x <= (r))  && (balls[i].y <= (r))) {balls.splice(i, 1)};   
  
 
                 // расчет взаимодействия производится со всеми следующими шарами в массиве,
 
                 // расчет взаимодействия производится со всеми следующими шарами в массиве,
Строка 195: Строка 176:
 
                 }
 
                 }
  
                 if (b.y + r > h) { b.fy += -Cwall * (b.y + r - h) - Bwall * b.vy; }   // рассчет взаимодействия со стенками : когда координаты шара совпадают с координатами в условии цикла, шару придается скорость и направление
+
                 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.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 > w) { b.fx += -Cwall * (b.x + r - w) - Bwall * b.vx; }
Строка 211: Строка 192:
 
     var rScaleShift = r * scale / 5;        // ___в целях оптимизации___
 
     var rScaleShift = r * scale / 5;        // ___в целях оптимизации___
 
   var line ;
 
   var line ;
   var radi = 30;             // линия которая показывает предполагаему траекторию "битка"
+
   var radi = 30;
 +
  var radi2 = 5;
 
    
 
    
 
     function draw() {
 
     function draw() {
 
         context.clearRect(0, 0, w * scale, h * scale);      // очистить экран
 
         context.clearRect(0, 0, w * scale, h * scale);      // очистить экран
         for (var i = 1; i < balls.length; i++){
+
         for (var i = 0; i < balls.length; i++){
 
             var xS = balls[i].x * scale;          var yS = balls[i].y * scale;
 
             var xS = balls[i].x * scale;          var yS = balls[i].y * scale;
 
             // расчет градиента нужно проводить для каждого шара
 
             // расчет градиента нужно проводить для каждого шара
Строка 228: Строка 210:
 
             context.fill();
 
             context.fill();
 
         }
 
         }
     for (var i = 0; i < 1; i++){
+
     for (var i = 15; i < balls.length; i++){
 
             var xS = balls[i].x * scale;          var yS = balls[i].y * scale;
 
             var xS = balls[i].x * scale;          var yS = balls[i].y * scale;
 
             // расчет градиента нужно проводить для каждого шара
 
             // расчет градиента нужно проводить для каждого шара
Строка 247: Строка 229:
 
       context.strokeStyle="#fff506";
 
       context.strokeStyle="#fff506";
 
             context.beginPath();
 
             context.beginPath();
             context.moveTo(balls[0].x * scale, balls[0].y * scale);                                                                                                                                                         
+
             context.moveTo(balls[15].x * scale, balls[15].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.lineTo(radi*v0*Math.cos(q*Pi/180) + balls[15].x * scale,radi*v0*Math.sin(q*Pi/180)+balls[15].y * scale);
 
             context.stroke();
 
             context.stroke();
 
      
 
      
  
    // прорисовка луз
 
 
     // verh lev
 
     // verh lev
 
   context.lineWidth="3";
 
   context.lineWidth="3";
Строка 336: Строка 317:
  
 
     // Запуск системы
 
     // Запуск системы
                      // добавляем 20 частиц, сдвинув их от стен
 
    addNewBall(16*w/32, 16*h/32 );
 
 
     addNewBall(16*w/32, 8*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);   
Строка 355: Строка 334:
 
     addNewBall(16*w/32, 16*h/32 );   
 
     addNewBall(16*w/32, 16*h/32 );   
 
      
 
      
   this.setSlider_01 = function(c) { q=-c ;}; // функция для слайдера угла
+
   this.setSlider_01 = function(c) { q=c ;}; // функция для слайдера угла
 
   this.setSlider_02 = function(c) { v0=c ;}; // функция для слайдера угла
 
   this.setSlider_02 = function(c) { v0=c ;}; // функция для слайдера угла
  
 
  // Настройка интерфейса
 
  // Настройка интерфейса
  
     slider_01.min = 0;              slider_01.max =360;
+
     slider_01.min = -360;              slider_01.max =180;
     slider_01.step = 0.5;
+
     slider_01.step = 0.1;
 
     slider_01.value = q;          // начальное значение ползунка должно задаваться после min и max
 
     slider_01.value = q;          // начальное значение ползунка должно задаваться после min и max
     text_01.value = Math.abs(q);
+
     text_01.value = -q;
 
     slider_02.min = 0;              slider_02.max = 10;
 
     slider_02.min = 0;              slider_02.max = 10;
 
     slider_02.step = 0.5;
 
     slider_02.step = 0.5;
Строка 373: Строка 352:
 
      
 
      
 
     this.newSystem = function() {
 
     this.newSystem = function() {
     balls[0].vx = v0* Math.cos(q*Pi/180);
+
     balls[15].vx = v0* Math.cos(q*Pi/180);
         balls[0].vy = v0* Math.sin(q*Pi/180);
+
         balls[15].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);
 
     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>
 
</syntaxhighlight>
 
</div>
 
</div>
 
 
  
 
[[Файл:WHVJA1.png|thumb|рис.1.Траектория разлета шаров при центральном разбиении пирамиды.|слева|250px]]
 
[[Файл:WHVJA1.png|thumb|рис.1.Траектория разлета шаров при центральном разбиении пирамиды.|слева|250px]]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  
 
== Решение ==
 
== Решение ==
Строка 528: Строка 411:
 
<math> l_{1} = 560 </math>мм. - расстояние от прицельного шара до верхней левой лузы, <math> l_{2} = 969 </math>мм. - расстояние от битка до верхней правой лузы, в момент соприкосновения шаров, <math> l = 700</math>мм. - расстояние между шарами в начальный момент времени.
 
<math> l_{1} = 560 </math>мм. - расстояние от прицельного шара до верхней левой лузы, <math> l_{2} = 969 </math>мм. - расстояние от битка до верхней правой лузы, в момент соприкосновения шаров, <math> l = 700</math>мм. - расстояние между шарами в начальный момент времени.
  
Угол разлета шаров после удара 90°, значит можем рассчитать <big><math> θ_{1}, θ_{2} </math></big>
+
<big><math> χ = \frac{π}{3}\ </math></big>
  
 
<math>\Downarrow </math>
 
<math>\Downarrow </math>
Строка 536: Строка 419:
 
В таком случае, после соударения шаров, они приобретут скорости:
 
В таком случае, после соударения шаров, они приобретут скорости:
  
<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>, т.к. в нашем случае прицельный шар в начальный момент времени неподвижен.
+
<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>, т.к. в нашем случае прицельный шар в начальный момент времени неподвижен.
  
 
В рассмотренном случае угол, под которым производится удар, по отношению к оси OX равен <big><math> \frac{π}{2}\ </math></big>. В  общем случае этот угол зависит от расположения битка.
 
В рассмотренном случае угол, под которым производится удар, по отношению к оси OX равен <big><math> \frac{π}{2}\ </math></big>. В  общем случае этот угол зависит от расположения битка.
  
 
== Обсуждение результатов и выводы ==
 
== Обсуждение результатов и выводы ==
[[Файл:RaspolpzhenieBitka.PNG|справа|600px]]
+
[[Файл:RaspolpzhenieBitka.PNG|справа|400px]]
 
Таким образом, в ходе работы над проектом была написана программа, моделирующая процесс игры в бильярд, а так же смоделирован рассматриваемый удар, целью, которого являются оба шара. Были рассчитаны скорость и угол направления удара в рассматриваемом случае.
 
Таким образом, в ходе работы над проектом была написана программа, моделирующая процесс игры в бильярд, а так же смоделирован рассматриваемый удар, целью, которого являются оба шара. Были рассчитаны скорость и угол направления удара в рассматриваемом случае.
 
Установлены возможные положения шаров, когда целью удара является один или оба шара (рис.3 и рис.4). А на рис.5 указана область расположения для прицельного шара, когда стоит задача загнать в верхние лузы оба шара.
 
Установлены возможные положения шаров, когда целью удара является один или оба шара (рис.3 и рис.4). А на рис.5 указана область расположения для прицельного шара, когда стоит задача загнать в верхние лузы оба шара.
Строка 547: Строка 430:
  
 
<br>
 
<br>
Скачать отчет:[[Медиа:KursStepanovBilliard.docx|docx]]
+
Скачать отчет:
 
<br>
 
<br>
Скачать презентацию:[[Медиа:Presentation.pptx|pptx]]
+
Скачать презентацию:
  
 
== Ссылки по теме ==
 
== Ссылки по теме ==
 
* [http://publ.lib.ru/ARCHIVES/K/KORIOLIS_Gaspar_Gyustav/_Koriolis_G.G..html, Математическая теория явлений бильярдной игры - Г. Кориолис.]
 
* [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, Ландау Л.Д., Лифшиц Е.М., Механика]
 
* [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:

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

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