Мещерский. Задача 4.57 — различия между версиями

Материал из Department of Theoretical and Applied Mechanics
Перейти к: навигация, поиск
(Новая страница: «'''Мещерский. Задача 4.57''' Визуализация 3D-задачи по статике на JavaScript Исполнитель: Тимоше…»)
 
 
(не показано 9 промежуточных версий этого же участника)
Строка 7: Строка 7:
 
Группа 23604/1
 
Группа 23604/1
 
Кафедра Теоретической механики
 
Кафедра Теоретической механики
 +
 +
==Формулировка задачи==
 +
 +
Два гладких однородных шара С<sub>1</sub> и С<sub>2</sub>, радиусы которых R<sub>1</sub> и R<sub>2</sub>, а веса P<sub>1</sub> и P<sub>2</sub>, подвешены на веревках AB и AD в точке A; AB = l<sub>1</sub>; AD = l<sub>2</sub>; l<sub>1</sub> + R<sub>1</sub>= l<sub>2</sub> + R<sub>2</sub>; угол BAD = α. Определить угол θ, образуемый веревкой AD с горизонтальной плоскостью AE, натяжения веревок T<sub>1</sub>, T<sub>2</sub> и силу давления одного шара на другой.
 +
 +
 +
 +
==Решение задачи==
 +
 +
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/ZadachaMesherskyi457.html |width=1200 |height=600 |border=0 }}
 +
 +
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="javascript" line start="1" enclose="div">
 +
 +
<!DOCTYPE html>
 +
 +
<head>
 +
<script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/three.js">
 +
</script>
 +
<script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/stats.min.js">
 +
</script>
 +
<script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/OrbitControls.js" >
 +
</script>
 +
<script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/dat.gui.js">
 +
</script>
 +
    <style>
 +
        body {
 +
            margin: 0;
 +
            overflow: hidden;
 +
        }
 +
    </style>
 +
 +
    <body>
 +
 +
        <div id="WebGL"> </div>
 +
        <div id="Stats-output"> </div>
 +
 +
        <script>
 +
            var renderer, camera, scene, stats, controls;
 +
 +
            function init(){
 +
            scene = new THREE.Scene(); //сцена
 +
            camera = new THREE.PerspectiveCamera(10, window.innerWidth / window.innerHeight, 0.1, 1000); //камера
 +
            renderer = new THREE.WebGLRenderer();
 +
            renderer.setClearColor(0xEEEEEE, 1.0); //цвет
 +
            renderer.setSize(window.innerWidth, window.innerHeight); //задаем размеры рендерера
 +
            renderer.shadowMap.enabled = true;
 +
 +
controls = new function() { //функция контроля параметров
 +
this.Weight1 = 20; //вес шара слева
 +
            this.Weight2 = 10; //вес шара справа
 +
            this.Alfa = 0.02;  //угол между нитями
 +
this.Radius1=1;    //радиус шара слева
 +
this.Coefficient=1.5; //коэффициент связи радиусов шаров
 +
this.Radius2=this.Radius1; //радиус шара справа
 +
this.Length1= "Length1 =";  //длина нити слева
 +
this.Length2= "Length2 =";  // длина нити справа
 +
this.Alfa= "Alfa =";  //угол между нитями
 +
this.Tetta = "Tetta ="; //угол между нитью и плоскостью
 +
            this.T1 = "T1 = ";  //сила нятажения нити слева
 +
this.T2 = "T2 = ";  //сила натяжения нити справа
 +
this.N1 = "N1 = ";  //сила давления левого шара на правый
 +
this.N2 = "N2 = ";  //сила давления правого шара на левый
 +
            }
 +
 +
            var gui = new dat.GUI() //функция управления ползунками (изменение параметров)
 +
gui.add(controls, 'Radius1', 1, 2, 0.05).onChange(RePict);
 +
            gui.add(controls, 'Coefficient', 0.125, 2, 0.25).onChange(RePict);
 +
            gui.add(controls, 'Weight1', 20, 70, 10).onChange(RePict);
 +
gui.add(controls, 'Weight2', 10, 30, 5).onChange(RePict);
 +
gui.add(controls, 'Length1').listen(); //следующие параметры не изменяются пользователем, а отображают необходимые значения параметров, которые известны или должны быть найдены
 +
            gui.add(controls, 'Length2').listen(); 
 +
gui.add(controls, 'Alfa').listen();
 +
gui.add(controls, 'Tetta').listen();
 +
gui.add(controls, 'T1').listen();
 +
            gui.add(controls, 'T2').listen();
 +
gui.add(controls, 'N1').listen();
 +
gui.add(controls, 'N2').listen();
 +
 +
            control = new THREE.OrbitControls(camera, renderer.domElement); //функция управления
 +
            stats = initStats();
 +
Pict();
 +
            renderScene();
 +
}
 +
 +
