Skip to content

Instantly share code, notes, and snippets.

@wyhinton
Created December 17, 2022 09:38
Show Gist options
  • Save wyhinton/5ec915fc51378c3271c8517971d0ab48 to your computer and use it in GitHub Desktop.
Save wyhinton/5ec915fc51378c3271c8517971d0ab48 to your computer and use it in GitHub Desktop.
Strange Attractors JS
/*
Equeations from:
https://www.dynamicmath.xyz/strange-attractors/
*/
Param var(28);
Param scale(1);
Param offX;
Param offY;
Param offZ;
Param mode(0);
Buffer state;
History x;
History y;
History z;
History outX;
History outY;
History outZ;
History normScale;
//
newFrame = in1;
// Run Simulation
if ( delta(newFrame)>0 ) {
dx = 0;
dy = 0;
dz = 0;
// Get positions
x = state.peek(0);
y = state.peek(1);
z = state.peek(2);
// Lorenz
if (mode == 0) {
normScale = 0.04166666667;
dt = 0.01;
rho = 28 * var;
sigma = 10;
beta = 2.6666667;
dx = sigma * (y-x);
dy = x*(rho-z) - y;
dz = x*y - beta*z;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale;
outY = y*normScale;
outZ = z*normScale - 1;
}
// Rössler
else if (mode == 1) {
normScale = 0.05;
dt = 0.02;
a = 0.2 * var;
b = 0.2;
c = 5.7;
dx = -(y + z);
dy = x + a*y;
dz = b + x*z - c*z;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale;
outY = y*normScale;
outZ = z*normScale;
}
// Bouali
else if (mode == 2) {
normScale = 0.25;
dt = 0.006;
a = 0.3 * var;
s = 1;
dx = x * (4-y) + a*z;
dy = -y * (1 - x*x);
dz = -x * (1.5 - s*z) - 0.05*z;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = (x*normScale) * 0.8;
outY = (y*normScale - 1) * 0.8;
outZ = (z*normScale) * 0.8;
}
// Thomas
else if (mode == 3) {
normScale = 0.25;
dt = 0.05;
b = 0.208186 * var;
dx = sin(y) - b*x;
dy = sin(z) - b*y;
dz = sin(x) - b*z;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale;
outY = y*normScale;
outZ = z*normScale;
}
// Aizawa
else if (mode == 4) {
normScale = 0.666667;
dt = 0.01;
a = 0.95;
b = 0.7 * var;
c = 0.6;
d = 3.5;
ev = 0.25;
f = 0.1;
dx = (z-b)*x - d*y;
dy = d*x + (z-b)*y;
dz = c + a*z - pow(z,3)/3 - (x*x+y*y)*(1 + ev*z);
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale;
outY = y*normScale;
outZ = z*normScale - 0.5;
}
// Chen
else if (mode == 5) {
normScale = 0.025;
dt = 0.001;
alpha = 5;
beta = -10;
delt = -0.38 * var;
dx = alpha*x - y*z;
dy = beta*y + x*z;
dz = delt*z + (x*y)/3;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale;
outY = y*normScale;
outZ = z*normScale;
}
// Halvorsen
else if (mode == 6) {
normScale = 0.1;
dt = 0.004;
a = 1.89 * var;
dx = -a*x - 4*y - 4*z - y*y;
dy = -a*y - 4*z - 4*x - z*z;
dz = -a*z - 4*x - 4*y - x*x;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale + 0.25;
outY = y*normScale + 0.25;
outZ = z*normScale + 0.25;
}
// Liu-Chen
else if (mode == 7) {
normScale = 0.125;
dt = 0.001;
a = 2.4 * var;
b = -3.78;
c = 14;
d = -11;
ev = 4;
f = 5.58;
g = -1;
dx = a*y + b*x + c*y*z;
dy = d*y - z + ev*x*z;
dz = f*z + g*x*y;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale + 1;
outY = y*normScale;
outZ = z*normScale;
}
// Nose Hoover
else if (mode == 8) {
normScale = 0.25;
dt = 0.009;
a = 1.5 * var;
dx = y;
dy = -x + y*z;
dz = a - y*y;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale;
outY = y*normScale;
outZ = z*normScale;
}
// Sprott
else if (mode == 9) {
normScale = 0.75;
dt = 0.01;
a = 2.07;
b = 1.79 * var;
dx = y + a*x*y + x*z;
dy = 1 - b*x*x + y*z;
dz = x - x*x - y*y;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale - 0.5;
outY = y*normScale;
outZ = z*normScale;
}
// Four-Wing
else if (mode == 10) {
normScale = 0.5;
dt = 0.01;
a = 0.2 * var;
b = 0.01;
c = -0.4;
dx = a*x + y*z;
dy = b*x + c*y - x*z;
dz = -z - x*y;
x += dx * dt;
y += dy * dt;
z += dz * dt;
outX = x*normScale;
outY = y*normScale;
outZ = z*normScale;
}
// Save positions
state.poke(x, 0);
state.poke(y, 1);
state.poke(z, 2);
}
//
out1 = (outX*scale + offX) * 0.5 + 0.5;
out2 = (outY*scale + offY) * 0.5 + 0.5;
out3 = (outZ*scale + offZ) * 0.5 + 0.5;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment