var funcs = { ['1 幂函数:y=x^a,a=2']: function (k) { const len = k===1? 30 : Math.round(k * 30 % 30) return [len, len * len]; }, ['2 指数函数:y=a^x,a=2']: function (k) { const len = k===1? 30 : Math.round(k * 30 % 30) const a = 2 let ret = a for (let i = 0; i < len; i++) { ret *= a } return [len, ret] }, ['3 对数函数:y=logax,a=10']: function (k) { const len = k===1? 31 : Math.round(k * 30 % 30) + 1 const a = 10 let ret = Math.log(len) return [len-1, ret] }, ['4.1 三角函数-正弦:y=sinx']: function (k) { const angle = k * 2 * Math.PI return [angle, Math.sin(angle)] }, ['4.2 三角函数-余弦:y=cosx']: function (k) { const angle = k * 2 * Math.PI return [angle, Math.cos(angle)] }, ['4.3 三角函数-正切:y=tanx']: function (k) { const angle = k * 2 * Math.PI return [angle, Math.tan(angle)] }, ['5.1 反三角函数-反正弦:y=arcsinx']: function (k) { const x = k * 2 - 1 return [x, Math.asin(x)] }, ['5.2 反三角函数-反余弦:y=arccosx']: function (k) { const x = k * 2 - 1 return [x, Math.acos(x)] }, ['5.3 反三角函数-反正切:y=arctanx']: function (k) { const x = k * 2 - 1 return [x, Math.atan(x)] }, ['6 常数:y=a']: function (k) { return 0.5 }, ['7.1 圆锥曲线-椭圆:x²/a²+y²/b²=1 (a=3,b=2)']: function (k) { const a = 3 const b = 2 const angle = k * 2 * Math.PI const x = a * Math.sin(angle) const y = b * Math.cos(angle) return [x, y] }, ['7.2 圆锥曲线-抛物线:y²=2px (p=1)']: function (k) { const len = k===1? 15 : Math.round(k * 30 % 30) - 15 const p = 1 const x = Math.abs(len) let y = Math.sqrt(2 * p * x) if (len < 0) { y = -y } return [x, y] }, ['7.3 圆锥曲线-双曲线:x²/a²-y²/b²=1 (a=2,b=3)']: function (k) { const a = 2 const b = 3 const angle = k * 2 * Math.PI const x = a / Math.cos(angle) const y = b * Math.tan(angle) return [x, y] } }; var N_POINT = 30; var grids = []; var xAxes = []; var yAxes = []; var series = []; var titles = []; var count = 0; echarts.util.each(funcs, function (func, name) { var data = []; let xAxis = { min: +Infinity, max: -Infinity } let yAxis = { min: +Infinity, max: -Infinity } for (var i = 0; i <= N_POINT; i++) { var x = i / N_POINT; var y = func(x); if (Object.prototype.toString.call(y) === '[object Array]') { data.push(y) if (y[0] < xAxis.min) { xAxis.min = y[0] } if (y[0] > xAxis.max) { xAxis.max = y[0] } if (y[1] < yAxis.min) { yAxis.min = y[1] } if (y[1] > yAxis.max) { yAxis.max = y[1] } } else { xAxis = {} yAxis = {} data.push([x, y]); } } // 等比显示 // if (xAxis.min < yAxis.min) { // yAxis.min = xAxis.min // } else { // xAxis.min = yAxis.min // } // if (xAxis.max < yAxis.max) { // xAxis.max = yAxis.max // } else { // yAxis.max = xAxis.max // } grids.push({ show: true, borderWidth: 0, backgroundColor: '#fff', shadowColor: 'rgba(0, 0, 0, 0.3)', shadowBlur: 2 }); xAxes.push({ type: 'value', show: false, min: 0, max: 1, gridIndex: count, ...xAxis }); yAxes.push({ type: 'value', show: false, min: -0.4, max: 1.4, gridIndex: count, ...yAxis }); series.push({ name: name, type: 'line', xAxisIndex: count, yAxisIndex: count, data: data, showSymbol: false, animationDuration: 1000 }); titles.push({ textAlign: 'center', text: name, textStyle: { fontSize: 12, fontWeight: 'normal' } }); count++; }); var rowNumber = Math.ceil(Math.sqrt(count)); echarts.util.each(grids, function (grid, idx) { grid.left = ((idx % rowNumber) / rowNumber * 100 + 0.5) + '%'; grid.top = (Math.floor(idx / rowNumber) / rowNumber * 100 + 0.5) + '%'; grid.width = (1 / rowNumber * 100 - 1) + '%'; grid.height = (1 / rowNumber * 100 - 1) + '%'; titles[idx].left = parseFloat(grid.left) + parseFloat(grid.width) / 2 + '%'; titles[idx].top = parseFloat(grid.top) + '%'; }); option = { title: titles.concat([{ text: '基本曲线方程 & 圆锥曲线', top: 'bottom', left: 'center' }]), grid: grids, xAxis: xAxes, yAxis: yAxes, series: series }; console.log(option)