{
const w = width / 2;
const h = width / 2;
const padding = 30;
const pointNum = 500;
let svg = d3.select(DOM.svg(w, h));
let xScale = d3.scaleLinear([0, 1], [padding, w - padding]);
let yScale = d3.scaleLinear([1, 0], [padding, h - padding]);
let clipPath = svg
.append('clipPath')
.attr('id', 'chart-area')
.append('rect')
.attr('x', padding)
.attr('y', padding)
.attr('width', w - 2 * padding)
.attr('height', h - 2 * padding);
const curves = [];
for (let i = 0; i <= n; ++i) {
const bi_4 = [];
for (let t = 0; t <= pointNum; t++) {
bi_4.push([t / pointNum, bernstein_poly(i, n, t / pointNum)]);
}
curves.push(bi_4);
}
let line_log = d3
.line()
.x(d => xScale(d[0]))
.y(d => yScale(d[1]));
for (let curve of curves) {
svg
.append('path')
.datum(curve)
.attr("clip-path", "url(#chart-area)")
.attr('fill', 'none')
.attr('stroke', randomColor())
.attr('stroke-width', 2)
.attr('d', line_log);
}
let xAxis = d3.axisBottom(xScale);
let yAxis = d3.axisLeft(yScale);
svg
.append('g')
.attr('transform', `translate(0,${h - padding})`)
.call(xAxis);
svg
.append('g')
.attr('transform', `translate(${padding},0)`)
.call(yAxis);
return svg.node();
}