-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathscripts.min.js
43 lines (40 loc) · 13.3 KB
/
scripts.min.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* Copyright (C) 2021 Pierre Kreins
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
var ELECTRODEOFFSET={x:13,y:69},SOURCEOFFSET={x:23,y:71},VOLTAGESCALINGFACTOR=3E4;
$(function(){resizeCanvas();$(window).on("resize",function(){resizeCanvas();updateOscillo();updateCanvas()});interact(".source, .electrode").draggable({listeners:{start:function(a){},move:function(a){var c=$(a.target).position().left+a.dx,d=$(a.target).position().top+a.dy;$(a.target).css({top:d,left:c,position:"absolute"});updateCanvas();updateVoltage();updateOscillo()},end:function(a){updateCanvas();updateVoltage();updateOscillo()}}});$(document).on("input","#voltageRange",function(){$(".tooltip-inner").html($("#voltageRange").val());
document.getElementById("voltageRange").setAttribute("data-bs-original-title",$("#voltageRange").val());updateOscillo()});$("input[name=powerButton]").change(function(){updateOscillo()});$("input[name=currentRadioGroup]").change(function(){updateOscillo()});var b=document.getElementById("voltageRange");new bootstrap.Tooltip(b,{title:$("#voltageRange").val(),placement:"right"});$(document).ready(function(){updateCanvas();updateVoltage();updateOscillo()});$(".abltSelect").click(function(){var a=$(this).attr("id"),
c=parseInt(a.charAt(a.length-2));a=parseInt(a.charAt(a.length-1));var d=1-c;parseInt($("#abltSelector"+d.toString()).attr("data-selected"))==a&&changeSelectedAblt(d,(a+1)%3);changeSelectedAblt(c,a)})});function changeSelectedAblt(b,a){var c="#abltSelector"+b.toString(),d="#abltSelect"+b.toString()+a.toString();$(c).html($(d).html());$(c).attr("data-selected",a.toString())}
function updateOscillo(){var b=document.getElementById("oscilloCanvas"),a=b.getContext("2d"),c=b.height;b=b.width;a.clearRect(0,0,b,c);a.strokeStyle="black";a.lineWidth="1";a.beginPath();a.font="12px Arial";a.fillText("\u0394x : ms, \u0394y : mV",b-110,c-12);a.stroke();a.beginPath();c/=6;var d=b/20;a.font="14px Arial";for(var f=["A \u2192 B","A \u2192 C","B \u2192 C"],g=1;4>g;g++){var e=(2*g-1)*c,h=e-4,l=e+4;a.moveTo(0,e);a.lineTo(b,e);for(var m=1;20>m;m++){var k=m*d;a.moveTo(k,h);a.lineTo(k,l)}a.fillText("Ablt. "+
f[g-1],10,e+17)}a.stroke();if("on"==$("input[name='powerButton']:checked").val())if(g=$("input[name='currentRadioGroup']:checked").val(),d=[$("#electrode1"),$("#electrode2"),$("#electrode3"),$("#electrode2"),$("#electrode3"),$("#electrode1")],f=["#6f42c1","#fd7e14","#20c997"],"dc"==g)for(g=$("#voltageRange").val(),h=0;3>h;h++){a.beginPath();a.lineWidth="2";a.strokeStyle=f[h];var n=d[2*h].position().left;k=d[2*h+1].position().left;var q=d[2*h].position().top;l=d[2*h+1].position().top;var p=$("#plus").position().left,
r=$("#plus").position().top;m=$("#minus").position().left;var t=$("#minus").position().top;e=Math.sqrt((n-p)*(n-p)+(q-r)*(q-r));p=Math.sqrt((k-p)*(k-p)+(l-r)*(l-r));n=Math.sqrt((n-m)*(n-m)+(q-t)*(q-t));k=Math.sqrt((k-m)*(k-m)+(l-t)*(l-t));e=1/e-1/p-1/n+1/k;l=g*e*VOLTAGESCALINGFACTOR;e=(2*(h+1)-1)*c-l;a.moveTo(0,e);a.lineTo(b,e);a.stroke()}else if("sinus"==g)for(g=$("#voltageRange").val(),h=0;3>h;h++){a.beginPath();a.lineWidth=2;a.strokeStyle=f[h];n=d[2*h].position().left;k=d[2*h+1].position().left;
q=d[2*h].position().top;l=d[2*h+1].position().top;p=$("#plus").position().left;r=$("#plus").position().top;m=$("#minus").position().left;t=$("#minus").position().top;e=Math.sqrt((n-p)*(n-p)+(q-r)*(q-r));p=Math.sqrt((k-p)*(k-p)+(l-r)*(l-r));n=Math.sqrt((n-m)*(n-m)+(q-t)*(q-t));k=Math.sqrt((k-m)*(k-m)+(l-t)*(l-t));e=1/e-1/p-1/n+1/k;l=g*e*VOLTAGESCALINGFACTOR;k=0;for(a.moveTo(k,(2*(h+1)-1)*c);k<b;)e=(2*(h+1)-1)*c-g*l*Math.sin(k/20),a.lineTo(k,e),k+=1;a.stroke()}else if("square"==g)for(g=$("#voltageRange").val(),
h=0;3>h;h++){a.beginPath();a.lineWidth=2;a.strokeStyle=f[h];n=d[2*h].position().left;k=d[2*h+1].position().left;q=d[2*h].position().top;l=d[2*h+1].position().top;p=$("#plus").position().left;r=$("#plus").position().top;m=$("#minus").position().left;t=$("#minus").position().top;e=Math.sqrt((n-p)*(n-p)+(q-r)*(q-r));p=Math.sqrt((k-p)*(k-p)+(l-r)*(l-r));n=Math.sqrt((n-m)*(n-m)+(q-t)*(q-t));k=Math.sqrt((k-m)*(k-m)+(l-t)*(l-t));e=1/e-1/p-1/n+1/k;l=g*e*VOLTAGESCALINGFACTOR;k=0;e=(2*(h+1)-1)*c;for(a.moveTo(k,
e);k<b;)a.lineTo(k+40,e),a.lineTo(k+40,e-l),a.lineTo(k+80,e-l),a.lineTo(k+80,e),k+=80;a.lineTo(k+40,e);a.lineTo(k+40,e-l);a.lineTo(k+80,e-l);a.lineTo(k+80,e);a.stroke()}}function toggleSourceVisibility(){"hidden"==$(".source").css("visibility")?$(".source").css("visibility","visible"):$(".source").css("visibility","hidden")}
function placeRandomly(){var b=$("#minus").position().left+SOURCEOFFSET.x,a=$("#minus").position().top+SOURCEOFFSET.y,c=.5>Math.random()?-1:1,d=randn_bm()*c*160;c=.5>Math.random()?-1:1;c=randn_bm()*c*160;$("#plus").animate({left:b+d-SOURCEOFFSET.x,top:a+c-SOURCEOFFSET.y},{duration:1E3,step:function(){updateCanvas();updateOscillo()},done:function(){updateVoltage()}})}
function randn_bm(){for(var b=0,a=0;0===b;)b=Math.random();for(;0===a;)a=Math.random();b=Math.sqrt(-2*Math.log(b))*Math.cos(2*Math.PI*a);b=b/10+.5;return 1<b||0>b?randn_bm():b}function resizeCanvas(){var b=document.getElementById("mainCanvas");b.width=b.offsetWidth;b.height=b.offsetHeight;b=document.getElementById("oscilloCanvas");b.width=b.offsetWidth;b.height=b.offsetHeight}
function placeSource(b,a){var c=$("#electrode2").position().left+ELECTRODEOFFSET.x,d=$("#electrode2").position().top+ELECTRODEOFFSET.y,f=$("#electrode3").position().left+ELECTRODEOFFSET.x,g=$("#electrode3").position().top+ELECTRODEOFFSET.y,e=$("#electrode1").position().left+ELECTRODEOFFSET.x,h=$("#electrode1").position().top+ELECTRODEOFFSET.y;if(c==f&&d==g||f==e&&g==h||c==e&&d==h)$("#mainModalTitle").html("Fehler"),$("#mainModalBody").html("Die Ableitungselektroden d\u00c3\u00bcrfen nicht übereinander gestapelt werden. Platziere die Ableitungselektroden neu!"),
c=new bootstrap.Modal(document.getElementById("mainModal"),{keyboard:!1}),c.show();else if(c==e&&f==e)$("#mainModalTitle").html("Fehler"),$("#mainModalBody").html("Die Ableitungen dürfen nicht parallel zueinander sein. Platziere die Ableitungselektroden neu!"),c=new bootstrap.Modal(document.getElementById("mainModal"),{keyboard:!1}),c.show();else if((h-d)/(e-c)==(h-g)/(e-f))$("#mainModalTitle").html("Fehler"),$("#mainModalBody").html("Die Ableitungen dürfen nicht parallel zueinander sein. Platziere die Ableitungselektroden neu!"),
c=new bootstrap.Modal(document.getElementById("mainModal"),{keyboard:!1}),c.show();else{f=parseInt($("#abltSelector0").attr("data-selected"));c=parseInt($("#abltSelector1").attr("data-selected"));d=[$("#electrode1"),$("#electrode2"),$("#electrode3"),$("#electrode2"),$("#electrode3"),$("#electrode1")];e=d[2*f];var l=d[2*f+1];h=d[2*c];var m=d[2*c+1];f=e.position().left+ELECTRODEOFFSET.x;c=h.position().left+ELECTRODEOFFSET.x;g=e.position().top+ELECTRODEOFFSET.y;d=h.position().top+ELECTRODEOFFSET.y;var k=
10*parseFloat($("#derivative1").val());l=getNewProjectionPoint(e,l,a,k);k=10*parseFloat($("#derivative2").val());m=getNewProjectionPoint(h,m,a,k);e=l.x;h=l.y;l=m.x;m=m.y;if(e==f){var n=h;k=m==d?l:(h-m)/(-1/((d-m)/(c-l)))+l}else l==c?(n=m,k=h==g?e:(m-h)/(-1/((g-h)/(f-e)))+e):h==g?(k=e,n=-1/((d-m)/(c-l))*(k-l)+m):(m==d?(k=l,f=-1/((g-h)/(f-e))):(f=-1/((g-h)/(f-e)),c=-1/((d-m)/(c-l)),k=(f*e-c*l+m-h)/(f-c)),n=f*(k-e)+h);b.animate({left:k-SOURCEOFFSET.x,top:n-SOURCEOFFSET.y},{duration:1E3,step:function(){updateCanvas();
updateOscillo()},done:function(){updateVoltage()}})}}function getNewProjectionPoint(b,a,c,d){var f=getProjectionPoint(b,a,c),g=f.x;f=f.y;var e=b.position().left+ELECTRODEOFFSET.x;b=b.position().top+ELECTRODEOFFSET.y;x3=a.position().left+ELECTRODEOFFSET.x;y3=a.position().top+ELECTRODEOFFSET.y;a=0>(e-g)*(e-x3)+(b-f)*(b-y3)?-1:1;c.is($("#plus"))&&(a*=-1);c=Math.sqrt(Math.pow(e-g,2)+Math.pow(b-f,2));var h={};h.x=g+d*(e-g)/c*a;h.y=f+d*(b-f)/c*a;return h}
function updateVoltage(){$("#text1").val((getProjectionVectorMagnitude($("#electrode1"),$("#electrode2"))/10).toFixed(1));$("#text2").val((getProjectionVectorMagnitude($("#electrode3"),$("#electrode2"))/10).toFixed(1));$("#text3").val((getProjectionVectorMagnitude($("#electrode3"),$("#electrode1"))/10).toFixed(1))}
function getProjectionVectorMagnitude(b,a){var c=getProjectionPoint(b,a,$("#plus")),d=getProjectionPoint(b,a,$("#minus")),f=c.x,g=d.x,e=a.position().left,h=b.position().left;c=c.y;var l=d.y;d=a.position().top;var m=b.position().top;f-=g;g=c-l;return(0>f*(h-e)+g*(m-d)?-1:1)*Math.sqrt(f*f+g*g)}
function updateCanvas(){var b=document.getElementById("mainCanvas"),a=b.getContext("2d");a.clearRect(0,0,b.width,b.height);a.strokeStyle="black";a.lineWidth="1";a.beginPath();b=b.height-24;a.moveTo(35,b);a.lineTo(235,b);for(var c=0;21>c;c++)0==c%10?(a.moveTo(35+10*c,b-6),a.lineTo(35+10*c,b+6)):(a.moveTo(35+10*c,b-4),a.lineTo(35+10*c,b+4));a.stroke();a.font="12px Arial";a.fillStyle="black";a.fillText("0",31,b+18);a.fillText("10",127,b+18);a.fillText("20 mm",228,b+18);$("#guidelines").prop("checked")&&
(a.strokeStyle="black",a.lineWidth="1",a.beginPath(),drawPassingLine(a,$("#electrode1"),$("#electrode2")),drawPassingLine(a,$("#electrode2"),$("#electrode3")),drawPassingLine(a,$("#electrode1"),$("#electrode3")),drawProjectionLine(a,$("#minus"),$("#electrode1"),$("#electrode2"),"#3d8bfd"),drawProjectionLine(a,$("#minus"),$("#electrode2"),$("#electrode3"),"#3d8bfd"),drawProjectionLine(a,$("#minus"),$("#electrode1"),$("#electrode3"),"#3d8bfde"),drawProjectionLine(a,$("#plus"),$("#electrode1"),$("#electrode2"),
"#e35d6a"),drawProjectionLine(a,$("#plus"),$("#electrode2"),$("#electrode3"),"#e35d6a"),drawProjectionLine(a,$("#plus"),$("#electrode1"),$("#electrode3"),"#e35d6a"));$("#projections").prop("checked")&&(drawProjection(a,$("#plus"),$("#minus"),$("#electrode1"),$("#electrode2"),"#6f42c1"),drawProjection(a,$("#plus"),$("#minus"),$("#electrode2"),$("#electrode3"),"#fd7e14"),drawProjection(a,$("#plus"),$("#minus"),$("#electrode1"),$("#electrode3"),"#20c997"));$("#vector").prop("checked")&&(a.lineWidth=
"3",a.strokeStyle="black",c={},c.x=$("#plus").position().left+SOURCEOFFSET.x,c.y=$("#plus").position().top+SOURCEOFFSET.y,b={},b.x=$("#minus").position().left+SOURCEOFFSET.x,b.y=$("#minus").position().top+SOURCEOFFSET.y,a.beginPath(),a.moveTo(b.x,b.y),a.lineTo(c.x,c.y),a.stroke(),drawArrowhead(a,b,c,12,"black"));if($("#cabrera").prop("checked"))for(a.lineWidth="1",a.strokeStyle="black",b={},b.x=$("#minus").position().left+SOURCEOFFSET.x,b.y=$("#minus").position().top+SOURCEOFFSET.y,a.beginPath(),
a.arc(b.x,b.y,150,0,2*Math.PI,!1),a.moveTo(b.x-150,b.y),a.lineTo(b.x,b.y),a.stroke(),a.font="12px Arial",a.fillStyle="black",a.lineWidth="1",c=-1;5>c;c++){a.beginPath();var d=c*Math.PI/6,f=(b.x+150-b.x)*Math.cos(d)+b.x,g=(b.x+150-b.x)*Math.sin(d)+b.y;a.moveTo(b.x,b.y);a.lineTo(f,g);a.stroke();f=(b.x+160-b.x)*Math.cos(d)+b.x;g=(b.x+160-b.x)*Math.sin(d)+b.y+4;a.fillText((30*c).toString()+" \u00b0",f,g)}}
function clearCanvas(){var b=document.getElementById("mainCanvas");b.getContext("2d").clearRect(0,0,b.width,b.height)}function getProjectionPoint(b,a,c){var d=b.position().left+ELECTRODEOFFSET.x;b=b.position().top+ELECTRODEOFFSET.y;var f=a.position().left+ELECTRODEOFFSET.x,g=a.position().top+ELECTRODEOFFSET.y;a=c.position().left+SOURCEOFFSET.x;c=c.position().top+SOURCEOFFSET.y;var e={};f==d?(e.x=d,e.y=c):g==b?(e.x=a,e.y=b):(f=(g-b)/(f-d),e.x=(c-b+f*d+1/f*a)/(f+1/f),e.y=f*(e.x-d)+b);return e}
function drawPassingLine(b,a,c){var d=a.position().left+ELECTRODEOFFSET.x;a=a.position().top+ELECTRODEOFFSET.y;var f=c.position().left+ELECTRODEOFFSET.x,g=c.position().top+ELECTRODEOFFSET.y;if(d==f){var e=c=d;var h=0;d=b.canvas.clientHeight}else c=0,e=b.canvas.clientWidth,h=(c-d)*(g-a)/(f-d)+a,d=(e-d)*(g-a)/(f-d)+a;b.strokeStyle="black";b.moveTo(c,h);b.lineTo(e,d);b.stroke()}
function drawProjectionLine(b,a,c,d,f){b.strokeStyle=f;b.fillStyle=f;b.beginPath();b.lineWidth="1.5";var g=a.position().left+SOURCEOFFSET.x,e=a.position().top+SOURCEOFFSET.y;c=getProjectionPoint(c,d,a);a=c.x;c=c.y;b.moveTo(g,e);b.lineTo(a,c);b.stroke();var h=Math.sqrt(Math.pow(g-a,2)+Math.pow(e-c,2));d=(g-a)/h;var l=(e-c)/h;h=a+8*(d+l);d=c+8*(l-d);b.beginPath();b.arc(h,d,1.5,0,2*Math.PI);b.fill();b.beginPath();b.strokeStyle=f;g==a?f=e<c?-Math.PI/2:Math.PI/2:(f=Math.atan((e-c)/(g-a)),a>g&&(f+=Math.PI));
g=f-Math.PI/2;b.beginPath();b.arc(a,c,20,f,g,!0);b.stroke()}function drawProjection(b,a,c,d,f,g){b.beginPath();b.lineWidth="3";b.strokeStyle=g;a=getProjectionPoint(d,f,a);c=getProjectionPoint(d,f,c);.3<=distanceBetween(c,a)&&(b.moveTo(c.x,c.y),b.lineTo(a.x,a.y),b.stroke(),drawArrowhead(b,c,a,10,g))}function distanceBetween(b,a){var c=b.x-a.x,d=b.y-a.y;return Math.sqrt(c*c+d*d)}
function drawArrowhead(b,a,c,d,f){var g=Math.sqrt(Math.pow(c.x-a.x,2)+Math.pow(c.y-a.y,2)),e=c.x+-(d-2)*(c.x-a.x)/g;g=c.y+-(d-2)*(c.y-a.y)/g;b.strokeStyle=f;b.fillStyle=f;b.beginPath();a=Math.atan2(c.y-a.y,c.x-a.x);c=d*Math.cos(a)+e;f=d*Math.sin(a)+g;b.moveTo(c,f);a+=1/3*2*Math.PI;c=d*Math.cos(a)+e;f=d*Math.sin(a)+g;b.lineTo(c,f);a+=1/3*2*Math.PI;c=d*Math.cos(a)+e;f=d*Math.sin(a)+g;b.lineTo(c,f);b.closePath();b.fill()};