Цилиндр и наклонная плоскость (48.29)
Материал из Department of Theoretical and Applied Mechanics
- "Задача - Мещерский (48.29)"
Условие
На гладкой горизонтальной плоскости помещена треугольная призма ABC массы m, которая может скользить без трения по этой плоскости; по грани призмы AB катится без скольжения однородный круглый цилиндр массы m1. Определить ускорение призмы.
Решение задачи
Используем уравнение Лагранжа 2-го рода:
, где
L = T - П - функция Лагранжа T - кинетическая энергия системы П - потенциальная энергия системы q - независимые обобщенные координаты Q - непотенциальная обобщённая сила
В данной задаче в качестве обобщенных координат примем изменяющиеся координату призмы
и координату цилиндра по оси, направленной вдоль наклонной плоскости . Представим:, где - кинетическая энергия катка массы , а - треугольной призмы массы .
Треугольная призма откатывается вдоль оси
, следовательно:
Движение цилиндра массы
плоское.
Где
- абсолютная скорость центра масс цилиндра массой :
Здесь
- относительная скорость
Получаем два равенства, соответствующие двум уравнениям Лагранжа:
Откуда получаем:
Реализация на JavaScript
Разработка
Текст программы на языке JavaScript (разработчик Вараев Владислав):
Файл "4829.html"
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>4829</title>
5 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\three.js"></script>
6 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\OBJLoader.js"></script>
7 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\MTLLoader.js"></script>
8 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\OBJMTLLoader.js"></script>
9 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\jquery-1.9.0.js"></script>
10 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\stats.js"></script>
11 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\dat.gui.js"></script>
12 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\chroma.js"></script>
13 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\TrackballControls.js"></script>
14 <script type="text/javascript" src="http://tm.spbstu.ru/htmlets/VaraevV/mesherskiy\OrbitControls.js"></script>
15
16 </style>
17 </head>
18 <body>
19
20 <div id="Stats-output">
21 </div>
22
23 <div id="WebGL-output">
24 </div>
25
26
27 <script type="text/javascript">
28
29 $(function () {
30 var a = 0;
31 var g = 9.8;
32 var m = 20;
33 var m1 = 15;
34 var stats = initStats();
35 var scene = new THREE.Scene();
36 var camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 0.1, 1000);
37 var renderer = new THREE.WebGLRenderer();
38 renderer.setClearColor(new THREE.Color(0xEEEEEE, 1.0));
39 renderer.setSize(window.innerWidth, window.innerHeight);
40 renderer.shadowMapEnabled = true;
41 var spotLight = new THREE.SpotLight( 0xffffff );
42 spotLight.position.set( -100, 0, -10 ); //-40, 60, -10
43 scene.add(spotLight );
44 var ugol= 135;
45 var alpha0 = Math.cos(ugol*Math.PI/180);
46 var step = 0;
47 var plane = createMesh0(new THREE.PlaneGeometry(1000, 2000, 50, 50));
48 scene.add(plane);
49 var cube = createMesh(new THREE.CubeGeometry(2, 200, 800));
50 cube.position.x=0;
51 cube.position.y=0;
52 cube.position.z=0;
53 scene.add(cube);
54 var cylinder1 = createMesh1(new THREE.CylinderGeometry(25, 25, 60, 15, 1));
55 cylinder1.position.x=cube.position.x-400*Math.cos((180-ugol)*Math.PI/180)+25*Math.sin((180-ugol)*Math.PI/180);
56 cylinder1.position.y=cube.position.y;
57 cylinder1.position.z=cube.position.z+400*Math.sin((180-ugol)*Math.PI/180)+25*Math.cos((180-ugol)*Math.PI/180);
58 var c = cylinder1.position.x;
59 var d = cylinder1.position.z;
60 scene.add(cylinder1);
61 var group1 = new THREE.Object3D();
62 group1.add(cube);
63 group1.add(cylinder1);
64 group1.position.x = 0;
65 group1.position.y = 0;
66 group1.position.z=0;
67 scene.add(group1);
68
69 function createMesh0(geom) {
70 var meshMaterial = new THREE.MeshNormalMaterial();
71 meshMaterial.side = THREE.DoubleSide;
72 var wireFrameMat = new THREE.MeshBasicMaterial();
73 wireFrameMat.wireframe = true;
74 var plane = THREE.SceneUtils.createMultiMaterialObject(geom, [meshMaterial, wireFrameMat]);
75 return plane;
76 }
77 function createMesh(geom) {
78 var meshMaterial = new THREE.MeshNormalMaterial();
79 meshMaterial.side = THREE.DoubleSide;
80 var wireFrameMat = new THREE.MeshBasicMaterial();
81 wireFrameMat.wireframe = true;
82 var mesh = THREE.SceneUtils.createMultiMaterialObject(geom, [meshMaterial, wireFrameMat]);
83 return mesh;
84 }
85 function createMesh1(geom) {
86 var mat = new THREE.MeshNormalMaterial();
87 var mesh = new THREE.Mesh(geom,mat);
88 return mesh;
89 }
90
91 camera.position.x = 0;
92 camera.position.y = -1300;
93 camera.position.z = 1500;
94 camera.lookAt(scene.position);
95
96 $("#WebGL-output").append(renderer.domElement);
97 renderer.render(scene, camera);
98 var stats = initStats();
99 cameraControls = new THREE.OrbitControls(camera, renderer.domElement);
100 cameraControls.maxDistance = 800;
101 cameraControls.minDistance = 0.5;
102 cameraControls.update();
103 var controls = new function() {
104 this.Speed = 0.1;
105 this.ugol = 135;
106 this.m = 20;
107 this.m1 = 15;
108 this.a='0'
109 }
110 var obj = { start_again:function(){
111 step=0;
112 cube.position.x=0;
113 cube.position.y=0;
114 cube.position.z=0;
115 cylinder1.position.x=cube.position.x-400*Math.cos((180-ugol)*Math.PI/180)+25*Math.sin((180-ugol)*Math.PI/180);
116 cylinder1.position.y=cube.position.y;
117 cylinder1.position.z=cube.position.z+400*Math.sin((180-ugol)*Math.PI/180)+25*Math.cos((180-ugol)*Math.PI/180);
118 group1.position.x = 0;
119 group1.position.y = 0;
120 group1.position.z=0;
121 }};
122 var gui = new dat.GUI();
123 gui.add(controls, 'Speed',0,0.2);
124 gui.add(controls, 'ugol',89.9999,180);
125 gui.add(controls, 'm',0.1,50);
126 gui.add(controls, 'm1',0.1,50);
127 gui.add(controls,'a').listen();
128 gui.add(obj,'start_again');
129 var step = 0;
130 function render() {
131 cameraControls.update();
132 requestAnimationFrame(render);
133 renderer.render(scene, camera);
134 step += controls.Speed
135 ugol = controls.ugol
136 controls.a=a;
137 m = controls.m
138 m1=controls.m1
139 if(ugol<=135) {
140 group1.rotation.y=Math.cos(ugol*Math.PI/180);
141 }
142 else {
143 group1.rotation.y=Math.cos(ugol*Math.PI/180)+Math.cos((ugol-55)*Math.PI/180);
144 }
145 cylinder1.rotation.y = step*step;
146 a = -(g*m1*Math.sin(2*(180-ugol)*Math.PI/180))/(3*(m1+m)-2*m1*((Math.cos((180-ugol)*Math.PI/180))*(Math.cos((180-ugol)*Math.PI/180))));
147 var v =0.6*a;
148 if (cylinder1.position.z<=25*Math.sin((180-ugol)*Math.PI/180)) {
149 cylinder1.position.x = 25;
150 cylinder1.position.z = 25*Math.sin((180-ugol)*Math.PI/180);
151 cylinder1.rotation.y = 0;
152 group1.position.x =group1.position.x+v;
153 }
154 else {
155 group1.position.x = (a*step*step)/2;
156 cylinder1.position.x=26;
157 cylinder1.position.z=d-g*Math.sin((180-ugol)*Math.PI/180)*step*step/2;
158 }
159 }
160 render();
161 function initStats() {
162 var stats = new Stats();
163 stats.setMode(0); // 0: fps, 1: ms
164 stats.domElement.style.position = 'absolute';
165 stats.domElement.style.left = '0px';
166 stats.domElement.style.top = '0px';
167 $("#Stats-output").append(stats.domElement);
168 return stats;
169 }
170 });
171 </script>
172 </body>
173 </html>