...und hier gleich noch ein zweiter Thread zu der Fluidsimulation. Verdammt, die Navier-Stokes-Gleichungen und das Gauß-Seidel-Verfahren zum Lösen nichtlinearer Differentialgleichungssysteme zu verstehen, bereitet mir schon genug Kopfzerbrechen. Die JavaScript-Quirks sind mir da gerade wirklich ein Bisschen zuviel, sorry. Schon dieses Rumgeturne mit
Ich verstehe hier die Zusammenhänge nicht:
Als nächstes wird dann noch
In
var i0 = x | 0;
. Bis ich da mal drauf gekommen bin, was das macht... Und welchen Datentyp i0
da hat, darf man auch schön raten. Naja, egal, genug Dampf abgelassen.Ich verstehe hier die Zusammenhänge nicht:
update
erzeugt einen neuen Frame der Animation, ja? Da drin wird als erstes eine Funktion queryUI
aufgerufen. Diese Funktion setzt alle Werte der drei übergebenen Arrays auf 0. Wenn ich das bei meiner Portierung mache, sieht man keine Animation, weil ja die Werte vom Frame davor wichtig sind für den neuen Frame, warum sollte man das alles löschen?Als nächstes wird dann noch
uiCallback
aufgerufen. Schaut man oben, scheint diese Funktion genau nichts zu machen. Außerdem erwartet sie drei Parameter, warum wird sie dann also mit dem Argument new Field(dens, u, v)
aufgerufen? Okay, Field
ist eine Funktion, die diese drei Parameter erwartet. Also erzeugt new
... Was, irgendwie eine neue Instanz davon, wie bei einer Klasse?In
update
werden dann vel_step
und dens_step
aufgerufen, okay, kein Problem. Anschließend dann die Funktion displayFunc
. displayFunc
ist weiter unten aber auch eine Variable (innerhalb desselben Scope, oder?), außerdem wird displayFunc
in der Funktion setDisplayFunction
der Wert func
zugewiesen. Aufgerufen wird setDisplayFunction
durch einen Button in der html-Datei, dort wird der Zeichenmodus umgeschaltet. Okay, das will ich zwar später auch haben, ist aber für's bloße Funktionieren momentan erstmal nicht so wichtig.
Javascript:
var uiCallback = function(d,u,v) {};
function Field(dens, u, v) {
// Just exposing the fields here rather than using accessors is a measurable win during display (maybe 5%)
// but makes the code ugly.
this.setDensity = function(x, y, d) {
dens[(x + 1) + (y + 1) * rowSize] = d;
}
this.getDensity = function(x, y) {
return dens[(x + 1) + (y + 1) * rowSize];
}
this.setVelocity = function(x, y, xv, yv) {
u[(x + 1) + (y + 1) * rowSize] = xv;
v[(x + 1) + (y + 1) * rowSize] = yv;
}
this.getXVelocity = function(x, y) {
return u[(x + 1) + (y + 1) * rowSize];
}
this.getYVelocity = function(x, y) {
return v[(x + 1) + (y + 1) * rowSize];
}
this.width = function() { return width; }
this.height = function() { return height; }
}
function queryUI(d, u, v)
{
for (var i = 0; i < size; i++)
{
d[i] = 0.0;
v[i] = 0.0;
u[i] = 0.0;
}
uiCallback(new Field(d, u, v));
}
this.update = function () {
queryUI(dens_prev, u_prev, v_prev);
vel_step(u, v, u_prev, v_prev, dt);
dens_step(dens, dens_prev, u, v, dt);
displayFunc(new Field(dens, u, v));
}
this.setDisplayFunction = function(func) {
displayFunc = func;
}
this.iterations = function() { return iterations; }
this.setIterations = function(iters) {
if (iters > 0 && iters <= 100)
iterations = iters;
}
this.setUICallback = function(callback) {
uiCallback = callback;
}
var iterations = 10;
var visc = 0.5;
var dt = 0.1;
var dens;
var dens_prev;
var u;
var u_prev;
var v;
var v_prev;
var width;
var height;
var rowSize;
var size;
var displayFunc;