var w,h,ratio,el,g,drag,dragIndex,dragging,dots,my={} var spring={k:-10,len:170,damp:0} var block={y:290,v:0,mass:1};var hist=[] function springMain(mode){my.version='0.5';mode=typeof mode!=='undefined'?mode:'sin';console.log("mode",mode);mode='sin' w=360;h=390;my.lt=100;my.bt=h-50 my.midx=w/2 my.orig={x:50,y:20} my.modes=[{id:"sin",name:"Sine",fn:springDraw,pts:[[w/2+80,80,"A"]]},] my.mode=my.modes[0];for(var i=0;i';s+='';s+='
' s+=playHTML(36) s+='
';s+='
Damping:
';s+='';s+='
Stiffness:
';s+='';s+='
© 2018 MathsIsFun.com v'+my.version+'
';s+='';document.write(s);el=document.getElementById('canvasId');ratio=2;el.width=w*ratio;el.height=h*ratio;el.style.width=w+"px";el.style.height=h+"px";g=el.getContext("2d");g.setTransform(ratio,0,0,ratio,0,0);my.dotRad=30 dragging=false;drag={hold:{x:0,y:0}} my.prevTgt={typ:'',a:0,b:0};dotsMake() el.addEventListener("mousedown",onMouseDown,false);el.addEventListener('touchstart',onTouchStart,false);el.addEventListener("mousemove",doPointer,false);update() playToggle(false)} function anim(){if(my.playQ){update() requestAnimationFrame(anim);}} function update(){g.clearRect(0,0,g.canvas.width,g.canvas.height) springDraw() histDraw() dotsDraw()} function chgDamp(v){spring.damp=-v} function chgStiff(v){spring.k=-v} function histDraw(){g.strokeStyle='black' g.beginPath() for(var i=0;imaxX)?maxX:posX);posY=mouseY-drag.hold.y;posY=(posYmaxY)?maxY:posY);if(dragging){dots[dragIndex].x=posX;dots[dragIndex].y=posY;block.y=posY} update()} function hitTest(shape,x,y){var dx;var dy;dx=x-shape.x;dy=y-shape.y;return(dx*dx+dy*dyMath.pow(A.x-B.x,2)+Math.pow(A.y-B.y,2)){return null;} if(Math.pow(ip.x-A.x,2)+Math.pow(ip.y-A.y,2)>Math.pow(A.x-B.x,2)+Math.pow(A.y-B.y,2)){return null;} if(Math.pow(ip.x-F.x,2)+Math.pow(ip.y-F.y,2)>Math.pow(E.x-F.x,2)+Math.pow(E.y-F.y,2)){return null;} if(Math.pow(ip.x-E.x,2)+Math.pow(ip.y-E.y,2)>Math.pow(E.x-F.x,2)+Math.pow(E.y-F.y,2)){return null;}} return ip;} CanvasRenderingContext2D.prototype.drawSpring=function(x1,y1,x2,y2,width){var dx=x2-x1;var dy=y2-y1;var dist=Math.sqrt(dx*dx+dy*dy);var nx=dx/dist;var ny=dy/dist;g.beginPath();g.moveTo(x1,y1);var step=0.1;for(var i=0;i<1-step;i+=step){for(var j=0;j<1;j+=0.1){var xx=x1+dx*(i+j*step);var yy=y1+dy*(i+j*step);xx-=Math.sin(j*Math.PI*2)*ny*width;yy+=Math.sin(j*Math.PI*2)*nx*width;g.lineTo(xx,yy);}} g.lineTo(x2,y2);g.stroke();} CanvasRenderingContext2D.prototype.drawSpring2=function(x1,y1,x2,y2,width){var dx=x2-x1;var dy=y2-y1;var dist=Math.sqrt(dx*dx+dy*dy);g.beginPath();g.moveTo(x1,y1);var phase=0 var step=dist/300 for(var d=0;d<=dist;d+=step){var x=x1+(dx/dist)*d+Math.cos(phase+d/dist*(30*Math.PI))*width var y=y1+(dy/dist)*d+Math.sin(phase+d/dist*(30*Math.PI))*width g.lineTo(x,y);} g.lineTo(x2,y2);g.stroke();}