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

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 87: Строка 87:
 
* сброс всех данных до начальных при нажатии кнопки "Reload"
 
* сброс всех данных до начальных при нажатии кнопки "Reload"
  
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Shvarev/4.html |width=1100 |height=500 |border=0 }}
+
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Shvarev/4.html |width=1100 |height=600 |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>
 
  
 
== Обсуждение результатов и выводы ==
 
== Обсуждение результатов и выводы ==
Строка 695: Строка 244:
 
где <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>.
 
где <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 раза относительное отклонение остается таким же.
+
Исходя из числовых данных, полученных после проведения экспериментов, можно сделать вывод, что при большей массе скорость меньше. Это объясняется тем, что на объект большей массы действует большая сила тяжести, препятствующая движению объекта. Также видим, что при уменьшении радиуса смещение уменьшается. Это объясняется тем, что на объект с меньшим радиусом действует меньшая разность давлений при вращении, и, следственно, меньшая сила Магнуса.
  
  
Вам запрещено изменять защиту статьи. 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:

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

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