Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| '''''Задача:''''' С помощью языка программирования JavaScript смоделировать эллиптический маятник. | | '''''Задача:''''' С помощью языка программирования JavaScript смоделировать эллиптический маятник. |
− |
| |
− | '''Исполнитель:''' [[Булдаков Павел]]
| |
− |
| |
− | '''Группа:''' [[Группа 09|09]] (23604)
| |
− |
| |
− | '''Семестр:''' весна 2015
| |
− |
| |
| [[Файл:maytnic.png|thumb|]] | | [[Файл:maytnic.png|thumb|]] |
| | | |
| == Решение == | | == Решение == |
− |
| |
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/buldakov/4.html |width=1200 |height=600}}
| |
− |
| |
− |
| |
− | Программа: [[Медиа: Maytnic.rar|скачать]]
| |
− |
| |
− | <div class="mw-collapsible mw-collapsed">
| |
− | '''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
| |
− |
| |
− | <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(0xEEEEEE, 1);
| |
− | render.setSize(window.innerWidth, window.innerHeight);
| |
− |
| |
− | //ставим оси
| |
− |
| |
− | var axes = new THREE.AxisHelper(20);
| |
− | scene.add(axes);
| |
− | var planeGeometry = new THREE.PlaneGeometry(80,10,1,1);
| |
− | var planeMaterial = new THREE.MeshLambertMaterial({color:0xCCCCCC});
| |
− | var plane = new THREE.Mesh(planeGeometry, planeMaterial);
| |
− | plane.rotation.x = -0.5*Math.PI;
| |
− | plane.position.x=0;
| |
− | plane.position.y=0;
| |
− | plane.position.z=0;
| |
− | scene.add(plane);
| |
− |
| |
− | //создаем ползун
| |
− |
| |
− | var cubeGeometry = new THREE.CubeGeometry(20,10,10);
| |
− | var cubeMesh = new THREE.MeshLambertMaterial({color:0xff0000, wireframe:false});
| |
− | var cube = new THREE.Mesh(cubeGeometry, cubeMesh);
| |
− | cube.position.x=-30;
| |
− | cube.position.y=5;
| |
− | cube.position.z=0;
| |
− | scene.add(cube);
| |
− |
| |
− | // создаем соединяющую
| |
− |
| |
− | var cube1Geometry = new THREE.CubeGeometry(1,15,0.5);
| |
− | var cube1Mesh = new THREE.MeshLambertMaterial({color:777777, wireframe:false});
| |
− | var cube1 = new THREE.Mesh(cube1Geometry, cube1Mesh);
| |
− | cube1.position.x=-20;
| |
− | cube1.position.y=-5;
| |
− | cube1.position.z=5;
| |
− | scene.add(cube1);
| |
− |
| |
− | // создаем шшар
| |
− |
| |
− | var trajectoryGeometry = new THREE.SphereGeometry(0.3,20,20);
| |
− | var trajectoryMaterial = new THREE.MeshBasicMaterial({color:0x7777ff, wireframe:true});
| |
− | var sphereGeometry = new THREE.SphereGeometry(4,20,20);
| |
− | var sphereMaterial = new THREE.MeshLambertMaterial({color:0x7777ff, wireframe:false});
| |
− | var sphere = new THREE.Mesh(sphereGeometry, sphereMaterial)
| |
− | sphere.position.x=-30;
| |
− | sphere.position.y=-15;
| |
− | sphere.position.z=5;
| |
− | scene.add(sphere);
| |
− |
| |
− | // устанавливаем источник света
| |
− |
| |
− | var spotLight = new THREE.SpotLight(0xffffff);
| |
− | spotLight.position.set(-40,60,100);
| |
− | scene.add(spotLight);
| |
− |
| |
− | //задаем тени
| |
− |
| |
− | render.shadowMapEnabled = true;
| |
− | plane.receiveShadow = true;
| |
− | cube.castShadow = true;
| |
− | sphere.castShadow = true;
| |
− | spotLight.castShadow = true;
| |
− |
| |
− |
| |
− | //задаем положение камеры
| |
− |
| |
− | camera.position.x= 1.5;
| |
− | camera.position.y= 13.7;
| |
− | camera.position.z= 80;
| |
− | camera.lookAt(scene.position);
| |
− | $("#webGL").append(render.domElement);
| |
− |
| |
− | //добавляем ползунки для изменения скорости , массы, длины и g
| |
− |
| |
− |
| |
− | var controls = new function() {
| |
− | this.m1 = 7.4;
| |
− | this.m2 = 2.9;
| |
− | this.l = 1;
| |
− | this.g = 9.83
| |
− | this.bouncingSpeed = 0.03;
| |
− | }
| |
− | var gui = new dat.GUI();
| |
− |
| |
− | gui.add(controls, 'bouncingSpeed',0,0.5);
| |
− | gui.add(controls, 'm1',1,10);
| |
− | gui.add(controls, 'm2',1,10);
| |
− | gui.add(controls, 'l',0.5,5);
| |
− | gui.add(controls, 'g',0.5,20);
| |
− |
| |
− |
| |
− |
| |
− | var stats = initStats();
| |
− | var step = 0;
| |
− |
| |
− | contra = new THREE.OrbitControls(camera);
| |
− | contra.dumping = 0.2;
| |
− |
| |
− |
| |
− | window.addEventListener('resize',onWindowResize,false);
| |
− |
| |
− | function onWindowResize(){
| |
− | camera.aspect = window.innerWidth/window.innerHeight;
| |
− | camera.updateProjectionMatrix();
| |
− | render.setSize(window.innerWidth,window.innerHeight);
| |
− | renderer();
| |
− | }
| |
− |
| |
− | renderer();
| |
− |
| |
− | // функция, в которой задаются законы, по которым работает эллиптический маятник
| |
− |
| |
− | function renderer()
| |
− | {
| |
− |
| |
− |
| |
− | stats.update();
| |
− |
| |
− | step+=controls.bouncingSpeed;
| |
− | cube1.scale.set(1,controls.l,0.5);
| |
− | t = 15*controls.l;
| |
− |
| |
− | k =Math.sqrt(controls.g/t*controls.m1/(controls.m1+controls.m2));
| |
− | a = t*controls.m1/(controls.m1+controls.m2)*controls.m2/controls.m1*controls.g;
| |
− | cube.position.x=-a*Math.sin(k*step);
| |
− | sphere.position.x = t*(Math.sin(Math.sin(k*step))) - a*Math.sin(k*step);
| |
− | sphere.position.y =-t*(Math.cos(Math.sin(k*step)));
| |
− | cube1.position.x=(cube.position.x + sphere.position.x)/2;
| |
− | cube1.position.y=-t*(Math.cos(Math.sin(k*step)))/2;
| |
− | u = (-cube.position.x + sphere.position.x)/2;
| |
− | v = sphere.position.y/2;
| |
− | cube1.rotation.z=Math.asin(u/Math.sqrt(v*v + u*u));
| |
− |
| |
− |
| |
− |
| |
− | requestAnimationFrame(renderer);
| |
− | contra.update();
| |
− | render.render(scene,camera);
| |
− |
| |
− | var trajectory = new THREE.Mesh(trajectoryGeometry,trajectoryMaterial);
| |
− | trajectory.position.x = sphere.position.x;
| |
− | trajectory.position.y = sphere.position.y;
| |
− | trajectory.position.z = 5;
| |
− | scene.add(trajectory);
| |
− | document.getElementById("td1").innerHTML = camera.position.x;
| |
− | document.getElementById("td2").innerHTML = camera.position.y;
| |
− | document.getElementById("td3").innerHTML = camera.position.z;
| |
− |
| |
− | }
| |
− |
| |
− |
| |
− | }
| |
− | 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>
| |
| | | |
| == Используемые библиотеки == | | == Используемые библиотеки == |
Строка 204: |
Строка 16: |
| | | |
| * задание скорости раскачивания маятника | | * задание скорости раскачивания маятника |
− | * изменение масс шара и ползуна
| |
− | * изменения силы тяжести
| |
| * детальное рассмотрение работы с удобного ракурса | | * детальное рассмотрение работы с удобного ракурса |
| * получение рисунка траектории маятника | | * получение рисунка траектории маятника |
Строка 221: |
Строка 31: |
| где <math>L</math> - функция Лагранжа | | где <math>L</math> - функция Лагранжа |
| | | |
− | <math>L = T-\Pi </math> | + | <math>L = T-П </math> |
| | | |
− | <math>T</math> - кинетическая энергия системы, <math>\Pi</math> - потенциальная энергия системы <math>q_1 = y</math> , <math>q_2 = \varphi </math> | + | <math>T</math> - кинетическая энергия системы, <math>П</math> - потенциальная энергия системы <math>q_1 = y</math> , <math>q_2 = fi</math> |
| | | |
| <math>T = T_1 + T_2</math>, где <math> T_1</math> - кинетическая энергия ползуна, <math>T_1</math> - кинетическая энергия шара | | <math>T = T_1 + T_2</math>, где <math> T_1</math> - кинетическая энергия ползуна, <math>T_1</math> - кинетическая энергия шара |
Строка 231: |
Строка 41: |
| <math>T_2 = \frac{1}{2}\ m_2\ V_2 ^{2}</math> | | <math>T_2 = \frac{1}{2}\ m_2\ V_2 ^{2}</math> |
| | | |
− | <math>V_2 = V_e + V_r</math> , <math>V_e = \dot \varphi \ l</math> , <math>V_r = \dot y\</math> | + | <math>V_2 = V_e + V_r</math> , <math>V_e = \dot phy\l\</math> , <math>V_r = \dot y\</math> |
− | | |
− | <math>V_2 ^{2} = \dot y^{2}\ + \dot \varphi ^{2}\ l^{2} + 2\ l\dot y\dot \varphi \cos(\varphi )\</math>
| |
− | | |
− | <math>T = \frac{1}{2} \ (m_1 + m_2) \dot y^{2} + \frac{1}{2} \ m_2 \ l ^{2} \dot \varphi^{2} + m_2 \ l\dot y\dot \varphi \cos(\varphi )\</math>
| |
− | | |
− | <math>\Pi = - m_2 \ l\ g \cos(\varphi )\ </math>
| |
− | | |
− | <math>L = \frac{1}{2} \ (m_1 + m_2) \dot y^{2} + \frac{1}{2} \ m_2 \ l ^{2} \dot \varphi^{2} + m_2 \ l\ (\dot y\dot \varphi + g) \cos(\varphi )\</math>
| |
− | | |
− | <math>\frac{\partial L}{\partial\dot y} = (m_1 + m_2) \dot y + m_2 \ l\dot \varphi \cos(\varphi )\</math>
| |
− | | |
− | <math>\frac{\partial L}{\partial y} = 0 </math>
| |
− | | |
− | <math>\frac{\partial L}{\partial\dot \varphi } = m_2 \ l ^{2} \dot \varphi + m_2 \ l\dot y \cos(\varphi )\</math>
| |
− | | |
− | <math>\frac{\partial L}{\partial\varphi} = - m_2 \ l\ (\dot y\dot \varphi + g) \sin(\varphi )\</math>
| |
− | | |
− | В результате получаем уравнения , описывающие движение рассматриваемой системы :
| |
− | | |
− | <math> (m_1 + m_2) \ddot y + m_2 \ l\ddot \varphi \cos(\varphi ) - m_2 \ l\dot \varphi \sin(\varphi ) = 0</math>
| |
| | | |
− | <math> l \ddot \varphi + \ddot y \cos(\varphi ) + g \sin(\varphi) = 0 </math> | + | <math>V_2 ^{2} = \dot y^{2}\ + \dot phy^{2}\l^{2}\ + \2\l\dot y\dot phy\cos(phy)\</math> |
| | | |
| == См. также == | | == См. также == |