Редактирование: Мещерский Задача 6.21

Перейти к: навигация, поиск

Внимание! Вы не авторизовались на сайте. Ваш IP-адрес будет публично видимым, если вы будете вносить любые правки. Если вы войдёте или создадите учётную запись, правки вместо этого будут связаны с вашим именем пользователя, а также у вас появятся другие преимущества.

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 14: Строка 14:
  
 
==Решение задачи==
 
==Решение задачи==
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Ivanova/Threads/Novy.html |width=1000 |height=830 |border=0 }}
+
{{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Ivanova/Threads/change.html |width=1000 |height=830 |border=0 }}
  
  
Строка 21: Строка 21:
  
 
<!DOCTYPE html>
 
<!DOCTYPE html>
<html>
 
 
<head>
 
<head>
 +
<meta charset = "utf-8">
 +
<title> Задача из Мещерского </title>
 
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/three.js">
 
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/three.js">
 
</script>
 
</script>
 
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/stats.min.js">
 
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/stats.min.js">
 
</script>
 
</script>
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/OrbitControls.js" >
+
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/OrbitControls.js">
 
</script>
 
</script>
 
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/dat.gui.js">
 
<script src = "http://tm.spbstu.ru/htmlets/Ivanova/Threads/dat.gui.js">
 
</script>
 
</script>
<meta charset = "utf-8">
 
 
<style>
 
<style>
        body
+
  body  
        {
+
  {
        margin:0;
+
  margin:0;
        overflow:hidden;
+
  overflow:hidden;
        }
+
  }
 
</style>
 
</style>
 
 
</head>
 
</head>
 
<body>
 
<body>
+
 
 
<div id = "WebGL"> </div>
 
<div id = "WebGL"> </div>
 
<div id = "Stats-output"> </div>
 
<div id = "Stats-output"> </div>
+
 
 
<script>
 
<script>
 
var arrowHelper1,arrowHelper2,arrowHelper3,arrowHelper4,arrowHelper5,arrowHelper6,arrowHelper7,arrowHelper8;
 
var renderer,scene,camera,spotLight,stats,controls, control,line1,line2,line3, qq, vvTa, vvTb, vvTc, Q1, d1, L1;
 
  
var d;
+
var renderer,scene,camera,plane,stats,A,B,Y,controls,line1,line2,line3;
 +
 
 +
/////    ЗАДАНИЕ ПАРАМЕТРОВ, УКАЗАННЫХ В ЗАДАЧЕ    /////
 +
 
 +
var l;
 
var L;
 
var L;
 
var Q;
 
var Q;
scene = new THREE.Scene();
+
 