function RePict(){ //функция перерисовки конструкции при изменении параметров
 +
 +
        scene.remove(box);
 +
scene.remove(sphere1);
 +
scene.remove(sphere2);
 +
scene.remove(line1);
 +
scene.remove(line2);
 +
scene.remove(arrow1);
 +
scene.remove(arrow2);
 +
scene.remove(arrow3);
 +
scene.remove(arrow4);
 +
scene.remove(arrow5);
 +
scene.remove(arrow6);
 +
            Pict();
 +
renderScene();
 +
}
 +
 +
function Pict(){ //функция рисования
 +
 +
    //расчет данных, которые требуется найти в задачe и угла альфа, который используется при решении
 +
chisl = controls.Radius1*controls.Radius1 + controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+32-(controls.Radius1+controls.Coefficient*controls.Radius2)*(controls.Radius1+controls.Coefficient*controls.Radius2);
 +
znam = 2*Math.sqrt(controls.Radius1*controls.Radius1+16)*Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16);
 +
Alfa = Math.acos(chisl/znam);
 +
    Tetta = Math.atan(-(this.Weight2 + this.Weight1 * Math.cos(this.Alfa)) / (this.Weight1 * Math.sin(this.Alfa))); //угол тетта
 +
                T1 = this.Weight1 * (Math.sin(this.Tetta - 0.5 * this.Alfa) / Math.cos(0.5 * this.Alfa)); ///сила натяжения нити 1
 +
    T2 = this.Weight2 * (Math.sin(this.Tetta - 0.5 * this.Alfa) / Math.cos(0.5 * this.Alfa)); //сила натяжения нити 2
 +
    N1 = (this.Weight1 * Math.abs(Math.cos(this.Tetta))) / Math.cos(0.5 * this.Alfa); //сила действия левого шара на правый
 +
N2 = (this.Weight2 * Math.abs(Math.cos(this.Tetta))) / Math.cos(0.5 * this.Alfa); //сила действия правого шара на левый
 +
 +
var axes = new THREE.AxisHelper(4); //оси координат
 +
                scene.add(axes);
 +
axes.position.y=4;
 +
 +
box = new THREE.BoxGeometry(9, 0.5, 15); //создаем плоскость, к которой будет крепиться конструкция
 +
                boxM = new THREE.MeshBasicMaterial({
 +
                    opacity: 0.9,
 +
                    color: 0x9475736,
 +
                    transparent: true
 +
                });
 +
box = new THREE.Mesh(box, boxM);
 +
box.position.y=4;
 +
                scene.add(box);
 +
 +
var sphereG1 = new THREE.SphereGeometry(controls.Radius1, 50, 50); //создаем шар слева
 +
var mat_s2 = new THREE.MeshBasicMaterial({
 +
                    opacity: 0.5,
 +
                    color: 0x764367,
 +
                    transparent: true
 +
                });
 +
                sphere1 = new THREE.Mesh(sphereG1, mat_s2);
 +
                sphere1.castShadow = true;
 +
                scene.add(sphere1);
 +
                sphere1.position.z = controls.Radius1;
 +
 +
var sphereG = new THREE.SphereGeometry(controls.Coefficient*controls.Radius2, 100, 100); //создаем шар справа
 +
