/* 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];
}
}