Euler-Simulation mit HTML5 und Javascript unter Verwendung des Canvas-Tags.
(EN google-translate)
(PL google-translate)
Körperpendel mit Euler-Integration simuliert
Quelltext:
<script language:javascript> var phi1 = 0.0; var omega1 = 0.0; var t = 0.0; var dt = 0.01; var m = 1.0; var l = 1.0; var r = 0.1; var J = 0.24*m*r*r + (1/12)*m*l*l; var g = 9.81; var K = (2*J)/(m*l) + l/2; var malkontext; var zeitgeber; function auffrischen(element) { var wert = document.getElementById(element).value; var teile = element.split("_"); var variablen_name = teile[0]; zeitgeber = window.clearInterval(zeitgeber); if(teile[1]=="schieber") { wert = wert*0.001; } var zuweisung = variablen_name+"="+wert+";"; eval(zuweisung); document.getElementById(variablen_name+"_text").value = wert; document.getElementById(variablen_name+"_schieber").value = wert*1000.0; loescheAlles(); phi1 = wert; zeichnePendel(phi1,"#f00"); } function zeichnePendel(winkel, farbe) { malkontext.setTransform(1.0,0,0,1.0,0,0); malkontext.translate(250,250); malkontext.rotate(-winkel); malkontext.fillStyle = farbe; malkontext.fillRect(-10,0,20,200); } function loeschePendel(winkel) { malkontext.setTransform(1.0,0,0,1.0,0,0); malkontext.translate(250,250); malkontext.rotate(-winkel); malkontext.fillStyle = "#fff"; malkontext.fillRect(-11,-1,22,202); } function loescheAlles() { malkontext.setTransform(1.0,0,0,1.0,0,0); malkontext.fillStyle = "#fff"; malkontext.fillRect(0,0,500,500); } function zeichnen() { loeschePendel(phi1); var phi1_neu = phi1 + omega1*dt; var omega1_neu = omega1 - (g/K)*Math.sin(phi1)*dt; phi1 = phi1_neu; omega1 = omega1_neu; var phi_zeigen = phi1; while(phi_zeigen<0.0) { phi_zeigen+=6.28318530718; } while(phi_zeigen>6.28318530718) { phi_zeigen-=6.28318530718; } document.getElementById("phi1_text").value = phi_zeigen; document.getElementById("phi1_schieber").value = phi_zeigen*1000.0; zeichnePendel(phi1,"#f00"); } function initialisieren() { malkontext = document.getElementById("grafik").getContext("2d"); zeichnePendel(phi1,"#f00"); } function startstop() { var wert = document.getElementById("startstop").value; if(wert=="start") { document.getElementById("startstop").value = "stop"; document.getElementById("startstop").style.backgroundColor = "#FF0000"; t=0.0; omega1 = 0.0; zeitgeber = setInterval(zeichnen,30); } else { document.getElementById("startstop").value = "start"; document.getElementById("startstop").style.backgroundColor = "#00FF00"; zeitgeber = window.clearInterval(zeitgeber); } } </script> <h4>Körperpendel mit Euler-Integration simuliert</h4> <canvas id="grafik" width="500" height="500"> </canvas> <fieldset> <legend>Parametereinabe</legend> <p> <label>Initialisierung (zuerst betätigen!): <input type="button" value="Initialisierung" onclick="javascript:initialisieren()"/> </label> </p> <p> <label>φ<sub>1</sub>: <input id="phi1_schieber" type="range" min="0" max="6283" value="0" onchange="javascript:auffrischen('phi1_schieber')" /> <input id="phi1_text" type="text" value="0" onchange="javascript:auffrischen('phi1_text')" /> </label> </p> <p> <input id="startstop" type="button" value="start" style="background-color: #00FF00" onclick="javascript:startstop()"/> </p> </fieldset>
Code 0-1: Quelltext zu obigem Beispiel