camera = new THREE.PerspectiveCamera(60,window.innerWidth/window.innerHeight,0.1,1000);
+
function init()
 +
{
 +
scene = new THREE.Scene();   // создаем сцену
 +
camera = new THREE.PerspectiveCamera(45,window.innerWidth/window.innerHeight,0.1,1000);   // создаем камеру
 
renderer = new THREE.WebGLRenderer();
 
renderer = new THREE.WebGLRenderer();
+
 
         renderer.setClearColor(0xEEEEEE, 1.0);
+
         renderer.setClearColor(0xEEEEEE, 1);
 
         renderer.setSize(window.innerWidth, window.innerHeight);
 
         renderer.setSize(window.innerWidth, window.innerHeight);
         renderer.shadowMapEnabled = true;
+
         renderer.shadowMap.enabled = true;
+
   
function init()
+
 
 +
var axes = new THREE.AxisHelper(20);    // создаем координатные оси
 +
scene.add(axes);
 +
 
 +
control = new THREE.OrbitControls(camera,renderer.domElement);
 +
 
 +
controls = new function()     // создаем переключатели, позволяющие изменять входные параметры
 
{
 
{
var axes = new THREE.AxisHelper(40);
+
//this.weightQ = 3;    // вес, приложенный в узле 
scene.add(axes);
+
//this.lengthl = 10;   // расстояние между точкой закрепления нити и началом координат
+
//this.lengthL = 9;   // длина нити
camera.position.x = 40;
+
 
camera.position.y = 40;
+
this.displayForces = true;    // модуль отображения задачи
camera.position.z = 40;
+
this.angleA = "angle A = ";    // вывод полученных в ходе решения задачи значений
+
this.angleB = "angle B = ";  
camera.lookAt(scene.position);
+
this.angleY = "angle C = ";
document.getElementById("WebGL").appendChild(renderer.domElement);
+
this.Ta = "Ta = ";
+
this.Tb = "Tb = ";
var spotLight = new THREE.SpotLight( 0xffffff );
+
this.Tc = "Tc = ";
spotLight.position.set( -40, 60, -10 );
+
}
spotLight.castShadow = true;
+
var gui = new dat.GUI();   // позволяем менять каждый из параметров в определенном диапазоне, в случае изменения вызываем функцию, перестраивающую выводимую на экран картинку
scene.add( spotLight );
+
gui.add(controls, 'weightQ',0,100).onChange(ReDraw);
+
gui.add(controls, 'lengthl',0,10).onChange(ReDraw);
controls1 = new function()
+
gui.add(controls, 'lengthL',0.816*l, l).onChange(ReDraw);
{
+
gui.add(controls, 'angleA').listen();
this.weightQ = 20;    // вес, приложенный в узле 
+
gui.add(controls, 'angleB').listen();
this.lengthd = 25;   // расстояние между точкой закрепления нити и началом координат
+
gui.add(controls, 'angleC').listen();
this.lengthL = 15;   // длина нити
+
gui.add(controls, 'Ta').listen();
this.Vectors = true;
+
gui.add(controls, 'Tb').listen();
 +
gui.add(controls, 'Tc').listen();
  
this.angleA = '' + 0;   // вывод полученных в ходе решения задачи значений
+
stats = initStats();
this.angleB =  '' + 0;
+
Draw();
this.angleC =  '' + 0;
+
renderScene();
this.Ta =  '' + 0;
 
this.Tb =  '' + 0;
 
this.Tc =  '' + 0;
 
 
}
 
}
 
stats = initStats();
 
controls = new THREE.OrbitControls(camera,renderer.domElement);
 
renderScene();
 
 
var gui = new dat.GUI();
 
var contr = gui.addFolder('Controls');
 
 
contr.add(controls1, 'weightQ',0,100);
 
contr.add(controls1, 'lengthd',0,40);
 
contr.add(controls1, 'lengthL',0.816, 40);
 
contr.add(controls1, 'Vectors').onChange(Change);
 
  
 +
function VisionTrue()    // функция, рисующая задачу с отображением сил
 +
{
 +
ReDraw();
 +
}
  
var res = gui.addFolder('Result');
+
function ReDraw()   // функция, перерисовывающая всю картинку
res.add(controls, 'angleA').listen();
+
{
res.add(controls, 'angleB').listen();
+
scene.remove(axes); // удаляем ранее созданные объекты
res.add(controls, 'angleC').listen();
+
scene.remove(line1);
res.add(controls, 'Ta').listen();
+
scene.remove(line2);
res.add(controls, 'Tb').listen();
+
scene.remove(line3);
res.add(controls, 'Tc').listen();
+
scene.remove(Ta);
 +
scene.remove(Tb);
 +
scene.remove(Tc);
  
 +
Q1 = controls.weightQ;    // меняем значения параметров на те, что ввел пользователь
 +
l1 = controls.lengthl;
 +
L1 = controls.lengthL;
 +
Draw();
 
}
 
}
+
 
function renderScene()
+
function Draw()
 