var mat_s1 = new THREE.MeshBasicMaterial({
 +
                    opacity: 0.7,
 +
                    color: 0x0656ff,
 +
                    transparent: true
 +
                });
 +
                sphere2 = new THREE.Mesh(sphereG, mat_s1);
 +
                sphere2.castShadow = true;
 +
                scene.add(sphere2);
 +
                sphere2.position.z = -controls.Coefficient*controls.Radius2;
 +
 +
var lineGeometry = new THREE.Geometry(); //Нить справа
 +
                lineGeometry.vertices.push(new THREE.Vector3(0, 0, 0)); //Указываем вектор первой точки
 +
                lineGeometry.vertices.push(new THREE.Vector3(0, -4, sphere1.position.z)); //Указываем вектор второй точки
 +
                var lineMaterial = new THREE.LineBasicMaterial({
 +
                    color: 0x00ffff,
 +
                    linewidth: 500
 +
                });
 +
                line1 = new THREE.Line(lineGeometry, lineMaterial); //Создаем линию из созданной геометрии
 +
line1.position.y=4;
 +
                scene.add(line1);
 +
 +
var lineGeometry = new THREE.Geometry(); //Нить слева
 +
                lineGeometry.vertices.push(new THREE.Vector3(0, 0, 0)); //Указываем вектор первой точки
 +
                lineGeometry.vertices.push(new THREE.Vector3(0, -4, sphere2.position.z)); //Указываем вектор второй точки
 +
                var lineMaterial1 = new THREE.LineBasicMaterial({
 +
                    color: 0xf4ff00,
 +
                    linewidth: 500
 +
                });
 +
                line2 = new THREE.Line(lineGeometry, lineMaterial1); //Создаем линию из созданной геометрии
 +
line2.position.y=4;
 +
                scene.add(line2);
 +
 +
//слева
 +
arrow1 = new THREE.ArrowHelper(new THREE.Vector3(0, -1, 0), new THREE.Vector3(0, 0, sphere1.position.z), controls.Weight1/20, 0x4500ff, 0.5, 0.5);
 +
scene.add(arrow1); //стрелка вниз, обозначает вес шара слева
 +
arrow2 = new THREE.ArrowHelper(new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 0, sphere1.position.z - controls.Radius1), controls.N1/5, 0xff0000, 0.5, 0.5);
 +
scene.add(arrow2); //стрелка вправо, обозначает силу давления левого шара на правый
 +
//справа
 +
arrow3 = new THREE.ArrowHelper(new THREE.Vector3(0, 0, 1), new THREE.Vector3(0, 0, sphere2.position.z + controls.Coefficient*controls.Radius2), controls.N2/5, 0x00ff00, 0.5, 0.5);
 +
scene.add(arrow3);//стрелка влево, обозначает силу давления правого шара на левый
 +
arrow4 = new THREE.ArrowHelper(new THREE.Vector3(0, -1, 0), new THREE.Vector3(0, 0, sphere2.position.z), controls.Weight2/10, 0x756238, 0.5, 0.5);
 +
scene.add(arrow4); //стрелка вниз, обозначает вес шара справа
 +
 +
arrow5 = new THREE.ArrowHelper(new THREE.Vector3 (0, 1, 0), new THREE.Vector3(0, 0, sphere1.position.z), controls.T1/20, 0x987823, 0.35, 0.35);
 +
arrow5.rotation.x= -Math.PI/2 + Math.acos(controls.Radius1/Math.sqrt(controls.Radius1*controls.Radius1+16))
 +
arrow5.position.y = controls.Radius1*Math.sin(Math.acos(controls.Radius1/Math.sqrt(controls.Radius1*controls.Radius1+16)))
 +
arrow5.position.z = sphere1.position.z - controls.Radius1*Math.cos(Math.acos(controls.Radius1/Math.sqrt(controls.Radius1*controls.Radius1+16)));
 +
scene.add(arrow5);
 +
 +
arrow6 = new THREE.ArrowHelper(new THREE.Vector3 (0, 1, 0), new THREE.Vector3(0, 0, sphere2.position.z), controls.T2/20, 0x573929, 0.35, 0.35);
 +
