Day 8 - 用 canvas 复刻 小画家 绘制圆形/椭圆形

圆形

尝试ellipse

按照搜寻结果,我们一开始可能很直觉的会想到使用 ellipse

ellipse 是 Canvas 2D API 添加椭圆路径的方法。椭圆的圆心在(x,y)位置,半径分别是radiusX 和 radiusY ,按照anticlockwise(默认顺时针)指定的方向,从 startAngle 开始绘制,到 endAngle 结束。

void ctx.ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);

然後我们就按照文档,将内容都带上

  case "ellipse":
      clearCanvas();
      restore();
      ctx.strokeStyle = activeColor;
      ctx.ellipse(
        initialPoint.x,
        initialPoint.y,
        Math.abs(width),
        Math.abs(height),
        0,
        2 * Math.PI,
        false
      );
      ctx.stroke();
  break;



看来不是我们要的效果,再试试别的参数

贝兹曲线

bezierCurveTo 是 Canvas 2D API 绘制三次贝赛尔曲线路径的方法。该方法需要三个点。第一、第二个点是控制点,第三个点是结束点。起始点是当前路径的最後一个点,绘制贝赛尔曲线前,可以通过调用 moveTo() 进行修改

void ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);

虽然我们对贝兹曲线不熟,但根据文档,似乎可以尝试看看带入我们所拥有的值。

思考

贝兹曲线是拿来绘制曲线的,一般来说,椭圆与圆形的构成就是利用两个弧线,所以我们是不是只要拼接出两个半圆弧线,就可以完成一个圆?
看看程序码怎麽写:

...
case "ellipse":
  clearCanvas();
  restore();
  ctx.strokeStyle = activeColor;
  drawOval(
    ctx,
    initialPoint?.x,
    initialPoint?.y,
    point?.x,
    point?.y
  );
break;
...
          
          
/** 绘制椭圆 **/
const drawOval = (
  ctx: any,
  startX: number,
  startY: number,
  x: number,
  y: number
) => {
  ctx.beginPath();
  ctx.moveTo(startX, startY + (y - startY) / 2);
  ctx.bezierCurveTo(startX, startY, x, startY, x, startY + (y - startY) / 2);
  ctx.bezierCurveTo(x, y, startX, y, startX, startY + (y - startY) / 2);
  ctx.closePath();
  ctx.stroke();
};


酷!成功啦!!


<<:  Day 8 - 初探Vue Component

>>:  Day23 - 有了 CI/CD Pipeline ,还需要合适的 Git Workflow

Day10 Vue模板语法 & V-text、V-html、V-once介绍

什麽是模板语法? 模板语法是逻辑与页面之间沟通的媒介,Vue.js 使用了基於HTML 的模板语法,...

Day21:今天来聊一下Azure Sentinel 介绍

传统的安全性资讯与事件管理(SIEM)系统通常需要很长的时间 来安装及设定。这类系统在设计时也不一定...

DAY18-JAVA的抽象类别(1)

透过继承,我们可以从原有的类别衍生出新的类别,原有的类别称为父类别,而衍生出的类别称为子类别。透过这...

Day 29 - 在 VyOS 上设定 GRE

那今天,我们来讲一下在 VyOS 上设定 GRE Tunnel 的指令 其实跟昨天的大同小异。 se...

Day-12 函式与变数

承前文,在函式中的结构中,包括变数。使用变数,就须宣告,因此宣告所及的范围(Scope)成为函式、乃...