{
 
{
stats.update();
+
A = Math.asin((l1 - Math.sqrt(3*l1*l1 - 2*l1*l1))/(3*l1));
requestAnimationFrame(renderScene);
+
B = Math.atan((l1 - Math.sqrt(3*l1*l1 - 2*l1*l1))/(2*l1 + Math.sqrt(3*l1*l1 - 2*l1*l1) ));
 +
C = Math.acos((2*l1 + Math.sqrt(3*l1*l1 - 2*l1*l1))/(3*l1));
 +
controls.angle = "angleA = " + A;
 +
controls.angle = "angleB = " + B;
 +
controls.angle = "angleC = " + C;
 +
 
  
Q1 = controls1.weightQ;
+
/////    СОЗДАНИЕ НИТЕЙ    /////
d1 = controls1.lengthd;
 
L1 = controls1.lengthL;
 
  
controls.Ta = '' + (d1 - Math.sqrt(3*L1*L1 - 2*d1*d1)) * L1 * Q1 / (3*d1*(Math.sqrt(3*L1*L1 - 2*d1*d1)));    // вывод решения на экран
+
var ty = (1/3)*(l1 - ((3*L1)^2 - (2*l1)^2)^(1/2));
controls.Tb = '' + (d1 - Math.sqrt(3*L1*L1 - 2*d1*d1)) * L1 * Q1 / (3*d1*(Math.sqrt(3*L1*L1 - 2*d1*d1)));  
+
var lg1 = new THREE.Geometry();    // создаем новую геометрию, предназначенную для изображения линии
controls.Tc = '' + (d1 - Math.sqrt(3*L1*L1 - 2*d1*d1))*L1*Q1/(3*d1*(Math.sqrt(3*L1*L1 - 2*d1*d1)));  
+
lg1.vertices.push(
 +
  new THREE.Vector3(l1,0,0),    // задаем координату начала
 +
  new THREE.Vector3(ty, ty, ty)     // задаем координату конца
 +
);
 +
var lm1 = new THREE.LineBasicMaterial({color: 0xA0522D});   // задаем материал
 +
line1 = new THREE.Line(lg1, lm1);    // задаем линию с указанными координатами и материалом
 +
scene.add(line1);
  
Tlength =   controls.Ta
+
var lg2 = new THREE.Geometry();    // создаем новую геометрию, предназначенную для изображения линии
TClength =  controls.Tc
+
lg2.vertices.push(
+
  new THREE.Vector3(0, l1, 0),    // задаем координату начала
controls.angleA = '' + Math.asin((d1 - Math.sqrt(3*d1*d1 - 2*d1*d1))/(3*d1));
+
  new THREE.Vector3(ty, ty, ty)     // задаем координату конца
controls.angleB = '' + Math.atan((d1 - Math.sqrt(3*d1*d1 - 2*d1*d1))/(2*d1 + Math.sqrt(3*d1*d1 - 2*d1*d1) ));
+
);
controls.angleC = '' + Math.acos((2 * d1 + Math.sqrt(3*d1*d1 - 2*d1*d1))/(3*d1));  
+
var lm2 = new THREE.LineBasicMaterial({color: 0xA0522D});    // задаем материал
 +
line2 = new THREE.Line(lg2, lm2);   // задаем линию с указанными координатами и материалом
 +
scene.add(line2);
  
Change();
+
var lg3 = new THREE.Geometry();   // создаем новую геометрию, предназначенную для изображения линии
renderer.render(scene,camera);
+
lg3.vertices.push(
}
+
  new THREE.Vector3(0, 0, l1),    // задаем координату начала
+
  new THREE.Vector3(ty, ty, ty)     // задаем координату конца
function Change()
+
);
{
+
var lm3 = new THREE.LineBasicMaterial({color: 0xA0522D});   // задаем материал
if (controls1.Vectors == true)  Draw();
+
line3 = new THREE.Line(lg3, lm3);   // задаем линию с указанными координатами и материалом
else Draw1();
+
scene.add(line3);
}
+
 
+
/////    СОЗДАНИЕ ВЕКТОРОВ, ОТОБРАЖАЮЩИХ СИЛЫ, ДЕЙСТВУЮЩИЕ НА ТЕЛА    /////
function ClearScene()
+
 
{ // удаляем ранее созданные объекты
+
var Tlength = (l1 - Math.sqrt(3*L1*L1 - 2*l1*l1))*L1*Q1/(3*l1*(Math.sqrt(3*L1*L1 - 2*l1*l1)));
scene.remove(line1);
+
var TClength = (l1 - Math.sqrt(3*L1*L1 - 2*l1*l1))*L1*Q1/(3*l1*(Math.sqrt(3*L1*L1 - 2*l1*l1)));
scene.remove(line2);
 
scene.remove(line3);
 
scene.remove(qq);
 
scene.remove(vvTa);
 
scene.remove(vvTc);
 
scene.remove(vvTb);
 
}
 
 
function ReDrawN()// рисуем нити
 
{
 
var ty = (1/3)*(d1 - ((3*L1)^2 - (2*d1)^2)^(1/2));
 
  
var lineGeometry = new THREE.Geometry();//Производная фигура
 
lineGeometry.vertices.push(new THREE.Vector3( d1,0, 0));//Указываем вектор первой точки
 
lineGeometry.vertices.push(new THREE.Vector3( ty,ty, ty));//Указываем вектор второй точки
 
var lineMaterial = new THREE.LineBasicMaterial({color:0x00FF00, linewidth:500});
 
line1 = new THREE.Line(lineGeometry, lineMaterial);//Создаем линию из созданной геометрии
 
scene.add(line1);//Добавляем объект на сцену
 
  
 +
var vQ = new THREE.Vector3 (0, 0, -1);    // создаем геометрию вектора, отображающего вес, приложенный к пересечению нитей
 +
var origin = new THREE.Vector3(ty,ty,ty);    // задаем точку начала для векторов Q и Tc
 +
var hex = 0xDC143C;    // задаем цвет для веса
 +
qq = new THREE.ArrowHelper( vQ, origin, Q1, hex );    // создаем срелочку
 +
scene.add( qq );    // заносим на сцену
  
var lineGeometry = new THREE.Geometry();//Производная фигур
 
lineGeometry.vertices.push(new THREE.Vector3( 0, d1,0));//Указываем вектор первой точки
 
lineGeometry.vertices.push(new THREE.Vector3( ty,ty, ty));//Указываем вектор второй точки
 
var lineMaterial = new THREE.LineBasicMaterial({color:0x00FF00, linewidth:500});
 
line2 = new THREE.Line(lineGeometry, lineMaterial);//Создаем линию из созданной геометрии
 
scene.add(line2);//Добавляем объект на сцену
 
  
var lineGeometry = new THREE.Geometry();//Производная фигура
+
var vTa = new THREE.Vector3(ty, ty, ty);   // создаем геометрию вектора, отображающего натяжение нити А
lineGeometry.vertices.push(new THREE.Vector3( 0,0, d1));//Указываем вектор первой точки
+
var originA =  new THREE.Vector3(l1,0,0);
lineGeometry.vertices.push(new THREE.Vector3( ty,ty, ty));//Указываем вектор второй точки
+
var hex1 = 0x8B0000;  // цвет, отображающий вектора сил натяжения
var lineMaterial = new THREE.LineBasicMaterial({color:0x00FF00, linewidth:500});
+
vvTa = new THREE.ArrowHelper( vTa, origin, Tlength , hex1);   // создаем стрелочку
line3 = new THREE.Line(lineGeometry, lineMaterial);//Создаем линию из созданной геометрии
+
scene.add( vvTa );   // заносим на сцену
scene.add(line3);//Добавляем объект на сцену
 
}
 
 
function ReDrawV()//вектора
 
{
 
var ty = (1/3)*(d1 - ((3*L1)^2 - (2*d1)^2)^(1/2));
 
  
var vQ = new THREE.Vector3 (0, -1, 0);    // создаем геометрию вектора, отображающего вес, приложенный к пересечению нитей
 
var origin = new THREE.Vector3(ty,ty,ty);    // задаем точку начала для векторов Q и Tc
 
qq = new THREE.ArrowHelper( vQ, origin, Q1, 0xDC143C );    // создаем срелочку
 
scene.add( qq );    // заносим на сцену
 
  
 +
var vTb = new THREE.Vector3( ty, ty, ty);    // создаем геометрию вектора, отображающего натяжение нити В
 +
var originB =  new THREE.Vector3(0,l1,0);
 +
var hex1 = 0x8B0000;  // цвет, отображающий вектора сил натяжения
 +
vvTb = new THREE.ArrowHelper( vTb, originB, Tlength, hex1);    // создаем стрелочку
 +
scene.add( vvTb );    // заносим на сцену
  
var vTa = new THREE.Vector3(ty, ty, ty);    // создаем геометрию вектора, отображающего натяжение нити А
 
var originA =  new THREE.Vector3(d1,0,0);
 
vvTa = new THREE.ArrowHelper( vTa, origin, this.Tlength , 0x8B0000);    // создаем стрелочку
 
scene.add( vvTa );    // заносим на сцену
 
  
 +
var vTc = new THREE.Vector3(-1, -1, 1 );    // создаем геометрию вектора, отображающего натяжение нити C
 +
var origin = new THREE.Vector3(ty,ty,ty);
 +
var hex1 = 0x8B0000;  // цвет, отображающий вектора сил натяжения
 +
vvTc = new THREE.ArrowHelper( vTc, origin, TClength, hex1);    // создаем стрелочку
 +
scene.add(vvTc );    // заносим на сцену
  
var vTb = new THREE.Vector3( ty, ty, ty);    // создаем геометрию вектора, отображающего натяжение нити В
+
controls.Ta = "Ta = " + Tlength;    // вывод решения на экран
var originB = new THREE.Vector3(0,d1,0);
+
controls.Tb = "Tb = " + Tlength;    // вывод решения на экран
vvTb = new THREE.ArrowHelper( vTb, originB, this.Tlength, 0x8B0000);    // создаем стрелочку
+
controls.Tc = "Tc = " + TClength;    // вывод решения на экран
scene.add( vvTb );    // заносим на сцену
 
  
 +
camera.position.x = -30;    // задаем местоположение камеры
 +
camera.position.y = 40;
 +
camera.position.z = 30;
 +
camera.lookAt(scene.position);
 +
document.getElementById("WebGL").appendChild(renderer.domElement);
  
var vTc = new THREE.Vector3(-1, -1, 1 );    // создаем геометрию вектора, отображающего натяжение нити C
+
renderer.render(scene,camera);
var origin = new THREE.Vector3(ty,ty,ty);
 
vvTc = new THREE.ArrowHelper( vTc, origin, this.TClength, 0x8B0000);    // создаем стрелочку
 
scene.add(vvTc );   // заносим на сцену
 
 
}
 
}
+
 
