Редактирование: КП: Эффект Магнуса

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 15: Строка 15:
 
== Аннотация проекта ==
 
== Аннотация проекта ==
  
Данный проект посвящен изучению [https://ru.wikipedia.org/wiki/%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82_%D0%9C%D0%B0%D0%B3%D0%BD%D1%83%D1%81%D0%B0 эффекта Магнуса], возникающего в различных видах спорта, а также использующегося в баллистике, летательных аппаратах и [https://en.wikipedia.org/wiki/E-Ship_1 кораблях].В ходе работы над проектом были рассмотрены траектории полета мяча и цилиндра в зависимости от различных начальных параметров (радиуса, динамической вязкости среды, плотности воздуха, линейной и угловой скорости). Программа написана на языке [https://ru.wikipedia.org/wiki/JavaScript JavaScript] с использование библиотеки [https://threejs.org Three.js].
 
  
 
== Формулировка задачи ==
 
== Формулировка задачи ==
Построение и исследование математической модели движения объекта (в нашем случае - футбольного мяча и цилиндра), получение уравнения его движения и построение траектории в трехмерном пространстве с учётом различных внешних факторов, влияющих на движение, таких как сила сопротивления воздуха и эффект Магнуса.
+
Построение и исследование математической модели движения объекта (в нашем случае футбольного мяча), получение уравнения его движения и построение траектории в трехмерном пространстве с учётом различных внешних факторов, влияющих на движение, таких как сила сопротивления воздуха и эффект Магнуса.
  
 
== Общие сведения по теме ==
 
== Общие сведения по теме ==
 +
Эффект Магнуса - образование подъемной силы, действующей на вращающееся тело при обтекании его потоком жидкости или газа. <ref>[https://ru.wikipedia.org/wiki/%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82_%D0%9C%D0%B0%D0%B3%D0%BD%D1%83%D1%81%D0%B0 Сила Магнуса]</ref>
  
[[Файл:PiXHK4A.gif|thumb|Пример влияния силы Магнуса на траекторию движения мяча[http://imgur.com/r/gifts/piXHK4A]|450px]]
+
[[Файл:g33viT3.gif|thumb|Пример влияния силы Магнуса на траекторию движения мяча|450px]]
Эффект Магнуса - образование подъемной силы, действующей на вращающееся тело при обтекании его потоком жидкости или газа, широко использующейся в спорте, баллистике, летательных аппаратах и кораблях. <ref>[https://ru.wikipedia.org/wiki/%D0%AD%D1%84%D1%84%D0%B5%D0%BA%D1%82_%D0%9C%D0%B0%D0%B3%D0%BD%D1%83%D1%81%D0%B0 Сила Магнуса]</ref>
 
 
 
Данный эффект возникает в результате разности давлений (в соответствии с законом Бернулли<ref>[https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%91%D0%B5%D1%80%D0%BD%D1%83%D0%BB%D0%BB%D0%B8 Уравнение Бернулли]</ref>) на стенках объекта из-за разных скоростей движения воздуха. Возникающий дисбаланс заставляет объект отклоняться.
 
  
 
== Решение ==
 
== Решение ==
  
Силу сопротивления воздуха для мяча будем считать с помощью закона Стокса<ref>[https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0 Закон Стокса]</ref>:
+
Силу сопротивления воздуха будем считать с помощью закона Стокса<ref>[https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%A1%D1%82%D0%BE%D0%BA%D1%81%D0%B0 Закон Стокса]</ref>:
  
 
<big><math>\vec{F} = -6πrη\vec{v} </math></big> , где
 
<big><math>\vec{F} = -6πrη\vec{v} </math></big> , где
Строка 45: Строка 42:
 
Силу Магнуса примем вида<ref>[http://www.your-own-science.org/this-is-not-a-pipes Формула Силы Магнуса]</ref>:
 
Силу Магнуса примем вида<ref>[http://www.your-own-science.org/this-is-not-a-pipes Формула Силы Магнуса]</ref>:
  
<big><math>\vec{F} = 2Sρr\vec{u}\times\vec{ω} </math></big> , где
+
<big><math>\vec{F} = 8πρr^3\vec{u}\times\vec{ω} </math></big> , где
  
 
<math>\vec{F}</math> - сила Магнуса,
 
<math>\vec{F}</math> - сила Магнуса,
 
<math>S</math> - площадь действия силы,
 
  
 
<math>ρ</math> - плотность воздуха,
 
<math>ρ</math> - плотность воздуха,
  
<math>r</math> - радиус,
+
<math>r</math> - радиус мяча,
  
<math>\vec{u}</math> - относительная скорость,
+
<math>\vec{u}</math> - относительная скорость мяча,
  
<math>\vec{ω}</math> - угловая скорость.
+
<math>\vec{ω}</math> - угловая скорость мяча.
  
  
Строка 64: Строка 59:
 
<big><math>
 
<big><math>
 
\begin{cases}
 
\begin{cases}
v_x^{i+1} = v_x^i + (-6πrηv_x^i/m + 2Sρr(u_y^iω_z - u_z^iω_y)/m)\Delta t  \\
+
v_x^{i+1} = v_x^i + (-6πrηv_x^i/m + 8πρr^3(u_y^iω_z - u_z^iω_y)/m)\Delta t  \\
v_y^{i+1} = v_y^i + (-6πrηv_y^i/m + 2Sρr(u_z^iω_w - u_x^iω_z)/m)\Delta t  \\
+
v_y^{i+1} = v_y^i + (-6πrηv_y^i/m + 8πρr^3(u_z^iω_w - u_x^iω_z)/m)\Delta t  \\
v_z^{i+1} = v_z^i + (-6πrηv_z^i/m - g + 2Sρr(u_x^iω_y - u_y^iω_x)/m)\Delta t  \\
+
v_z^{i+1} = v_z^i + (-6πrηv_z^i/m - g + 8πρr^3(u_x^iω_y - u_y^iω_x)/m)\Delta t  \\
 
\end{cases}
 
\end{cases}
 
</math></big>
 
</math></big>
Строка 79: Строка 74:
  
  
Реализация алгоритма.
+
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Shvarev/4.html |width=1100 |height=600 |border=0 }}
 
 
Возможности программы:
 
* поочередный запуск мяча и цилиндра,
 
* изменение параметров как в начале, так и во время полета,
 
* просмотр картинки в трехмерном изображении с помощью мыши
 
* сброс всех данных до начальных при нажатии кнопки "Reload"
 
 
 
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Shvarev/4.html |width=1100 |height=500 |border=0 }}
 
 
 
 
 
<div class="mw-collapsible mw-collapsed">
 
'''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
 
Файл '''"4.js"'''
 
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 
 
 
function main()
 
{
 
  var scene = new THREE.Scene();
 
  var camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);
 
  var render = new THREE.WebGLRenderer();
 
  render.setClearColor(0x87CEFA, 1);
 
  render.setSize(800, 400);
 
 
 
  var axes = new THREE.AxisHelper(20);
 
  scene.add(axes);
 
 
 
  /**
 
  var planeGeometry = new THREE.PlaneGeometry(105,68,50,1);
 
  */
 
  var planeGeometry = new THREE.PlaneGeometry(1000,500,50,1);
 
  var planeMaterial = new THREE.MeshLambertMaterial({color:0x068000});
 
  var plane = new THREE.Mesh(planeGeometry, planeMaterial);
 
  plane.position.x=0;
 
  plane.position.y=0;
 
  plane.position.z=-0.11;
 
 
 
  scene.add(plane);
 
 
 
  var ballGeometry = new THREE.SphereGeometry( 0.11, 16, 16 );
 
  var ballMaterial = new THREE.MeshBasicMaterial( {color: 0xffff00,wireframe:true} );
 
  var ball = new THREE.Mesh( ballGeometry, ballMaterial );
 
  scene.add( ball );
 
  ball.castShadow = true;
 
 
 
 
 
  var cylinderGeometry = new THREE.CylinderGeometry(0.11,0.11,1,16);
 
  var cylinderMaterial = new THREE.MeshLambertMaterial({color:0xffff00});
 
  var cylinder = new THREE.Mesh(cylinderGeometry, cylinderMaterial)
 
  cylinder.position.x=0;
 
  cylinder.position.y=0;
 
  cylinder.position.z=0;
 
  scene.add(cylinder);
 
  cylinder.castShadow = true;
 
 
 
  var trajectoryGeometryB = new THREE.SphereGeometry(0.05, 16, 16);
 
  var trajectoryMaterialB = new THREE.MeshBasicMaterial( {color: 0x000000,wireframe:true} );
 
 
 
  var trajectoryGeometryC = new THREE.SphereGeometry(0.05, 16, 16);
 
  var trajectoryMaterialC = new THREE.MeshBasicMaterial( {color: 0xFF0000,wireframe:true} );
 
 
 
  var traMaterialB = new THREE.MeshBasicMaterial({color: 0xffffff});
 
  var traGeometryB = new THREE.CircleGeometry( 0.05, 16);       
 
 
 
  var traMaterialC = new THREE.MeshBasicMaterial({color: 0xFF9900});
 
  var traGeometryC = new THREE.CircleGeometry( 0.05, 16);       
 
 
 
 
 
  /**
 
  var cubeGeometry = new THREE.CubeGeometry(4,4,4);
 
  var cubeMesh = new THREE.MeshLambertMaterial({color:0xff0000, wireframe:false});
 
  var cube = new THREE.Mesh(cubeGeometry, cubeMesh);
 
  cube.position.x=-4;
 
  cube.position.y=3;
 
  cube.position.z=0;
 
  scene.add(cube);
 
 
 
 
 
  var cylinderGeometry = new THREE.CylinderGeometry(4,4,5,16);
 
  var cylinderMaterial = new THREE.MeshLambertMaterial({color:0xaaee00});
 
  var cylinder = new THREE.Mesh(cylinderGeometry, cylinderMaterial)
 
  cylinder.position.x=10;
 
  cylinder.position.y=10;
 
  cylinder.position.z=0;
 
 
 
  scene.add(cylinder);
 
  */
 
 
 
 
 
 
 
 
 
  var  spotLight = new THREE.SpotLight(0xffffff);
 
  spotLight.position.set(0,0,1500);
 
  scene.add(spotLight);
 
 
 
 
 
  spotLight.castShadow = true;
 
 
 
 
 
 
 
  render.shadowMapEnabled = true;
 
  plane.receiveShadow = true;
 
 
 
  /**
 
  cube.castShadow = true;
 
  cylinder.castShadow = true;
 
  */
 
 
 
 
 
 
 
  var a = new THREE.Vector3( 5, 2, -1 );
 
  var b = new THREE.Vector3( -1, 1, 1 );
 
 
 
  var c = new THREE.Vector3();
 
  c.crossVectors( a, b );
 
 
 
  camera.position.x= -30;
 
  camera.position.y= 0;
 
  camera.position.z= 60;
 
  camera.lookAt(c);
 
 
 
  camera.lookAt(scene.position);
 
  $("#webGL").append(render.domElement);
 
 
 
 
 
 
 
  var controls = new function() {
 
    this.WindPowerX = 0;
 
    this.WindPowerY = 0;
 
    this.WindPowerZ = 0;
 
    this.Mass = 0.45;
 
    this.Radius = 0.11;
 
this.Height = 0.22;
 
    this.Viscosity = 0.000178;
 
    this.AirDensity = 1.2754;
 
    this.g = 9.8
 
    this.Vx = 15;
 
    this.Vy = 0;
 
    this.Vz = 5;
 
    this.OmegaX = 0;
 
    this.OmegaY = 0;
 
    this.OmegaZ = -10;
 
  }
 
  var gui = new dat.GUI();
 
  gui.add(controls, 'WindPowerX',-10,10);
 
  gui.add(controls, 'WindPowerY',-10,10);
 
  gui.add(controls, 'WindPowerZ',-10,10);
 
  gui.add(controls, 'Mass',0.41,0.45);
 
  gui.add(controls, 'Radius',0.01,0.21);
 
  gui.add(controls, 'Height',0.1, 1);
 
  gui.add(controls, 'Viscosity',0.00001, 0.001)
 
  gui.add(controls, 'AirDensity',1, 1000)
 
  gui.add(controls, 'g',0, 20)
 
  gui.add(controls, 'Vx',0,40);
 
  gui.add(controls, 'Vy',0,40);
 
  gui.add(controls, 'Vz',0,40);
 
  gui.add(controls, 'OmegaX',-10,10);
 
  gui.add(controls, 'OmegaY',-10,10);
 
  gui.add(controls, 'OmegaZ',-10,10);
 
 
 
 
 
  contr = new THREE.OrbitControls(camera);
 
  contr.dumping = 0.2;
 
 
 
 
 
 
 
  /**contr = new THREE.TrackballControls(camera);
 
  contr.rotateSpeed = 1.0;
 
  contr.zoomSpeed = 1.2;
 
  contr.panSpeed = 0.8;
 
  contr.noZoom = false;
 
  contr.noPan = false;
 
  contr.staticMoving = true;
 
  contr.dynamicDampingFactor = 0.3;
 
  contr.keys = [65,83,68];
 
  */
 
 
 
 
 
  /**window.addEventListener('resize',onWindowResize,false);
 
  function onWindowResize()
 
  {
 
    camera.aspect = window.innerWidth/window.innerHeight;
 
    camera.updateProjectionMatrix();
 
    render.setSize(window.innerWidth,window.innerHeight);
 
 
 
    renderer();
 
  }
 
  */
 
 
 
  var stats = initStats();
 
  var step = 0;
 
 
 
 
 
  Vx = 0;
 
  Vy = 0;
 
  Vz = 0;
 
  Mass = 0;
 
  Viscosity = 0;
 
  dt = 0.01;
 
  Radius = 0;
 
  g = 0;
 
  WindX = 0;
 
  WindY = 0;
 
  WindZ = 0;
 
  AirDensity = 0;
 
 
 
  Height = 1;
 
 
 
  var VxB =controls.Vx;
 
  var VxC =controls.Vx;
 
  var VyB =controls.Vy;
 
  var VyC =controls.Vy;
 
  var VzB =controls.Vz;
 
  var VzC =controls.Vz;
 
 
 
  OmegaXB = controls.OmegaX;
 
  OmegaXC = controls.OmegaX;
 
  OmegaYB = controls.OmegaY;
 
  OmegaYC = controls.OmegaY;
 
  OmegaZB = controls.OmegaZ;
 
  OmegaZC = controls.OmegaZ;
 
   
 
 
 
  pppB = 0;
 
  pppC = 0;
 
  kkk = 0;
 
 
 
  function renderer()
 
  {
 
    /**
 
    cube.rotation.x+=controls.rotationSpeed;
 
    cube.rotation.y+=controls.rotationSpeed;
 
    cube.rotation.z+=controls.rotationSpeed;
 
   
 
    cylinder.position.x = 20+(10*(Math.cos(step)));
 
    cylinder.position.y = 2+(10*(Math.abs(Math.sin(step))));
 
   
 
   
 
    */
 
 
    if (pppB == 0)
 
    {
 
      VxB+=controls.Vx;   
 
      VyB+=controls.Vy;
 
      VzB+=controls.Vz;
 
      WindX = controls.WindPowerX;
 
      WindY = controls.WindPowerY;
 
      WindZ = controls.WindPowerZ;
 
     
 
      OmegaXB = controls.OmegaX;
 
      OmegaYB = controls.OmegaY;
 
      OmegaZB = controls.OmegaZ;
 
   
 
           
 
      pppB = 1;
 
     
 
    }
 
   
 
    UxB = VxB - WindX;
 
    UyB = VyB - WindY;
 
    UzB = VzB - WindZ;
 
 
 
    Mass=controls.Mass;
 
    Radius=controls.Radius;
 
    Viscosity = controls.Viscosity;
 
    g = controls.g;
 
   
 
    AirDensity = controls.AirDensity;
 
 
 
   
 
    if (ball.position.z >= 0)
 
    {
 
 
/**
 
      VxB += (-6*Math.PI*Viscosity*Radius*VxB/Mass + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UyB*OmegaZB - UzB*OmegaYB)/Mass)*dt;
 
      VyB += (-6*Math.PI*Viscosity*Radius*VyB/Mass + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UzB*OmegaXB - UxB*OmegaZB)/Mass )*dt;
 
      VzB += (-6*Math.PI*Viscosity*Radius*VzB/Mass - g + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UxB*OmegaYB - UyB*OmegaXB)/Mass)*dt;
 
     
 
      OmegaXB += -6*Math.PI*Viscosity*Radius*OmegaXB*Radius/Mass;
 
      OmegaYB += -6*Math.PI*Viscosity*Radius*OmegaYB*Radius/Mass;
 
      OmegaZB += -6*Math.PI*Viscosity*Radius*OmegaZB*Radius/Mass;
 
     
 
  */
 
 
 
  VxB += (2*Math.PI*AirDensity*Radius*Radius*Radius*(UyB*OmegaZB - UzB*OmegaYB)/Mass)*dt;
 
      VyB += (2*Math.PI*AirDensity*Radius*Radius*Radius*(UzB*OmegaXB - UxB*OmegaZB)/Mass )*dt;
 
      VzB += (-g + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UxB*OmegaYB - UyB*OmegaXB)/Mass)*dt;
 
     
 
      ball.position.x += VxB*dt;
 
      ball.position.y += VyB*dt;
 
      ball.position.z += VzB*dt;
 
     
 
     
 
     
 
      ball.rotation.x += OmegaXB*dt;
 
      ball.rotation.y += OmegaYB*dt;
 
      ball.rotation.z += OmegaZB*dt;
 
     
 
      var trajectoryB = new THREE.Mesh(trajectoryGeometryB, trajectoryMaterialB);
 
      trajectoryB.position.x = ball.position.x;
 
      trajectoryB.position.y = ball.position.y;
 
      trajectoryB.position.z = ball.position.z;
 
     
 
      scene.add( trajectoryB );
 
     
 
     
 
      var traB = new THREE.Mesh( traGeometryB, traMaterialB);
 
      traB.position.x = ball.position.x;
 
      traB.position.y = ball.position.y;
 
      traB.position.z = 0;
 
      scene.add(traB);
 
     
 
      document.getElementById("td1").innerHTML = ball.position.y ;
 
      document.getElementById("td2").innerHTML = ball.position.x ;
 
 
 
    }
 
   
 
    requestAnimationFrame(renderer);
 
   
 
    contr.update();
 
   
 
    render.render(scene,camera);
 
   
 
   
 
   
 
   
 
  }
 
 
 
  alpha1 = 0;
 
alpha2 = 0;
 
alpha3 = 0;
 
rot1 = 0;
 
rot2 = 0;
 
rot3 = 0;
 
 
 
  function renderer2()
 
  {
 
 
 
 
if (pppC == 0)
 
{
 
      VyC+=controls.Vy;
 
      VxC+=controls.Vx;   
 
      VzC+=controls.Vz;
 
      WindX = controls.WindPowerX;
 
      WindY = controls.WindPowerY;
 
      WindZ = controls.WindPowerZ;
 
     
 
      OmegaXC = controls.OmegaX;
 
      OmegaYC = controls.OmegaY;
 
      OmegaZC = controls.OmegaZ;
 
   
 
           
 
      pppC = 1;
 
     
 
    }
 
   
 
    UxC = VxC - WindX;
 
    UyC = VyC - WindY;
 
    UzC = VzC - WindZ;
 
 
 
    Mass=controls.Mass;
 
    Radius=controls.Radius;
 
    Viscosity = controls.Viscosity;
 
    g = controls.g;
 
    Height = controls.Height;
 
    AirDensity = controls.AirDensity;
 
 
var cylinderGeometry = new THREE.CylinderGeometry(2*Radius,2*Radius, Height, 16);
 
 
cylinder.geometry = cylinderGeometry;
 
 
 
 
 
if (cylinder.position.z >= 0)
 
{
 
/**
 
VxC += (-6*Math.PI*Viscosity*Radius*VxC/Mass + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UyC*OmegaZC - UzC*OmegaYC)/Mass)*dt;
 
VyC += (-6*Math.PI*Viscosity*Radius*VyC/Mass + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UzC*OmegaXC - UxC*OmegaZC)/Mass )*dt;
 
VzC += (-6*Math.PI*Viscosity*Radius*VzC/Mass - g + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UxC*OmegaYC - UyC*OmegaXC)/Mass)*dt;
 
 
OmegaXC += -6*Math.PI*Viscosity*Radius*OmegaXC*Radius/Mass;
 
OmegaYC += -6*Math.PI*Viscosity*Radius*OmegaYC*Radius/Mass;
 
OmegaZC += -6*Math.PI*Viscosity*Radius*OmegaZC*Radius/Mass;
 
*/
 
/**
 
VxC += (2*Math.PI*AirDensity*Radius*Radius*Radius*(UyC*OmegaZC - UzC*OmegaYC)/Mass)*dt;
 
VyC += (2*Math.PI*AirDensity*Radius*Radius*Radius*(UzC*OmegaXC - UxC*OmegaZC)/Mass )*dt;
 
VzC += (-g + 2*Math.PI*AirDensity*Radius*Radius*Radius*(UxC*OmegaYC - UyC*OmegaXC)/Mass)*dt;
 
*/
 
 
 
 
alpha1 = (cylinder.rotation.x - rot1)/(2*Math.PI);
 
alpha2 = (cylinder.rotation.y - rot2)/(2*Math.PI);
 
alpha3 = (cylinder.rotation.z - rot3)/(2*Math.PI);
 
 
rot1 = cylinder.rotation.x;
 
rot2 = cylinder.rotation.y;
 
rot3 = cylinder.rotation.z;
 
 
VxC += (2*AirDensity*Radius*(2*Radius*Height*Math.cos(alpha1) + Math.PI*Radius*Radius*Math.sin(alpha1) )*(UyC*OmegaZC - UzC*OmegaYC)/Mass)*dt;
 
VyC += (2*AirDensity*Radius*(2*Radius*Height*Math.sin(alpha2) + Math.PI*Radius*Radius*Math.cos(alpha2))*(UzC*OmegaXC - UxC*OmegaZC)/Mass )*dt;
 
VzC += (-g + 2*AirDensity*Radius*(2*Radius*Height*Math.cos(alpha3) + Math.PI*Radius*Radius*Math.sin(alpha3))*(UxC*OmegaYC - UyC*OmegaXC)/Mass)*dt;
 
 
cylinder.position.x += VxC*dt;
 
cylinder.position.y += VyC*dt;
 
cylinder.position.z += VzC*dt;
 
 
 
cylinder.rotation.x += OmegaXC*dt;
 
cylinder.rotation.y += OmegaYC*dt;
 
cylinder.rotation.z += OmegaZC*dt;
 
 
 
 
 
var trajectoryC = new THREE.Mesh(trajectoryGeometryC, trajectoryMaterialC);
 
trajectoryC.position.x = cylinder.position.x;
 
trajectoryC.position.y = cylinder.position.y;
 
trajectoryC.position.z = cylinder.position.z;
 
     
 
scene.add( trajectoryC );
 
     
 
var traC = new THREE.Mesh( traGeometryC, traMaterialC);
 
traC.position.x = cylinder.position.x;
 
traC.position.y = cylinder.position.y;
 
traC.position.z = 0;
 
scene.add(traC);
 
 
document.getElementById("td3").innerHTML = cylinder.position.y ;
 
document.getElementById("td4").innerHTML = cylinder.position.x;
 
 
}
 
 
requestAnimationFrame(renderer2);
 
   
 
    contr.update();
 
   
 
    render.render(scene,camera);
 
 
  }
 
 
 
  this.start = renderer;
 
  this.start2 = renderer2;
 
 
 
 
 
 
 
}
 
function initStats()
 
{
 
  var stats = new Stats();
 
  stats.setMode(0);
 
  stats.domElement.style.position='absolute';
 
  stats.domElement.style.left = '0px';
 
  stats.domElement.style.top = '0px';
 
  $("#Stats").append(stats.domElement);
 
  return stats;
 
}
 
 
 
 
 
 
 
</syntaxhighlight>
 
</div>
 
  
 
== Обсуждение результатов и выводы ==
 
== Обсуждение результатов и выводы ==
Строка 544: Строка 80:
 
[[Файл:Balltrajectory2.png|thumb|Пример траектории мяча|450px]]
 
[[Файл:Balltrajectory2.png|thumb|Пример траектории мяча|450px]]
  
Разработанный алгоритм был реализован в среде программирования Javascript с использование библиотеки Three.js. Была построена траектория движения и произведены эксперименты, результаты которых находятся в таблице ниже:
 
  
Шар:
 
  
 
{| border="1"
 
{| border="1"
Строка 556: Строка 90:
 
  |<math>ω_y</math>
 
  |<math>ω_y</math>
 
  |<math>ω_z</math>
 
  |<math>ω_z</math>
  |<math>m</math>
+
  |<math>Δ_y</math>
  |<math>r</math>
+
  |<math>ω_x</math>
 +
|<math>ω_y</math>
 +
|<math>ω_z</math>
 +
|<math>Δ_y</math>
 +
|<math>ω_x</math>
 +
|<math>ω_y</math>
 +
|<math>ω_z</math>
 +
|<math>Δ_y</math>
 +
|<math>ω_x</math>
 +
|<math>ω_y</math>
 +
|<math>ω_z</math>
 
  |<math>Δ_y</math>
 
  |<math>Δ_y</math>
 
  |-
 
  |-
  |15
+
  |5
 
  |0
 
  |0
 
  |5
 
  |5
 
  |0
 
  |0
 
  |0
 
  |0
  | -10
+
  | -5
  |0.45
+
  |2.4644
  |0.11
+
  |5
|14.585
 
|-
 
|15
 
 
  |0
 
  |0
  |5
+
  | -5
 +
|3.2022
 
  |0
 
  |0
 
  |0
 
  |0
 
  | -10
 
  | -10
  |0.41
+
  |4.8584
|0.11
 
|15.945
 
|-
 
|15
 
|0
 
 
  |5
 
  |5
|0
 
 
  |0
 
  |0
 
  | -10
 
  | -10
  |0.45
+
  |5.4070
|0.01
 
|0.011
 
 
  |-
 
  |-
  |15
+
  |10
 
  |0
 
  |0
 
  |5
 
  |5
Строка 596: Строка 130:
 
  |0
 
  |0
 
  | -5
 
  | -5
  |0.45
+
  |4.9289
  |0.11
+
  |5
|7.399
 
|-
 
|7.5
 
 
  |0
 
  |0
  |5
+
  | -5
 +
|5.4903
 
  |0
 
  |0
 
  |0
 
  |0
 
  | -10
 
  | -10
  |0.45
+
  |9.9168
|0.11
 
|7.292
 
|}
 
 
 
Цилиндр:
 
 
 
{| border="1"
 
|-
 
|<math>V_x</math>
 
|<math>V_y</math>
 
|<math>V_z</math>
 
|<math>ω_x</math>
 
|<math>ω_y</math>
 
|<math>ω_z</math>
 
|<math>m</math>
 
|<math>r</math>
 
|<math>h</math>
 
|<math>Δ_y</math>
 
|-
 
|15
 
|0
 
 
  |5
 
  |5
|0
 
 
  |0
 
  |0
 
  | -10
 
  | -10
  |0.45
+
  |9.6552
|0.11
 
|0.22
 
|14.508
 
 
  |-
 
  |-
 
  |15
 
  |15
Строка 642: Строка 149:
 
  |0
 
  |0
 
  |0
 
  |0
  | -10
+
  | -5
  |0.41
+
  |7.3934
  |0.11
+
  |5
|0.22
 
|15.844
 
|-
 
|15
 
 
  |0
 
  |0
  |5
+
  | -5
 +
|7.6860
 
  |0
 
  |0
 
  |0
 
  |0
 
  | -10
 
  | -10
  |0.45
+
  |14.5751
|0.01
 
|0.22
 
|0.011
 
|-
 
|15
 
|0
 
 
  |5
 
  |5
|0
 
 
  |0
 
  |0
 
  | -10
 
  | -10
|0.45
+
  |13.6855
|0.11
 
|1
 
  |13.287
 
 
  |-
 
  |-
  |15
+
  |20
 
  |0
 
  |0
 
  |5
 
  |5
Строка 676: Строка 170:
 
  |0
 
  |0
 
  | -5
 
  | -5
  |0.45
+
  |9.8578
  |0.11
+
  |5
  |0.22
+
  |0
  |7.389
+
  | -5
  |-
+
  |9.7909
  |7.5
+
  |0
 
  |0
 
  |0
 +
| -10
 +
|19.4335
 
  |5
 
  |5
|0
 
 
  |0
 
  |0
 
  | -10
 
  | -10
  |0.45
+
  |17.4784
|0.11
 
|0.22
 
|7.254
 
 
  |}
 
  |}
 
где <math>V_x</math>, <math>V_y</math>, <math>V_z</math> - начальные линейные скорости, <math>ω_x</math>, <math>ω_y</math>, <math>ω_z</math> - начальные угловые скорости, <math>m</math> - масса объекта, <math>r</math> - радиус объекта, <math>h</math> - высота цилиндра, а <math>Δ_y</math> - полученное смещение по оси <math>y</math>.
 
 
'''Вывод:''' Исходя из численных данных, полученных после проведения экспериментов, можно сделать вывод, что относительное смещение зависит от угловой скорости, радиуса, массы и силы тяжести, но не зависит от линейной скорости. Например, при уменьшении угловой скорости в 2 раза следует уменьшение относительного отклонения в ~2 раза, а при уменьшении линейной скорости в 2 раза относительное отклонение остается таким же.
 
 
 
 
<br>
 
<br>
Скачать отчет: [[Медиа:CourseworkShvarevNikolay.doc|doc]].
+
Скачать отчет:
 
<br>
 
<br>
Скачать презентацию: [[Медиа:CourseworkShvarevNikolay.pptx|pptx]].
+
Скачать презентацию:
  
 
== Ссылки по теме ==
 
== Ссылки по теме ==
Вам запрещено изменять защиту статьи. 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:

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

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