arrow6.rotation.x= Math.PI/2 - Math.acos((controls.Coefficient*controls.Radius2)/Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16))
 +
arrow6.position.y = controls.Coefficient*controls.Radius2*Math.sin(Math.acos((controls.Coefficient*controls.Radius2)/Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16)));
 +
arrow6.position.z = sphere2.position.z + controls.Coefficient*controls.Radius2*Math.cos(Math.acos((controls.Coefficient*controls.Radius2)/Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16)));
 +
scene.add(arrow6);
 +
 +
                camera.position.x = 90; //точка обзора камеры
 +
                camera.position.y = 20;
 +
                camera.position.z = 20;
 +
                camera.lookAt(scene.position); //направление камеры
 +
                document.getElementById("WebGL").appendChild(renderer.domElement);
 +
}     
 +
 +
            function renderScene() //анимация, при изменении параметров передает вычисленные значения на панель с соответствующими обозначениями
 +
            {
 +
    chisl = controls.Radius1*controls.Radius1 + controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+32-(controls.Radius1+controls.Coefficient*controls.Radius2)*(controls.Radius1+controls.Coefficient*controls.Radius2);
 +
znam = 2*Math.sqrt(controls.Radius1*controls.Radius1+16)*Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16);
 +
controls.Length1 = Math.sqrt(controls.Radius1*controls.Radius1+16); //длина нити слева
 +
controls.Length2 = Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16); //длина нити справа
 +
controls.Alfa = Math.acos(chisl/znam);
 +
    controls.Tetta = Math.atan((controls.Weight2 + controls.Weight1 * Math.cos(controls.Alfa)) / (controls.Weight1 * Math.sin(controls.Alfa))); //угол тетта
 +
                controls.T1 = controls.Weight1 * (Math.sin(controls.Tetta - 0.5 * controls.Alfa) / Math.cos(0.5 * controls.Alfa)); ///сила натяжения нити 1
 +
controls.T2 = controls.Weight2 * (Math.sin(controls.Tetta - 0.5 * controls.Alfa) / Math.cos(0.5 * controls.Alfa)); //сила натяжения нити 2
 +
controls.N1 = (controls.Weight1 * Math.abs(Math.cos(controls.Tetta))) / Math.cos(0.5 * controls.Alfa); //сила действия первого шара на второй
 +
controls.N2 = (controls.Weight2 * Math.abs(Math.cos(controls.Tetta))) / Math.cos(0.5 * controls.Alfa); //сила действия второго шара на первый
 +
    stats.update(); //обновление
 +
                requestAnimationFrame(renderScene); //вызов анимации
 +
                renderer.render(scene,camera);
 +
           
 +
}
 +
 +
            function initStats()
 +
            {
 +
                stats = new Stats();
 +
                renderer.shadowMap.enabled = true;
 +
                return stats;
 +
  }
 +
 +
            function onResize() //функция управления "камерой"
 +
            {
 +
                camera.aspect = window.innerWidth / window.innerHeight;
 +
                camera.updateProjectionMatrix();
 +
                renderer.setSize(window.innerWidth, window.innerHeight);
 +
            }
 +
 +
window.onload = init;
 +
            window.addEventListener('resize', onResize, false);
 +
        </script>
 +
</head>
 +
</body>

Текущая версия на 13:54, 7 июня 2017

Мещерский. Задача 4.57

Визуализация 3D-задачи по статике на JavaScript

Исполнитель: Тимошенко Валентина

Группа 23604/1 Кафедра Теоретической механики

Формулировка задачи[править]

Два гладких однородных шара С1 и С2, радиусы которых R1 и R2, а веса P1 и P2, подвешены на веревках AB и AD в точке A; AB = l1; AD = l2; l1 + R1= l2 + R2; угол BAD = α. Определить угол θ, образуемый веревкой AD с горизонтальной плоскостью AE, натяжения веревок T1, T2 и силу давления одного шара на другой.


Решение задачи[править]


<syntaxhighlight lang="javascript" line start="1" enclose="div">

<!DOCTYPE html>

