按照搜寻结果,我们一开始可能很直觉的会想到使用 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();
};
酷!成功啦!!
>>: Day23 - 有了 CI/CD Pipeline ,还需要合适的 Git Workflow
什麽是模板语法? 模板语法是逻辑与页面之间沟通的媒介,Vue.js 使用了基於HTML 的模板语法,...
传统的安全性资讯与事件管理(SIEM)系统通常需要很长的时间 来安装及设定。这类系统在设计时也不一定...
透过继承,我们可以从原有的类别衍生出新的类别,原有的类别称为父类别,而衍生出的类别称为子类别。透过这...
那今天,我们来讲一下在 VyOS 上设定 GRE Tunnel 的指令 其实跟昨天的大同小异。 se...
承前文,在函式中的结构中,包括变数。使用变数,就须宣告,因此宣告所及的范围(Scope)成为函式、乃...