Текущая версия |
Ваш текст |
Строка 1: |
Строка 1: |
| ==Задача== | | ==Задача== |
| С помощью языка программирования JavaScript смоделировать колебания груза на пружине. | | С помощью языка программирования JavaScript смоделировать колебания груза на пружине. |
− | [[File:Mayatnik0.png|thumb|Схема маятника.]] | + | [[File:Mayatnik.png|thumb|Схема маятника.]] |
| ==Описание== | | ==Описание== |
| Моделирование пружинного маятника с изменяемыми входными данными. | | Моделирование пружинного маятника с изменяемыми входными данными. |
| | | |
| Работу выполнили: [[Оленчук_Павел|Оленчук Павел]] и [[Морозов_Даниил|Морозов Даниил]] | | Работу выполнили: [[Оленчук_Павел|Оленчук Павел]] и [[Морозов_Даниил|Морозов Даниил]] |
− |
| |
− | [[File:Курсовой проект..docx|thumb|Курсовой проект]]
| |
− |
| |
| ==Визуализация== | | ==Визуализация== |
− | {{#widget:Iframe |url=http://tm.spbstu.ru/htmlets/Olenchuk_Morozov/1.html |width=1100|height=800|border=0 }}
| |
− | ==Код программы==
| |
− | '''Текст программы на языке JavaScript:'''
| |
− | <div class="mw-collapsible mw-collapsed">
| |
− | <syntaxhighlight lang="javascript" line start="1" enclose="div">
| |
− | function main() {
| |
− |
| |
− | var ctx = canv.getContext("2d");
| |
− |
| |
− | var ctxE = ENERGY.getContext("2d");
| |
− |
| |
− | var ctxVX = vxg.getContext("2d");
| |
− |
| |
− | var w = canv.width;
| |
− |
| |
− | var h = canv.height;
| |
− |
| |
− | var button=document.getElementById("button");
| |
− |
| |
− | var paint=document.getElementById("button2");
| |
− |
| |
− | var stopbutton=document.getElementById("button3");
| |
− |
| |
− | var a=0;
| |
− |
| |
− | var m=0;
| |
− |
| |
− | var k=0;
| |
− |
| |
− | var s=0;
| |
− |
| |
− | var l=0;
| |
− |
| |
− | var j=0;
| |
− |
| |
− | var b=0;
| |
− |
| |
− | var i=0;
| |
− |
| |
− | var x=0;
| |
− |
| |
− | var y=0;
| |
− |
| |
− | var x1=0;
| |
− |
| |
− | var y1=0;
| |
− |
| |
− | var v=0;
| |
− |
| |
− | var x2=0;
| |
− |
| |
− | var y2=0;
| |
− |
| |
− | //var abs=0;
| |
− |
| |
− | var timerId=0;
| |
− |
| |
− | var Ek=0;
| |
− |
| |
− | var Ep=0;
| |
− |
| |
− | var E=0;
| |
− |
| |
− | var bl=1;
| |
− |
| |
− | var x0=0;
| |
− |
| |
− | var Vm=0;
| |
− |
| |
− | paint.onclick=function(){
| |
− |
| |
− | bl=1;
| |
− |
| |
− | paint.value="Refresh";
| |
− |
| |
− | button.value="Start";
| |
− |
| |
− | ctxE.clearRect(0,0,500,500);
| |
− |
| |
− | ctxVX.clearRect(0,0,500,500);
| |
− |
| |
− | ctxE.beginPath();
| |
− |
| |
− | ctxE.moveTo(20,20);
| |
− |
| |
− | ctxE.lineTo(20,230);
| |
− |
| |
− | ctxE.lineTo(480,230);
| |
− |
| |
− | ctxE.lineTo(475,225);
| |
− |
| |
− | ctxE.moveTo(480,230);
| |
− |
| |
− | ctxE.lineTo(475,235);
| |
− |
| |
− | ctxE.moveTo(20,20);
| |
− |
| |
− | ctxE.lineTo(25,25);
| |
− |
| |
− | ctxE.moveTo(20,20);
| |
− |
| |
− | ctxE.lineTo(15,25);
| |
− |
| |
− | ctxE.stroke();
| |
− |
| |
− | ctxE.fillText("Energy",30,25);
| |
− |
| |
− | ctxE.fillText("Time",470,245);
| |
− |
| |
− | ctxVX.beginPath();
| |
− |
| |
− | ctxVX.moveTo(250,20);
| |
− |
| |
− | ctxVX.lineTo(250,230);
| |
− |
| |
− | ctxVX.moveTo(20,125);
| |
− |
| |
− | ctxVX.lineTo(480,125);
| |
− |
| |
− | ctxVX.lineTo(475,120);
| |
− |
| |
− | ctxVX.moveTo(480,125);
| |
− |
| |
− | ctxVX.lineTo(475,130);
| |
− |
| |
− | ctxVX.moveTo(250,20);
| |
− |
| |
− | ctxVX.lineTo(255,25);
| |
− |
| |
− | ctxVX.moveTo(250,20);
| |
− |
| |
− | ctxVX.lineTo(245,25);
| |
− |
| |
− | ctxVX.stroke();
| |
− |
| |
− | ctxVX.fillText("V",255,25);
| |
− |
| |
− | ctxVX.fillText("x",470,140);
| |
− |
| |
− | if (x!=0) {clearInterval(timerId);}
| |
− |
| |
− | i=0;
| |
− |
| |
− | x=0;
| |
− |
| |
− | y=0;
| |
− |
| |
− | console.clear();
| |
− |
| |
− | ctx.clearRect(0,0,w,h);
| |
− |
| |
− | document.getElementById("velocity").value=0;
| |
− |
| |
− | document.getElementById("absolute").value=0;
| |
− |
| |
− | b=parseFloat(document.getElementById("res").value);
| |
− |
| |
− | l=parseFloat(document.getElementById("lng").value);
| |
− |
| |
− | s=parseFloat(document.getElementById("brt").value);
| |
− |
| |
− | m=parseFloat(document.getElementById("mass").value);
| |
− |
| |
− | k=parseFloat(document.getElementById("kfc").value);
| |
− |
| |
− | a=parseFloat(document.getElementById("amp").value);
| |
− |
| |
− | if (s>l) {alert("ERROR!!! Spring coord>rod's length!!!");}
| |
− |
| |
− | else{
| |
− |
| |
− | if (a>95) {alert("ERROR!!! Amplitude is too big(>95)!!!");}
| |
− |
| |
− | else{
| |
− |
| |
− | ctx.beginPath();
| |
− |
| |
− | ctx.arc(25+l,125,10,0,2*Math.PI);
| |
− |
| |
− | ctx.fill();
| |
− |
| |
− | ctx.moveTo(20,20);
| |
− |
| |
− | ctx.lineTo(980,20);
| |
− |
| |
− | ctx.moveTo(20,20);
| |
− |
| |
− | ctx.lineTo(20,230);
| |
− |
| |
− | ctx.moveTo(20,120);
| |
− |
| |
− | ctx.lineTo(25,125);
| |
− |
| |
− | ctx.lineTo(20,130);
| |
− |
| |
− | ctx.moveTo(25,125);
| |
− |
| |
− | ctx.lineTo(25+l,125);
| |
− |
| |
− | ctx.moveTo(25+s,20);
| |
− |
| |
− | ctx.lineTo(25+s,22,5);
| |
− |
| |
− | while (j<20){
| |
− |
| |
− | j=j+1;
| |
− |
| |
− | ctx.lineTo(25+Math.pow(-1,j)*5+s,20+5*j);
| |
− |
| |
− | }
| |
− |
| |
− | j=0;
| |
− |
| |
− | ctx.lineTo(25+s,122,5);
| |
− |
| |
− | ctx.lineTo(25+s,125);
| |
− |
| |
− | ctx.stroke();
| |
− |
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− |
| |
− |
| |
− | function start () {
| |
− |
| |
− | ctx.clearRect(0,0,1000,250);
| |
− |
| |
− | var w=Math.sqrt(3*k*s*s/(m*l*l));
| |
− |
| |
− | var beta=3*b/(2*m*l);
| |
− |
| |
− | var A=a*Math.exp(-i*beta);
| |
− |
| |
− | var x0=m*9.8*l/(k*s);
| |
− |
| |
− | x=Math.exp(-beta*i)*a*Math.sin(i*w);
| |
− |
| |
− | y=l*(1-Math.cos(Math.asin(x/l)));
| |
− |
| |
− | x1=a*Math.exp(-i*beta)*(-beta*Math.sin(w*i)+w*Math.cos(w*i));
| |
− |
| |
− | y1=x*x1/(l*Math.sqrt(l*l-x*x));
| |
− |
| |
− | v=Math.sqrt(x1*x1+y1*y1);
| |
− |
| |
− | x2=a*Math.exp(-i*beta)*((beta*beta-w*w)*Math.sin(w*i)-2*beta*w*Math.cos(w*i));
| |
− |
| |
− | y2=(x1*x1+x*x2+x*x1*x*l/Math.sqrt(l*l-x*x))/(l*l*(l*l-x*x));
| |
− |
| |
− | abs=Math.sqrt(x2*x2+y2*y2);
| |
− |
| |
− | Ek=m*v*v/2;
| |
− |
| |
− | Vm=Math.sqrt(k*A*A*s*s/(l*l*m)+2*9.8*A);
| |
− |
| |
− | Ep=m*(Vm*Vm-v*v)/2//-k*x0*x0*s*s/(2*l*l);
| |
− |
| |
− | E=Ep+Ek;
| |
− |
| |
− | ctxE.beginPath();
| |
− |
| |
− | ctxE.strokeStyle='rgba(255,0,0,1)';
| |
− |
| |
− | ctxE.arc(20+i*10,230-Ek/15,1,0,2*Math.PI);
| |
− |
| |
− | ctxE.stroke();
| |
− |
| |
− | ctxE.beginPath();
| |
− |
| |
− | ctxE.strokeStyle='rgba(0,0,255,1)';
| |
− |
| |
− | ctxE.arc(20+i*10,230-Ep/15,1,0,2*Math.PI);
| |
− |
| |
− | ctxE.stroke();
| |
− |
| |
− | ctxE.beginPath();
| |
− |
| |
− | ctxE.strokeStyle='rgba(0,255,0,1)';
| |
− |
| |
− | ctxE.arc(20+i*10,230-E/15,1,0,2*Math.PI);
| |
− |
| |
− | ctxE.stroke();
| |
− |
| |
− | ctxE.strokeStyle='rgba(0,0,0,1)';
| |
− |
| |
− | ctxVX.beginPath();
| |
− |
| |
− | ctxVX.arc(250+2*x,125-2*x1,1,0,2*Math.PI);
| |
− |
| |
− | ctxVX.fill();
| |
− |
| |
− | document.getElementById("velocity").value=Math.round(v*100)/100;
| |
− |
| |
− | document.getElementById("absolute").value=Math.round(abs*100)/100;
| |
− |
| |
− | i=i+0.02;
| |
− |
| |
− | console.log(i,x,x1);
| |
− |
| |
− | ctx.beginPath();
| |
− |
| |
− |
| |
− |
| |
− | // ctx.setLineDash([5, 3])
| |
− |
| |
− | // ctx.moveTo(25+s,20);
| |
− |
| |
− | // ctx.lineTo(25+s-(y*s/l),125+(x*s/l));//пружина
| |
− |
| |
− | //ctx.stroke();
| |
− |
| |
− | ctx.moveTo(25+s,20);
| |
− |
| |
− | ctx.lineTo(25+s-y*s/(21*l),22.5+x*s/(21*l));
| |
− |
| |
− | while (j<20){
| |
− |
| |
− | j=j+1;
| |
− |
| |
− | ctx.lineTo(25+Math.pow(-1,j)*5+s-j*y*s/(21*l),20+5*j+j*x*s/(21*l));
| |
− |
| |
− | }
| |
− |
| |
− | j=0;
| |
− |
| |
− | ctx.lineTo(25+s-20*y*s/(21*l),122.5+20*x*s/(21*l));
| |
− |
| |
− | ctx.lineTo(25+s-y*s/l,125+x*s/l);
| |
− |
| |
− | ctx.moveTo(20,20);
| |
− |
| |
− | ctx.lineTo(980,20);
| |
− |
| |
− | ctx.moveTo(20,20);
| |
− |
| |
− | ctx.lineTo(20,230);
| |
− |
| |
− | ctx.moveTo(20,120);
| |
− |
| |
− | ctx.lineTo(25,125);
| |
− |
| |
− | ctx.lineTo(20,130);
| |
− |
| |
− | ctx.moveTo(25,125);
| |
− |
| |
− | ctx.lineTo(25+l-y,125+x); //стержень
| |
− |
| |
− | ctx.stroke();
| |
− |
| |
− | ctx.beginPath();
| |
− |
| |
− | ctx.arc(25+l-y,125+x,10,0,2*Math.PI);//шар
| |
− |
| |
− | ctx.fill();
| |
− |
| |
− |
| |
− | }
| |
− |
| |
− | button.onclick=function(){
| |
− |
| |
− | console.clear();
| |
− |
| |
− | b=parseFloat(document.getElementById("res").value);
| |
− |
| |
− | l=parseFloat(document.getElementById("lng").value);
| |
− |
| |
− | s=parseFloat(document.getElementById("brt").value);
| |
− |
| |
− | m=parseFloat(document.getElementById("mass").value);
| |
− |
| |
− | k=parseFloat(document.getElementById("kfc").value);
| |
− |
| |
− | a=parseFloat(document.getElementById("amp").value);
| |
− |
| |
− | if (s>l) {alert("ERROR!!! Spring coord>rod's length!!!");}
| |
− |
| |
− | else{
| |
− |
| |
− | if (a>95) {alert("ERROR!!! Amplitude is too big(>95)!!!");}
| |
− |
| |
− | else{
| |
− |
| |
− | if (bl=0) {
| |
− |
| |
− | ctxE.clearRect(0,0,500,500);
| |
− |
| |
− | ctxVX.clearRect(0,0,500,500);
| |
− |
| |
− | }
| |
− |
| |
− | ctxE.beginPath();
| |
− |
| |
− | ctxE.moveTo(20,20);
| |
− |
| |
− | ctxE.lineTo(20,230);
| |
− |
| |
− | ctxE.lineTo(480,230);
| |
− |
| |
− | ctxE.lineTo(475,225);
| |
− |
| |
− | ctxE.moveTo(480,230);
| |
− |
| |
− | ctxE.lineTo(475,235);
| |
− |
| |
− | ctxE.moveTo(20,20);
| |
− |
| |
− | ctxE.lineTo(25,25);
| |
− |
| |
− | ctxE.moveTo(20,20);
| |
− |
| |
− | ctxE.lineTo(15,25);
| |
− |
| |
− | ctxE.stroke();
| |
− |
| |
− | ctxE.fillText("Energy",30,25);
| |
− |
| |
− | ctxE.fillText("Time",470,245);
| |
− |
| |
− | ctxVX.beginPath();
| |
− |
| |
− | ctxVX.moveTo(250,20);
| |
− |
| |
− | ctxVX.lineTo(250,230);
| |
− |
| |
− | ctxVX.moveTo(20,125);
| |
− |
| |
− | ctxVX.lineTo(480,125);
| |
− |
| |
− | ctxVX.lineTo(475,120);
| |
− |
| |
− | ctxVX.moveTo(480,125);
| |
− |
| |
− | ctxVX.lineTo(475,130);
| |
− |
| |
− | ctxVX.moveTo(250,20);
| |
− |
| |
− | ctxVX.lineTo(255,25);
| |
− |
| |
− | ctxVX.moveTo(250,20);
| |
− |
| |
− | ctxVX.lineTo(245,25);
| |
− |
| |
− | ctxVX.stroke();
| |
− |
| |
− | ctxVX.fillText("V",255,25);
| |
− |
| |
− | ctxVX.fillText("x",470,140);
| |
− |
| |
− | timerId=setInterval(start,10);
| |
− |
| |
− |
| |
− | stopbutton.onclick=function(){
| |
− |
| |
− | button.value="Resume";
| |
− |
| |
− | bl=0;
| |
− |
| |
− | clearInterval(timerId);
| |
− |
| |
− | }
| |
− |
| |
− | console.clear();
| |
− |
| |
− | }
| |
− |
| |
− | }
| |
− |
| |
− | }
| |
− | }
| |
− | </syntaxhighlight>
| |