Текущая версия |
Ваш текст |
Строка 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]. | + | Данный проект посвящен изучению [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]. |
| | | |
| == Формулировка задачи == | | == Формулировка задачи == |
− | Построение и исследование математической модели движения объекта (в нашем случае - футбольного мяча и цилиндра), получение уравнения его движения и построение траектории в трехмерном пространстве с учётом различных внешних факторов, влияющих на движение, таких как сила сопротивления воздуха и эффект Магнуса. | + | Построение и исследование математической модели движения объекта (в нашем случае - футбольного мяча), получение уравнения его движения и построение траектории в трехмерном пространстве с учётом различных внешних факторов, влияющих на движение, таких как сила сопротивления воздуха и эффект Магнуса. |
| | | |
| == Общие сведения по теме == | | == Общие сведения по теме == |
| | | |
− | [[Файл:PiXHK4A.gif|thumb|Пример влияния силы Магнуса на траекторию движения мяча[http://imgur.com/r/gifts/piXHK4A]|450px]] | + | [[Файл:g33viT3.gif|thumb|Пример влияния силы Магнуса на траекторию движения мяча<ref>[http://imgur.com/r/gifs/g33viT3 Штрафной удар Роберто Карлоса]</ref>|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%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: |
Строка 43: |
| Силу Магнуса примем вида<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: |
Строка 60: |
| <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: |
Строка 75: |
| | | |
| | | |
− | Реализация алгоритма.
| + | Реализовав данный алгоритм, была получена программа: |
− | | |
− | Возможности программы:
| |
− | * поочередный запуск мяча и цилиндра,
| |
− | * изменение параметров как в начале, так и во время полета,
| |
− | * просмотр картинки в трехмерном изображении с помощью мыши
| |
− | * сброс всех данных до начальных при нажатии кнопки "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);
| + | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Shvarev/4.html |width=1100 |height=600 |border=0 }} |
− | 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>
| |
| | | |
| == Обсуждение результатов и выводы == | | == Обсуждение результатов и выводы == |
Строка 546: |
Строка 85: |
| Разработанный алгоритм был реализован в среде программирования Javascript с использование библиотеки Three.js. Была построена траектория движения и произведены эксперименты, результаты которых находятся в таблице ниже: | | Разработанный алгоритм был реализован в среде программирования Javascript с использование библиотеки Three.js. Была построена траектория движения и произведены эксперименты, результаты которых находятся в таблице ниже: |
| | | |
− | Шар:
| |
| | | |
| {| border="1" | | {| border="1" |
Строка 556: |
Строка 94: |
| |<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: |
Строка 134: |
| |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: |
Строка 153: |
| |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: |
Строка 174: |
| |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>Δ_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 раза относительное отклонение остается таким же.
| |
| | | |
| | | |
| <br> | | <br> |
− | Скачать отчет: [[Медиа:CourseworkShvarevNikolay.doc|doc]]. | + | Скачать отчет: |
| <br> | | <br> |
− | Скачать презентацию: [[Медиа:CourseworkShvarevNikolay.pptx|pptx]]. | + | Скачать презентацию: |
| | | |
| == Ссылки по теме == | | == Ссылки по теме == |