Цилиндр и наклонная плоскость (48.29)

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
  • "Задача - Мещерский (48.29)"

Условие

На гладкой горизонтальной плоскости помещена треугольная призма ABC массы m, которая может скользить без трения по этой плоскости; по грани призмы AB катится без скольжения однородный круглый цилиндр массы m1. Определить ускорение призмы.

Решение задачи

Используем уравнение Лагранжа 2-го рода:

[math]\frac{d}{dt}\left(\frac{\partial L}{\partial\dot q_i}\right) - \frac{\partial L}{\partial q_i} = 0 , (i = 1,2)[/math] , где

L = T - П - функция Лагранжа
T - кинетическая энергия системы
П - потенциальная энергия системы
q - независимые обобщенные координаты
В данной задаче в качестве обобщенных координат примем изменяющиеся координату призмы x и координату цилиндра c по оси, направленной вдоль наклонной плоскости [math]\varphi [/math].


Разработка

Текст программы на языке 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>