function drawScalarProduct(ctx, vec1Vals, rect1, vec2Vals, rect2, time, resWidth, resLabel) {
const rectDistance = rect2[1] - rect1[1];
const delta = rectDistance / 2 - rect1[3] * 0.5;
if (time <= 1) {
time = smooth(time);
let [x0a, y0a, wa, ha] = rect1;
let [x0b, y0b, wb, hb] = rect2;
y0a += time * 0;
y0b -= time * delta * 2;
ha *= (1 - time);
hb *= (1 - time);
drawVector(ctx, vec1Vals, [x0a, y0a, wa, ha], '', 1);
drawVector(ctx, vec2Vals, [x0b, y0b, wb, hb], '', 1);
const alpha = 1;
ctx.lineWidth = 4;
for (let i=0; i<vec1Vals.length; i++) {
const relI = i / vec1Vals.length;
const scalar = vec1Vals[i] * vec2Vals[i];
if (scalar < 0) continue;
const alpha = clamp(scalar ** 0.5 * (time * 2 + scalar - 1));
const color = getValueColor(mix(vec1Vals[i] + vec2Vals[i] / 2, 0, time));
ctx.strokeStyle = rgba(...color, alpha);
ctx.beginPath();
ctx.moveTo(x0a + wa * relI, y0a + ha);
ctx.lineTo(x0b + wb * relI, y0b);
ctx.stroke();
}
} else {
time = smooth(time - 1);
let [x0a, y0a, wa, ha] = rect1;
let [x0b, y0b, wb, hb] = rect2;
y0a += delta * 0;
y0b -= delta * 2;
const deltaW = wa / 2 * time * (1 - resWidth);
x0a += deltaW * 0;
x0b += deltaW * 0;
wa -= deltaW * 2;
wb -= deltaW * 2;
ha = 0;
hb = 0;
drawVector(ctx, vec1Vals, [x0a, y0a, wa, ha], '', 1);
drawVector(ctx, vec2Vals, [x0b, y0b, wb, hb], resLabel, 1);
ctx.lineWidth = 4;
for (let i=0; i<vec1Vals.length; i++) {
const relI = i / vec1Vals.length;
const scalar = vec1Vals[i] * vec2Vals[i];
const alpha = scalar < 0 ? mix(0, 1, (time - 0.9) * 10) : mix(scalar ** 0.5 * (scalar + 1), 1, time);
const color = getValueColor(0);
ctx.strokeStyle = rgba(...color, alpha);
ctx.beginPath();
ctx.moveTo(x0a + wa * relI, y0a + ha);
ctx.lineTo(x0b + wb * relI, y0b);
ctx.stroke();
}
}
}