function parametric_plot2d(f, [a, b], [c, d], opts = {}) {
let {
Nu = 100,
nu = 10,
Nv = 100,
nv = 10,
width = 800,
height = "auto",
pad = 20,
fill = d3.schemeCategory10[9],
fillOpacity = 1,
xticks = 5,
xtickValues,
xtickFormat,
xtickSize = 6,
yticks = 5,
ytickValues,
ytickFormat,
ytickSize = 6
} = opts;
let Du = (b - a) / Nu;
let Dv = (d - c) / Nv;
let u_cut = Math.floor(Nu / nu);
let v_cut = Math.floor(Nv / nv);
let data = [];
let k = 0;
let quads = [];
let lines = [];
let boundary = [];
for (let i = 0; i <= Nu; i++) {
for (let j = 0; j <= Nv; j++) {
let u = a + i * Du;
let v = c + j * Dv;
data.push(f(u, v));