canvas 画椭圆

圆的标准方程(x-x0)²+(y-y0)²=r²中,有三个参数x0、y0、r,即圆心坐标为(x0, y0), 半径为 r
圆的参数方程 x = x0 + r * cosθ, y = y0 + r * sinθ; (θ 为参数)

canvas 画圆, 有api 可以直接调用:

<!DOCTYPE html>
<html>
    <body>
        <canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
        Your browser does not support the HTML5 canvas tag.
        </canvas>

        <script>
            var c=document.getElementById("myCanvas");
            var ctx=c.getContext("2d");
            ctx.beginPath();
            ctx.arc(100,75,50,0,2*Math.PI);
            ctx.stroke();
        </script> 
    </body>
</html>

椭圆的标准方程共分2种情况:
当焦点在x轴时,椭圆的标准方程是:x^2/a^2+y^2/b^2=1,(a>b>0);
当焦点在y轴时,椭圆的标准方程是:y^2/a^2+x^2/b^2=1,(a>b>0);
a代表长半轴的长度(长轴的一半),b代表短半轴的长度(短轴的一半)

椭圆的参数方程:
x = x0 + a * cosθ;
y = y0 + b * sinθ;
圆的中心点(x0, y0);

有2种方式

<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <title>Test</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <style>
          body{
            margin: 0;
            padding: 0;
          }
        </style>
    </head>
    <body>
      <canvas id="canvas" width="400" height="400" style='position:relative; z-index:2;'></canvas>

      <script type="text/javascript">
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        ctx.fillStyle="blue";
        drawEllipse(ctx, 200, 250, 100, 50);
        
        function drawEllipse(context, x, y, a, b) {
            var step = (a > b) ? 1 / a : 1 / b;
            context.beginPath();
            // 先移动到这点
            context.moveTo(x + a, y);
            for(var i = 0; i < 2 * Math.PI; i += step) {
                // 这里根据 椭圆的参数方程来移动
                context.lineTo(x + a * Math.cos(i), y + b * Math.sin(i));
            }
            context.closePath();
            context.fill();
        }
      </script>
    </body>
</html>
<!DOCTYPE HTML>
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <title>Test</title>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
        <style>
          body{
            margin: 0;
            padding: 0;
          }
        </style>
    </head>
    <body>
      <canvas id="canvas" width="400" height="400" style='position:relative; z-index:2;'></canvas>

      <script type="text/javascript">
        var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
        ctx.fillStyle="blue";
        drawEllipse(ctx, 200, 250, 100, 50);
        
        function drawEllipse(context, x, y, a, b){
          context.save();
          // r 取大值
          var r = (a > b) ? a : b;
          var ratioX = a / r;
          var ratioY = b / r;
          // 把椭圆的进行压缩
          context.scale(ratioX, ratioY);
          context.beginPath();
          // 椭圆压缩了, 相应的 圆点坐标也要变化
          context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math.PI, false);
          context.closePath();
          context.restore();
          context.fill();
        };
      </script>
    </body>
</html>
原文地址:https://www.cnblogs.com/zhengming2016/p/6763666.html