Skip to content
html
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    html,
    body {
      width: 100vw;
      display: flex;
      flex-direction: column;
      justify-content: center;
      align-items: center;
    }
  </style>
</head>

<body>
  <canvas id="canvas"></canvas>
  <canvas id="canvas2"></canvas>
  <img src="./imgs/arc-and-arc-to.png" alt="">

  <script>
    const canvas = document.querySelector('#canvas')
    const context = canvas.getContext('2d')

    canvas.style.background = '#ddd'

    /**
     * arc 绘制圆弧路径 
     * 
     * @param {number} x 圆心的 x 坐标
     * @param {number} y 圆心的 y 坐标
     * @param {number} radius 半径
     * @param {number} startAngle 起始角度
     * @param {number} endAngle 结束角度
     * @param {boolean=false} anticlockwise 是否逆时针方向绘制
     */
    context.beginPath()
    // 加入只包含一个点的子路径
    context.moveTo(10, 10)
    // 不清除子路径,会将子路径的终点和圆弧的起点连接起来
    context.beginPath()
    context.arc(150, 75, 50, 0, Math.PI)
    context.stroke()

    const canvas2 = document.querySelector('#canvas2')
    const context2 = canvas2.getContext('2d')

    canvas2.style.background = '#eee'
    
    context2.setLineDash([])
    context2.beginPath();
    context2.moveTo(150, 20);
    /**
     * arcTo 绘制圆弧路径,使用当前的描点 (前一个 moveTo 或 lineTo 等函数的止点)。
     * 根据当前描点与给定的控制点 1 连接的直线,和控制点 1 与控制点 2 连接的直线,
     * 作为使用指定半径的圆的切线,画出两条切线之间的弧线路径。
     * 
     * @param {number} x1 第一个控制点的 x 坐标
     * @param {number} y1 第一个控制点的 y 坐标
     * @param {number} x2 第二个控制点的 x 坐标
     * @param {number} y2 第二个控制点的 y 坐标
     * @param {number} radius 半径
     */
    context2.arcTo(150, 100, 50, 20, 30);
    context2.stroke();

    context2.fillStyle = 'blue';
    // base point
    context2.fillRect(150, 20, 10, 10);

    context2.fillStyle = 'red';
    // control point one
    context2.fillRect(150, 100, 10, 10);
    // control point two
    context2.fillRect(50, 20, 10, 10);
    //
    context2.setLineDash([5, 5])
    context2.moveTo(150, 20);
    context2.lineTo(150, 100);
    context2.lineTo(50, 20);
    context2.stroke();
    context2.beginPath();
    context2.arc(120, 38, 30, 0, 2 * Math.PI);
    context2.stroke();
  </script>
</body>

</html>