<head> <script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/three.js"> </script> <script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/stats.min.js"> </script> <script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/OrbitControls.js" > </script> <script src = "http://tm.spbstu.ru/htmlets/Timoshenko/Mesherskyi/dat.gui.js"> </script>

   <style>
       body {
           margin: 0;
           overflow: hidden;
       }
   </style>
   <body>
       <script>
           var renderer, camera, scene, stats, controls;
           function init(){
           scene = new THREE.Scene(); //сцена
           camera = new THREE.PerspectiveCamera(10, window.innerWidth / window.innerHeight, 0.1, 1000); //камера
           renderer = new THREE.WebGLRenderer();
           renderer.setClearColor(0xEEEEEE, 1.0); //цвет
           renderer.setSize(window.innerWidth, window.innerHeight); //задаем размеры рендерера
           renderer.shadowMap.enabled = true;

controls = new function() { //функция контроля параметров this.Weight1 = 20; //вес шара слева

           this.Weight2 = 10; //вес шара справа 
           this.Alfa = 0.02;  //угол между нитями

this.Radius1=1; //радиус шара слева this.Coefficient=1.5; //коэффициент связи радиусов шаров this.Radius2=this.Radius1; //радиус шара справа this.Length1= "Length1 ="; //длина нити слева this.Length2= "Length2 ="; // длина нити справа this.Alfa= "Alfa ="; //угол между нитями this.Tetta = "Tetta ="; //угол между нитью и плоскостью

           this.T1 = "T1 = ";  //сила нятажения нити слева

this.T2 = "T2 = "; //сила натяжения нити справа this.N1 = "N1 = "; //сила давления левого шара на правый this.N2 = "N2 = "; //сила давления правого шара на левый

           }
           var gui = new dat.GUI() //функция управления ползунками (изменение параметров)

gui.add(controls, 'Radius1', 1, 2, 0.05).onChange(RePict);

           gui.add(controls, 'Coefficient', 0.125, 2, 0.25).onChange(RePict);		
           gui.add(controls, 'Weight1', 20, 70, 10).onChange(RePict);

gui.add(controls, 'Weight2', 10, 30, 5).onChange(RePict); gui.add(controls, 'Length1').listen(); //следующие параметры не изменяются пользователем, а отображают необходимые значения параметров, которые известны или должны быть найдены

           gui.add(controls, 'Length2').listen();  

gui.add(controls, 'Alfa').listen(); gui.add(controls, 'Tetta').listen(); gui.add(controls, 'T1').listen();

           gui.add(controls, 'T2').listen();

gui.add(controls, 'N1').listen(); gui.add(controls, 'N2').listen();

           control = new THREE.OrbitControls(camera, renderer.domElement); //функция управления 
           stats = initStats();

Pict();

           renderScene();

}

function RePict(){ //функция перерисовки конструкции при изменении параметров

scene.remove(box); scene.remove(sphere1); scene.remove(sphere2); scene.remove(line1); scene.remove(line2); scene.remove(arrow1); scene.remove(arrow2); scene.remove(arrow3); scene.remove(arrow4); scene.remove(arrow5); scene.remove(arrow6);

           Pict();		

renderScene(); }

function Pict(){ //функция рисования

//расчет данных, которые требуется найти в задачe и угла альфа, который используется при решении chisl = controls.Radius1*controls.Radius1 + controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+32-(controls.Radius1+controls.Coefficient*controls.Radius2)*(controls.Radius1+controls.Coefficient*controls.Radius2); znam = 2*Math.sqrt(controls.Radius1*controls.Radius1+16)*Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16); Alfa = Math.acos(chisl/znam); Tetta = Math.atan(-(this.Weight2 + this.Weight1 * Math.cos(this.Alfa)) / (this.Weight1 * Math.sin(this.Alfa))); //угол тетта

               T1 = this.Weight1 * (Math.sin(this.Tetta - 0.5 * this.Alfa) / Math.cos(0.5 * this.Alfa)); ///сила натяжения нити 1

T2 = this.Weight2 * (Math.sin(this.Tetta - 0.5 * this.Alfa) / Math.cos(0.5 * this.Alfa)); //сила натяжения нити 2 N1 = (this.Weight1 * Math.abs(Math.cos(this.Tetta))) / Math.cos(0.5 * this.Alfa); //сила действия левого шара на правый N2 = (this.Weight2 * Math.abs(Math.cos(this.Tetta))) / Math.cos(0.5 * this.Alfa); //сила действия правого шара на левый

var axes = new THREE.AxisHelper(4); //оси координат

               scene.add(axes);

axes.position.y=4;

box = new THREE.BoxGeometry(9, 0.5, 15); //создаем плоскость, к которой будет крепиться конструкция

               boxM = new THREE.MeshBasicMaterial({
                   opacity: 0.9,
                   color: 0x9475736,
                   transparent: true
               });				

box = new THREE.Mesh(box, boxM); box.position.y=4;

               scene.add(box);

var sphereG1 = new THREE.SphereGeometry(controls.Radius1, 50, 50); //создаем шар слева var mat_s2 = new THREE.MeshBasicMaterial({

                   opacity: 0.5,
                   color: 0x764367,
                   transparent: true
               });
               sphere1 = new THREE.Mesh(sphereG1, mat_s2);
               sphere1.castShadow = true;
               scene.add(sphere1);
               sphere1.position.z = controls.Radius1;

var sphereG = new THREE.SphereGeometry(controls.Coefficient*controls.Radius2, 100, 100); //создаем шар справа var mat_s1 = new THREE.MeshBasicMaterial({

                   opacity: 0.7,
                   color: 0x0656ff,
                   transparent: true
               });
               sphere2 = new THREE.Mesh(sphereG, mat_s1);
               sphere2.castShadow = true;
               scene.add(sphere2);
               sphere2.position.z = -controls.Coefficient*controls.Radius2;

var lineGeometry = new THREE.Geometry(); //Нить справа

               lineGeometry.vertices.push(new THREE.Vector3(0, 0, 0)); //Указываем вектор первой точки
               lineGeometry.vertices.push(new THREE.Vector3(0, -4, sphere1.position.z)); //Указываем вектор второй точки
               var lineMaterial = new THREE.LineBasicMaterial({
                   color: 0x00ffff,
                   linewidth: 500
               });
               line1 = new THREE.Line(lineGeometry, lineMaterial); //Создаем линию из созданной геометрии

line1.position.y=4;

               scene.add(line1);

var lineGeometry = new THREE.Geometry(); //Нить слева

               lineGeometry.vertices.push(new THREE.Vector3(0, 0, 0)); //Указываем вектор первой точки
               lineGeometry.vertices.push(new THREE.Vector3(0, -4, sphere2.position.z)); //Указываем вектор второй точки
               var lineMaterial1 = new THREE.LineBasicMaterial({
                   color: 0xf4ff00,
                   linewidth: 500
               });
               line2 = new THREE.Line(lineGeometry, lineMaterial1); //Создаем линию из созданной геометрии

line2.position.y=4;

               scene.add(line2);

//слева arrow1 = new THREE.ArrowHelper(new THREE.Vector3(0, -1, 0), new THREE.Vector3(0, 0, sphere1.position.z), controls.Weight1/20, 0x4500ff, 0.5, 0.5); scene.add(arrow1); //стрелка вниз, обозначает вес шара слева arrow2 = new THREE.ArrowHelper(new THREE.Vector3(0, 0, -1), new THREE.Vector3(0, 0, sphere1.position.z - controls.Radius1), controls.N1/5, 0xff0000, 0.5, 0.5); scene.add(arrow2); //стрелка вправо, обозначает силу давления левого шара на правый //справа arrow3 = new THREE.ArrowHelper(new THREE.Vector3(0, 0, 1), new THREE.Vector3(0, 0, sphere2.position.z + controls.Coefficient*controls.Radius2), controls.N2/5, 0x00ff00, 0.5, 0.5); scene.add(arrow3);//стрелка влево, обозначает силу давления правого шара на левый arrow4 = new THREE.ArrowHelper(new THREE.Vector3(0, -1, 0), new THREE.Vector3(0, 0, sphere2.position.z), controls.Weight2/10, 0x756238, 0.5, 0.5); scene.add(arrow4); //стрелка вниз, обозначает вес шара справа

