Abyssal Tripod Fish
Bathypterois grallator abyssal fish standing poised above the abyssal sea floor on three hyper-elongated rigid stilt fins, facing into the bottom current to intercept drifting prey.
60 FPS • Canvas 2D
Click + Drag to interact with field
</>
Full Executable Algorithm Code
192 lines
6958 chars
// 052 - Abyssal Tripod Fish (creatures)
// 1:1 Original algorithm engine source
function createAbyssalTripodFish() {
const BODY_RIBBONS = 20;
const PARTICLE_COUNT = 60;
return {
setup() {
},
render(context, timeState, params) {
const { ctx, width, height } = context;
const currentSpeed = Number(params.currentRate || 1);
const stiltHeight = Number(params.stiltLength || 1.2);
const t = timeState.time * currentSpeed;
ctx.fillStyle = "#020306";
ctx.fillRect(0, 0, width, height);
const cx = width * 0.5;
const seafloorY = height * 0.88;
const fishScale = Math.min(width, height) / 500;
ctx.save();
ctx.globalCompositeOperation = "screen";
const baseHue = (200 + Math.sin(t * 0.4) * 15) % 360;
for (let p = 0; p < PARTICLE_COUNT; p++) {
const seed = p * 41.7;
const px = (seed * 5 + t * 45) % (width + 60) - 30;
const py = seafloorY - 220 + seed * 9 % 200;
const alpha = 0.2 + p % 5 * 0.15;
ctx.fillStyle = "rgba(56, 189, 248, " + alpha + ")";
ctx.fillRect(px, py, 1.8, 1.8);
}
ctx.beginPath();
ctx.moveTo(0, seafloorY);
ctx.lineTo(width, seafloorY);
ctx.strokeStyle = "rgba(56, 189, 248, 0.4)";
ctx.lineWidth = 2;
ctx.stroke();
for (let gx = -6; gx <= 6; gx++) {
const xFloor = cx + gx * 80 * fishScale;
ctx.beginPath();
ctx.moveTo(xFloor, seafloorY);
ctx.lineTo(cx + gx * 140 * fishScale, height);
ctx.strokeStyle = "rgba(56, 189, 248, 0.12)";
ctx.lineWidth = 1;
ctx.stroke();
}
const bodyX = cx - 20 * fishScale;
const bodyY = seafloorY - 145 * stiltHeight * fishScale + Math.sin(t * 0.8) * 3;
for (let s = -1; s <= 1; s += 2) {
const rootX = bodyX + s * 24 * fishScale;
const rootY = bodyY + 14 * fishScale;
const groundX = cx + s * (105 * fishScale);
const groundY = seafloorY;
for (let str = 0; str < 4; str++) {
const normStr = str / 3;
ctx.beginPath();
ctx.moveTo(rootX + str * 2, rootY);
ctx.quadraticCurveTo(
rootX + s * (18 + normStr * 6) * fishScale,
(rootY + groundY) * 0.5,
groundX + str * 2,
groundY
);
ctx.strokeStyle = hsla(190, 95, 75, 0.4 + normStr * 0.45);
ctx.lineWidth = str === 3 ? 2 : 1;
ctx.stroke();
}
ctx.fillStyle = "#38bdf8";
ctx.shadowColor = "#38bdf8";
ctx.shadowBlur = 10;
ctx.beginPath();
ctx.arc(groundX, groundY, 4.5 * fishScale, 0, Math.PI * 2);
ctx.fill();
ctx.shadowBlur = 0;
}
const tailRootX = bodyX - 115 * fishScale;
const tailRootY = bodyY + 6 * fishScale;
const tailGroundX = cx - 145 * fishScale;
const tailGroundY = seafloorY;
for (let str = 0; str < 4; str++) {
const normStr = str / 3;
ctx.beginPath();
ctx.moveTo(tailRootX, tailRootY + str * 2);
ctx.quadraticCurveTo(
tailRootX - (22 + normStr * 6) * fishScale,
(tailRootY + tailGroundY) * 0.5,
tailGroundX,
tailGroundY
);
ctx.strokeStyle = hsla(190, 95, 75, 0.4 + normStr * 0.45);
ctx.lineWidth = str === 3 ? 2 : 1;
ctx.stroke();
}
ctx.fillStyle = "#38bdf8";
ctx.beginPath();
ctx.arc(tailGroundX, tailGroundY, 4.5 * fishScale, 0, Math.PI * 2);
ctx.fill();
for (let r = 1; r <= BODY_RIBBONS; r++) {
const normR = r / BODY_RIBBONS;
const curScale = normR * fishScale;
ctx.beginPath();
ctx.moveTo(bodyX + 80 * curScale, bodyY - 5 * curScale);
ctx.quadraticCurveTo(bodyX + 20 * curScale, bodyY - 26 * curScale, bodyX - 115 * curScale, bodyY - 5 * curScale);
ctx.lineTo(bodyX - 115 * curScale, bodyY + 12 * curScale);
ctx.quadraticCurveTo(bodyX + 20 * curScale, bodyY + 24 * curScale, bodyX + 80 * curScale, bodyY - 5 * curScale);
ctx.closePath();
const bHue = (baseHue + normR * 25) % 360;
ctx.strokeStyle = hsla(bHue, 90, 68, 0.08 + normR * 0.35);
ctx.lineWidth = r === BODY_RIBBONS ? 2.2 * fishScale : 0.9;
ctx.stroke();
if (r % 5 === 0) {
ctx.fillStyle = hsla(bHue, 80, 45, 0.04);
ctx.fill();
}
}
ctx.fillStyle = "#38bdf8";
ctx.beginPath();
ctx.arc(bodyX + 64 * fishScale, bodyY - 8 * fishScale, 3.5 * fishScale, 0, Math.PI * 2);
ctx.fill();
for (let s = -1; s <= 1; s += 2) {
const pecRootX = bodyX + 38 * fishScale;
const pecRootY = bodyY - 14 * fishScale;
for (let str = 0; str < 5; str++) {
const normStr = str / 4;
ctx.beginPath();
ctx.moveTo(pecRootX, pecRootY);
const pecWave = Math.sin(t * 2.5 + str + s) * (14 * fishScale);
const tipX = pecRootX + (110 + normStr * 25) * fishScale;
const tipY = bodyY - (130 + normStr * 20) * fishScale + pecWave;
ctx.bezierCurveTo(
pecRootX + (25 + normStr * 10) * fishScale,
bodyY - 65 * fishScale,
pecRootX + (80 + normStr * 15) * fishScale,
bodyY - 105 * fishScale + pecWave,
tipX,
tipY
);
ctx.strokeStyle = hsla((baseHue + 30 + str * 8) % 360, 95, 75, 0.35 + normStr * 0.5);
ctx.lineWidth = str === 4 ? 2 : 1;
ctx.stroke();
if (str === 4) {
ctx.fillStyle = "#ffffff";
ctx.beginPath();
ctx.arc(tipX, tipY, 2.5 * fishScale, 0, Math.PI * 2);
ctx.fill();
}
}
}
ctx.restore();
}
};
}
// Default parameters from content metadata
const defaultParams = [
{
"key": "currentRate",
"label": "Benthic Current Velocity",
"type": "range",
"min": 0.4,
"max": 2.2,
"step": 0.1,
"defaultValue": 1,
"description": "Abyssal current particle drift speed"
},
{
"key": "stiltLength",
"label": "Stilt Fin Height",
"type": "range",
"min": 0.8,
"max": 1.6,
"step": 0.1,
"defaultValue": 1.2,
"description": "Elevation above seafloor ooze"
}
];
if (!window.__art_instances) window.__art_instances = {};
if (!window.__art_instances['abyssal-tripod-fish']) {
const inst = typeof createAbyssalTripodFish === 'function' ? createAbyssalTripodFish() : null;
if (inst && inst.setup) {
inst.setup({ ctx, width, height, dpr: 1, aspectRatio: width / height }, defaultParams);
}
window.__art_instances['abyssal-tripod-fish'] = inst;
}
const instance = window.__art_instances['abyssal-tripod-fish'];
if (instance && instance.render) {
instance.render(
{ ctx, width, height, dpr: 1, aspectRatio: width / height },
{ time, deltaTime: dt, frameCount: Math.floor(time * 60), fps: 60 },
defaultParams
);
} Edit in Interactive Playground
Zero Dependencies • Standalone Canvas 2D
ƒ
Mathematical Formulation
high
Analytical Equation
Fstilt=pseafloor−ppelvic,ppectoral(s,t)=proot+B(s)+[Acsin(ωt)0]
Click to expand
∑
Abyssal Tripod Fish
Full Mathematical System • creatures
100%
Complete System of Equations
[Governing Law][Discrete Progression][Domain & Space][Parameter State]Fstilt=pseafloor−ppelvic,ppectoral(s,t)=proot+B(s)+[Acsin(ωt)0]stiltfin=quadCurve(pelvicroot,groundContact),preysensor=bezierCurve(pectoralroot,wavetips)x∈R2,t∈R+,ω∈[0,2π]λcurrentRate=1(Benthic Current Velocity),λstiltLength=1.2(Stilt Fin Height)
Fstilt=pseafloor−ppelvic,ppectoral(s,t)=proot+B(s)+[Acsin(ωt)0]
Computational Implementation (JavaScript Engine Equivalent)
stilt_fin = quadCurve(pelvic_root, groundContact), prey_sensor = bezierCurve(pectoral_root, wave_tips) Compact Formula
stilt_fin = quadCurve(pelvic_root, groundContact), prey_sensor = bezierCurve(pectoral_root, wave_tips) Mathematical Tags
#tripod-fish
#bathypterois
#abyss
#deep-sea
#creatures
#benthic
#seafloor
Author: Math Art Core Target: 60 FPS
Press ESC or F to exit