arcSegments = {
const linesPerSide = 3;
const arcPoints = 80;
const amplitude = 0.4;
const horizontalSpan = 6;
const x0 = positions[0][0];
const z0 = positions[0][2];
const x1 = positions[1][0];
const z1 = positions[1][2];
const c0 = concentration[0][t_index];
const c1 = concentration[1][t_index];
function fadeColor(base, intensity) {
const mix = (1 - intensity);
return `rgb(${base[0] + mix * (255 - base[0])},${base[1] + mix * (255 - base[1])},${base[2] + mix * (255 - base[2])})`;
}
const arcs = [];
for (let i = 1; i <= linesPerSide; i++) {
const arc = [];
const offset = -i * 0.6;
const fade = 1 - i / (linesPerSide + 1);
const color = fadeColor([255, 0, 0], fade * Math.abs(c1));
for (let j = 0; j < arcPoints; j++) {
const t = j / (arcPoints - 1);
const x = (t - 0.5) * horizontalSpan + x1;
const z = z1 + offset + Math.sin(x * Math.PI / 3) * amplitude;
arc.push({ x, z, color });
}
arcs.push(arc);
}
for (let i = 1; i <= linesPerSide; i++) {
const arc = [];
const offset = i * 0.6;
const fade = 1 - i / (linesPerSide + 1);
const color = fadeColor([0, 0, 255], fade * Math.abs(c0));
for (let j = 0; j < arcPoints; j++) {
const t = j / (arcPoints - 1);
const x = (t - 0.5) * horizontalSpan + x0;
const z = z0 + offset + Math.sin(x * Math.PI / 3) * amplitude;
arc.push({ x, z, color });
}
arcs.push(arc);
}
return arcs;
}