/* Variablendeklaration */ /* Variablendeklaration */ var GradRope; // Object Gradientenfunktion var Node; // Knoten ... function setup () { ... for (k = 0; k < K; k++) // Initialisieren des Seils { Node[k] = new Circle(r, M, true, '#88ff88', 'b'); // r, scale, visible, c, mode x[k] = 0; y[k] = y0 - l0*k; vx[k] = 0; vy[k] = 0; } } function draw() // Hauptprogramm { ... { // Lösung der DGL. mit leapfrog for (i = 0; i < I; i++) { // I Iterationen je Stützstelle for (k = 1; k < K; k++) { // alle 1. Integrationen result = GradRope.f1(k, vx[k], vy[k], x[k-1], x[k], x[k+1], y[k-1], y[k], y[k+1]); // k-ter Knoten vx_[k] = vx[k] + result[0]*dt/2; vy_[k] = vy[k] + result[1]*dt/2; } for (k = 1; k < K; k++) { // alle 2. Integrationen result = GradRope.f2(i, k, vx_[k], vy_[k]); // i-te Iteration, k-ter Knoten x[k] = x[k] + result[0]*dt; y[k] = y[k] + result[1]*dt; if (k == kActive) { vx_[k] = 0; vy_[k] = 0; } } for (k = 1; k < K; k++) { // alle 1. Integrationen result = GradRope.f1(k, vx[k], vy[k], x[k-1], x[k], x[k+1], y[k-1], y[k], y[k+1]); // k-ter Knoten vx[k] = vx_[k] + result[0]*dt/2; vy[k] = vy_[k] + result[1]*dt/2; } } } ... } /* generalisierte grad-Funktion der Seilknoten */ function GradientFunctions() { var lp, ln; // aktuelle Federlängen: previous to current node, current to next node var ax, ay; // Beschleunigungskomp. am Knoten var f1x, f1y; // Gradientenfunktionen Beschleunigung in x- bzw. y-Richtung var f2x, f2y; // Gradientenfunktionen Geschwindigkeit in x- bzw. y-Richtung this.f1 = function(k, vx, vy, xp, x, xn, yp, y, yn) { // Gradientenfunktion Beschleunigung if (k != kActive) { lp = sqrt(sq(y-yp) + sq(x-xp)); // Momentanfederanlänge vorheriger -> aktueller Knoten if (k < K-1) { // alle Knoten mit beidseitigem Kraftangriff ln = sqrt(sq(yn-y) + sq(xn-x)); // Momentanfederanlänge aktueller -> nächster Knoten ay = sqOmega*((ln-l0)*(yn-y)/ln - (lp-l0)*(y-yp)/lp); ax = sqOmega*((ln-l0)*(xn-x)/ln - (lp-l0)*(x-xp)/lp) + aw; //console.log("inner: y, yn, x, xn "+y+" "+yn+" "+x+" "+xn); //console.log("inner: ln"+" "+ln); } else { // letzter Knoten mit einseitigem Kraftangriff ay = -sqOmega*(lp-l0)*(y-yp)/lp; ax = -sqOmega*(lp-l0)*(x-xp)/lp + aw; } f1x = (ax - 2*d*vx); f1y = (g + ay - 2*d*vy); } else { f1x = 0; f1y = 0; } return[f1x, f1y]; } this.f2 = function(i, k, vx, vy) { //Gradientenfunktion Geschwindigkeit if (k != kActive) { f2x = vx; f2y = vy; } else { // k-ten Knoten mit Maus festhalten f2x = 0; f2y = 0; if (i == I-1) kActive = -1; } return[f2x, f2y]; } }