desmos.api

https://www.desmos.com/api/v1.9/docs/index.html?lang=zh-CN

可修改的空白图表

使用如下代码引用

<script src="https://www.desmos.com/api/v1.9/calculator.js?apiKey=dcb31709b452b1cf9dc26972add0fda6"></script>

<div id="calculator" style="width: 600px; height: 400px;"></div>

<script>
  var elt = document.getElementById('calculator');
  var calculator = Desmos.GraphingCalculator(elt);
</script>

其中 dcb31709b452b1cf9dc26972add0fda6 为 Default API

自定义内容引用

首先你要有一个账号,并且在 Desmos 里绘制完成图表并保存

方案一:将上面 Default API 改成自己内容的 API

方案二:使用网页内置的 share as html

此方法使用的 iframe 与博客园不兼容,可能无法正常显示,API 方法需要向 desmos 申请 API,总之不推荐这种方法

此方法引入的图表内容不可修改

内容绘制

在上面提到的引用接口中,实际上可以增加内容

<script src="https://www.desmos.com/api/v1.9/calculator.js?apiKey=dcb31709b452b1cf9dc26972add0fda6"></script>

<div id="calculator" style="width: 600px; height: 400px;"></div>

<script>
  var elt = document.getElementById('calculator');
  var calculator = Desmos.GraphingCalculator(elt);
  /*在此处增加内容*/
</script>

增加函数

函数直接以调用函数的形式定义,你可以通过调用 calculator.setExpression 来新建函数

对于函数的描述使用 Latex

譬如

calculator.setExpression({id:'graph1', latex:'y=x^2'});
calculator.setExpressions([
    {id:'1', latex:'x^2+y^2<25'}
]);
calculator.setExpressions([
    {id:'1', latex:'a=1'},
    {id:'2', latex:'b=1'},
    {id:'3', latex:'y=b\\sin(x+a)', color: Desmos.Colors.GREEN}
 ]);

这里的 Latex 可以字符串拼接

calculator.setExpression({id:'graph1', latex:'y='+'1'});

全屏

通过定义并传入 options 来实现全屏

var elt = document.getElementById('calculator');
var options = { border: false };
var calculator = Desmos.GraphingCalculator(elt, options);

鼠标控制变量

通过定义 updateVariable 并传入 evt(鼠标信息)来实现

evt.pageX evt.pageY 分别定义了鼠标的横纵坐标(0.0-100.0)

注意这里用同一个 ExpressionId 来重定义一个表达式

<script>
      var elt = document.getElementById('calculator');
      var calculator = Desmos.GraphingCalculator(elt);
      calculator.setExpressions([
        {id:'1', latex:'a=1'},
        {id:'2', latex:'b=1'},
        {id:'3', latex:'y=b\\sin(x+a)', color: Desmos.Colors.GREEN}
      ]);
      var updateVariable = function (evt) {
        calculator.setExpression({id:'1', latex:'a='+(evt.pageX/100)});
        calculator.setExpression({id:'2', latex:'b='+(evt.pageY/100)});
      };
      // Register the callback as a listener on mousemove, and use it to
      // update the values of a and b.
      document.addEventListener('mousemove', updateVariable, true);
</script>

滑块

只需要传入一个 sliderBounds 即可将表达式变成滑块类型

注意能变成滑块类型的一定是形如 x=c 的赋值表达式

<script>
    var elt = document.getElementById('calculator');
    var calculator = Desmos.GraphingCalculator(elt);
    calculator.setExpressions([
      {id:'graph1', latex:'y=ax^2'},
      {id:'slider1', latex:'a=2', sliderBounds: {min: -3, max: 8, step: 1}}
    ]);
  </script>

点集/函数表格

使用 type='table' 来定义一个函数表格

DragModes 控制能否拖动

一般也用不太到

<script>
    var elt = document.getElementById('calculator');
    var calculator = Desmos.GraphingCalculator(elt);
    calculator.setExpression({
      type: 'table',
      columns: [
        {
          latex: 'x',
          values: ['1', '2', '3', '4', '5']
        },
        {
          latex: 'y',
          values: ['1', '4', '9', '16', '25'],
          dragMode: Desmos.DragModes.XY
        },
        {
          latex: 'x^2',
          color: Desmos.Colors.BLUE,
          columnMode: Desmos.ColumnModes.LINES
        }
      ]
    });
  </script>

选点

<script>
    var elt = document.getElementById('calculator');
    var calculator = Desmos.GraphingCalculator(elt);

    var xvalues = ['1'];
    var yvalues = ['1'];

    function updateTable () {
      calculator.setExpression({
        id: 'table1',
        type: 'table',
        columns: [
          {latex: 'x', values: xvalues},
          {latex: 'y', values: yvalues}
        ]
      });
    }

    updateTable();

    function inRectangle(point, rect) {
      return (
        point.x >= rect.left &&
        point.x <= rect.right &&
        point.y <= rect.top &&
        point.y >= rect.bottom
      )
    }

    elt.addEventListener('click', function (evt) {
      var rect = elt.getBoundingClientRect();
      var x = evt.clientX - rect.left;
      var y = evt.clientY - rect.top;
      // Note, pixelsToMath expects x and y to be referenced to the top left of
      // the calculator's parent container.
      var mathCoordinates = calculator.pixelsToMath({x: x, y: y});


      if (!inRectangle(mathCoordinates, calculator.graphpaperBounds.mathCoordinates)) return;

      xvalues.push(mathCoordinates.x.toPrecision(2));
      yvalues.push(mathCoordinates.y.toPrecision(2));

      updateTable();
    });
  </script>

其他注意事项

  • 为了防止渲染出错,你必须在每个表格前都声明如下两行(参数可以自己调):
<script src="https://www.desmos.com/api/v1.9/calculator.js?apiKey=dcb31709b452b1cf9dc26972add0fda6"></script>
<div id="calculator" style="width: 600px; height: 400px;"></div>
  • 一般一篇文章最多一个图像,否则可能会出现问题

效果展示

Display

posted @ 2024-10-07 07:08  HaneDaniko  阅读(45)  评论(1编辑  收藏  举报