Текущая версия |
Ваш текст |
Строка 31: |
Строка 31: |
| <math>T = \frac{1}{2}\ m\ (\dot l\ ^{2}+l^{2}\dot\varphi^{2})</math> | | <math>T = \frac{1}{2}\ m\ (\dot l\ ^{2}+l^{2}\dot\varphi^{2})</math> |
| | | |
− | <math>\Pi = - m \ g\ l \cos(\varphi )\ </math> | + | <math>\Pi = m \ g\ l \cos(\varphi )\ </math> |
| | | |
| Дифференцируя полученные выражения энергий и подставляя в уравнение Лагранжа результаты дифференцирования, получаем уравнение движения рассматриваемой системы: | | Дифференцируя полученные выражения энергий и подставляя в уравнение Лагранжа результаты дифференцирования, получаем уравнение движения рассматриваемой системы: |
Строка 47: |
Строка 47: |
| *stats.js | | *stats.js |
| | | |
− | *OrbitControls.js | + | *OrbitControls.ru |
| | | |
| Положим, что длина нити l увеличивается линейно с коэффициентом удлинения с. Это предположение используется при построении модели, то есть рассматриваем частный случай со следующим законом изменения длины нити: | | Положим, что длина нити l увеличивается линейно с коэффициентом удлинения с. Это предположение используется при построении модели, то есть рассматриваем частный случай со следующим законом изменения длины нити: |
| | | |
| *l(t)=l(0)+ct | | *l(t)=l(0)+ct |
− |
| |
− | ==Демонстрация модели==
| |
| | | |
| {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Palchikovskaya_NA/Generalwork2.html |width=600 |height=450}} | | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Palchikovskaya_NA/Generalwork2.html |width=600 |height=450}} |
− |
| |
− | <div class="mw-collapsible mw-collapsed">
| |
− | '''Текст программы на языке JavaScript:''' <div class="mw-collapsible-content">
| |
− | Файл '''"Generalwork2.js"'''
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− |
| |
− | function init()
| |
− | {
| |
− | var stats=initStats();
| |
− | var scene=new THREE.Scene();
| |
− | var camera=new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);
| |
− | var renderer=new THREE.WebGLRenderer();
| |
− | renderer.setClearColor(new THREE.Color(0xABB1E0,1.0));
| |
− | renderer.setSize(window.innerWidth, window.innerHeight);
| |
− | renderer.shadowMapEnabled=true;
| |
− |
| |
− | var planeGeometry=new THREE.PlaneGeometry(60,20,1,1);
| |
− | var planeMaterial=new THREE.MeshLambertMaterial({color:0x0ffd5});
| |
− | var plane=new THREE.Mesh(planeGeometry,planeMaterial);
| |
− | plane.receiveShadow=true;
| |
− | plane.rotation.x=-Math.PI/2;
| |
− | plane.position.set(0,0,0);
| |
− | scene.add(plane);
| |
− |
| |
− | camera.position.set(0,5,50);
| |
− | camera.lookAt(new THREE.Vector3(0,-10,0));
| |
− |
| |
− | OrbitControls= new THREE.OrbitControls(camera);
| |
− | OrbitControls.autoRotate = true;
| |
− | var clock = new THREE.Clock();
| |
− |
| |
− | var ambientLight=new THREE.AmbientLight(0x0c0c0c);
| |
− | scene.add(ambientLight);
| |
− | var spotLight=new THREE.SpotLight(0xffffff);
| |
− | spotLight.castShadow = true;
| |
− | spotLight.position.set(-40,60,-10);
| |
− | scene.add(spotLight);
| |
− |
| |
− | document.getElementById("WebGL-output").appendChild(renderer.domElement);
| |
− |
| |
− | group=new THREE.Object3D();
| |
− | function draw()
| |
− | {
| |
− | scene.remove(group)
| |
− | L0=20;
| |
− | c=controls.c;
| |
− | L=L0+c*time;
| |
− | group=new THREE.Object3D();
| |
− | var cylinderGeometry=new THREE.CylinderGeometry(0.15,0.15,L);
| |
− | var cylinderMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff});
| |
− | var cylinder=new THREE.Mesh(cylinderGeometry,cylinderMaterial);
| |
− | var sphereGeometry=new THREE.SphereGeometry(1,20,20);
| |
− | var sphereMaterial=new THREE.MeshLambertMaterial({color: 0x7777ff});
| |
− | var sphere=new THREE.Mesh(sphereGeometry,sphereMaterial);
| |
− | sphere.castShadow=true;
| |
− | cylinder.position.set(0,-L/2,0);
| |
− | sphere.position.set(0,-L,0);
| |
− | group.add(cylinder);
| |
− | group.add(sphere);
| |
− | group.position.set(0,0,0);
| |
− | scene.add(group);
| |
− | }
| |
− |
| |
− | var omega,phi,c,time,dt;
| |
− | var controls = new function ()
| |
− | {
| |
− | this.c=0.1;
| |
− | this.redraw=function()
| |
− | {
| |
− | dt=0.005;
| |
− | time=0;
| |
− | omega=0;
| |
− | phi=Math.PI/3;
| |
− | c=controls.c;
| |
− | group.rotation.z=phi;
| |
− | }
| |
− | this.L=20+this.c*time;
| |
− |
| |
− | }
| |
− |
| |
− | var controls1=new function()
| |
− | {
| |
− | this.L='0';
| |
− | }
| |
− |
| |
− |
| |
− | var gui = new dat.GUI();
| |
− | gui.add(controls,'c',0.01,0.2);
| |
− | gui.add(controls1,'L').listen();
| |
− | gui.add(controls,'redraw');
| |
− |
| |
− |
| |
− | controls.redraw();
| |
− | render();
| |
− | function render()
| |
− | {
| |
− | stats.update();
| |
− | time+=dt;
| |
− | draw();
| |
− |
| |
− | omega=omega-((9.8*Math.sin(phi)+2*c*omega)/(L0+c*time))*dt;
| |
− | phi+=omega;
| |
− | controls1.L=L0+c*time;
| |
− | group.rotation.z=phi;
| |
− |
| |
− | var delta = clock.getDelta();
| |
− | orbitControls.update(delta);
| |
− |
| |
− | renderer.render(scene,camera);
| |
− | requestAnimationFrame(render);
| |
− |
| |
− | }
| |
− | function initStats()
| |
− | {
| |
− | var stats = new Stats();
| |
− | stats.setMode(0);
| |
− | stats.domElement.style.position = 'absolute';
| |
− | stats.domElement.style.left = '0px';
| |
− | stats.domElement.style.top = '0px';
| |
− | document.getElementById("Stats-output").appendChild(stats.domElement);
| |
− | return stats;
| |
− | }
| |
− | }
| |
− | window.onload = init;
| |
− | </syntaxhighlight>
| |
− | </div>
| |