Auxiliary figures:
// quadratic interpolation by the three values in 0, 0.5, and 1
function qerp(y1, y2, y3, x) {
    const a = 2.0*y1 - 4.0*y2 + 2.0*y3;
    const b = -3.0*y1 + 4.0*y2 - y3;
    const c = y1;
    return a*x*x + b*x + c;
}

function q_transform(points, x, y) {
    const x1 = qerp(points[0][0], points[1][0], points[2][0], x);
    const x2 = qerp(points[3][0], points[4][0], points[5][0], x);
    const x3 = qerp(points[6][0], points[7][0], points[8][0], x);
    const x_transformed = qerp(x1, x2, x3, y);
    const y1 = qerp(points[0][1], points[1][1], points[2][1], x);
    const y2 = qerp(points[3][1], points[4][1], points[5][1], x);
    const y3 = qerp(points[6][1], points[7][1], points[8][1], x);
    const y_transformed = qerp(y1, y2, y3, y);
    return [x_transformed, y_transformed];
}