function Draw1()
+
function renderScene()
 
{
 
{
ClearScene();
+
stats.update();
ReDrawN();
+
Q1 = controls.weightQ;
}
+
l1 = controls.length1;
+
L1 = controls.lengthL;
function Draw()
+
requestAnimationFrame(renderScene);
{
+
renderer.render(scene,camera);
ClearScene();
 
ReDrawV();
 
ReDrawN();
 
 
}
 
}
  
+
 
 
function initStats() //window in the left corner
 
function initStats() //window in the left corner
 
{
 
{
stats  = new Stats();
+
stats  = new Stats();
stats.setMode(0);
+
stats.setMode(0);
stats.domElement.style.position = '0px';
+
stats.domElement.style.position = '0px';
stats.domElement.style.left = '0px';
+
stats.domElement.style.left = '0px';
stats.domElement.style.top = '0px';
+
stats.domElement.style.top = '0px';
document.getElementById("Stats-output").appendChild(stats.domElement);
+
document.getElementById("Stats-output").appendChild(stats.domElement);
return stats;
+
return stats;
 
}
 
}
+
 
 
function onResize()  //moving of camera
 
function onResize()  //moving of camera
 
{
 
{
    camera.aspect = window.innerWidth/window.innerHeight;
+
  camera.aspect = window.innerWidth/window.innerHeight;
    camera.updateProjectionMatrix();
+
  camera.updateProjectionMatrix();
    renderer.setSize(window.innerWidth,window.innerHeight);
+
  renderer.setSize(window.innerWidth,window.innerHeight);
 
}
 
}
+
 
 
window.onload = init;
 
window.onload = init;
+
window.addEventListener('resize',onResize,true);
 
</script>
 
</script>
 
</body>
 
</html>
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)