arrow5 = new THREE.ArrowHelper(new THREE.Vector3 (0, 1, 0), new THREE.Vector3(0, 0, sphere1.position.z), controls.T1/20, 0x987823, 0.35, 0.35); arrow5.rotation.x= -Math.PI/2 + Math.acos(controls.Radius1/Math.sqrt(controls.Radius1*controls.Radius1+16)) arrow5.position.y = controls.Radius1*Math.sin(Math.acos(controls.Radius1/Math.sqrt(controls.Radius1*controls.Radius1+16))) arrow5.position.z = sphere1.position.z - controls.Radius1*Math.cos(Math.acos(controls.Radius1/Math.sqrt(controls.Radius1*controls.Radius1+16))); scene.add(arrow5);

arrow6 = new THREE.ArrowHelper(new THREE.Vector3 (0, 1, 0), new THREE.Vector3(0, 0, sphere2.position.z), controls.T2/20, 0x573929, 0.35, 0.35); arrow6.rotation.x= Math.PI/2 - Math.acos((controls.Coefficient*controls.Radius2)/Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16)) arrow6.position.y = controls.Coefficient*controls.Radius2*Math.sin(Math.acos((controls.Coefficient*controls.Radius2)/Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16))); arrow6.position.z = sphere2.position.z + controls.Coefficient*controls.Radius2*Math.cos(Math.acos((controls.Coefficient*controls.Radius2)/Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16))); scene.add(arrow6);

               camera.position.x = 90; //точка обзора камеры
               camera.position.y = 20;
               camera.position.z = 20;
               camera.lookAt(scene.position); //направление камеры
               document.getElementById("WebGL").appendChild(renderer.domElement);

}

           function renderScene() //анимация, при изменении параметров передает вычисленные значения на панель с соответствующими обозначениями
           {

chisl = controls.Radius1*controls.Radius1 + controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+32-(controls.Radius1+controls.Coefficient*controls.Radius2)*(controls.Radius1+controls.Coefficient*controls.Radius2); znam = 2*Math.sqrt(controls.Radius1*controls.Radius1+16)*Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16); controls.Length1 = Math.sqrt(controls.Radius1*controls.Radius1+16); //длина нити слева controls.Length2 = Math.sqrt(controls.Coefficient*controls.Radius2*controls.Coefficient*controls.Radius2+16); //длина нити справа controls.Alfa = Math.acos(chisl/znam); controls.Tetta = Math.atan((controls.Weight2 + controls.Weight1 * Math.cos(controls.Alfa)) / (controls.Weight1 * Math.sin(controls.Alfa))); //угол тетта

               controls.T1 = controls.Weight1 * (Math.sin(controls.Tetta - 0.5 * controls.Alfa) / Math.cos(0.5 * controls.Alfa)); ///сила натяжения нити 1

controls.T2 = controls.Weight2 * (Math.sin(controls.Tetta - 0.5 * controls.Alfa) / Math.cos(0.5 * controls.Alfa)); //сила натяжения нити 2 controls.N1 = (controls.Weight1 * Math.abs(Math.cos(controls.Tetta))) / Math.cos(0.5 * controls.Alfa); //сила действия первого шара на второй controls.N2 = (controls.Weight2 * Math.abs(Math.cos(controls.Tetta))) / Math.cos(0.5 * controls.Alfa); //сила действия второго шара на первый stats.update(); //обновление

               requestAnimationFrame(renderScene); //вызов анимации
               renderer.render(scene,camera);
           

}

           function initStats() 
           {
               stats = new Stats();
               renderer.shadowMap.enabled = true;
               return stats;

}

           function onResize() //функция управления "камерой"
           {
               camera.aspect = window.innerWidth / window.innerHeight;
               camera.updateProjectionMatrix();
               renderer.setSize(window.innerWidth, window.innerHeight);
           }

window.onload = init;

           window.addEventListener('resize', onResize, false);
       </script>

</head>

</body>