2024年前端最新html5基础入门教程之canvas绘制图形,被逼无奈开始狂啃底层技术

其实前端开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

这里再分享一个复习的路线:(以下体系的复习资料是我从各路大佬收集整理好的)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

《前端开发四大模块核心知识笔记》

最后,说个题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。

我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。

if(canvas.getContext){

var cxt=canvas.getContext(‘2d’);

cxt.beginPath();

cxt.arc(75,75,50,0,Math.PI*2,true);

cxt.moveTo(100,75);

cxt.arc(75,75,35,0,Math.PI,false);

cxt.moveTo(65,65);

cxt.arc(60,65,5,0,Math.PI*2,true);

cxt.moveTo(95,65);

cxt.arc(90,65,5,0,Math.PI*2,true);

cxt.stroke();

}

}

绘制各种线条

用lineTo()方法来画直线。

lineTo()方法接受终点的坐标(x,y)作为参数。起始坐标取决于前一路径的终点坐标。当然,起始坐标也可以通过前面介绍的moveTo()方法来设置。

绘制线条示例:

lineTo

function draw(){

var canvas=document.getElementById(‘test_lineTo’);

if(canvas.getContext){

var cxt=canvas.getContext(‘2d’);

cxt.beginPath();

cxt.moveTo(25,25);

cxt.lineTo(105,25);

cxt.lineTo(25,105);

cxt.fill(); //fill填充路径,会自动闭合路径。

cxt.beginPath();

cxt.moveTo(125,125);

cxt.lineTo(125,45);

cxt.lineTo(45,125);

cxt.closePath();

cxt.stroke(); //stroke不会闭合路径,所以再描边先要先闭合路径

}

}

上面的例子利用lineTo()方法绘制了两个三角形。从这个例子也可以看出fill和stroke的区别。

绘制弧线

用arc方法来绘制弧线或圆。

arc(x, y, radius, startAngle, endAngle, anticlockwise)

该方法接受五个参数。其中,x,y是圆心坐标;radius是圆的半径;startAngle和endAngle分别是起末弧度(以x轴为基准);anticlockwise为true表示逆时针,反之为顺时针。

这边有一点是需要注意的,就是arc方法里的角度是以弧度为计算单位的,不是度。这么说吧,通常我们说的180度,就等价于PI。两者的计算公式是这样的:radians=(Math.PI/180)*degrees.(其中,radians代表弧度,degrees代表度)

绘制圆弧示例:

arc

function draw(){

var canvas=document.getElementById(‘test_arc’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

for(var i=0; i<4; i++){ //输出4行4列的矩阵

for(var j=0; j<4; j++){

ctx.beginPath();

var x=25+j*50; //圆心x坐标

var y=25+i*50; //圆心y坐标

var radius=20; //半径

var startAngle=0; //起始弧度

var endAngle=Math.PI/2+(Math.PI*j)/2; //结束弧度

var anticlockwise=i%2==0?false:true; //奇数行顺时针;偶数行逆时针。

ctx.arc(x,y,radius,startAngle,endAngle,anticlockwise); //循环绘制圆/圆弧

if(i>1){

ctx.fill(); //3,4行填充图案

}else{

ctx.stroke(); //1,2行仅勾勒路径

}

}

}

}

}

上面这个例子,用双层循环输出了4*4的圆弧矩阵。

贝塞尔和二次方曲线

最后,要说的是贝赛尔曲线,它可以是二次和三次的形式,一般用于绘制复杂而有规律的形状。

二次贝赛尔曲线:

quadraticCurveTo(cpx, cpy, x, y)

其中,cpx指控制点的x坐标;cpy指控制点的y坐标;x指结束点的x坐标;y指结束点的y坐标。

quadraticCurveTo

由上面的参数可以看出,二次贝赛尔曲线需要两个点:第一个点用于二次贝赛尔计算中的控制点,第二个点是曲线的结束点。曲线的开始点是当前路径中最后一个点。如果路径不存在,可使用beginPath()和moveTo()方法来定义。

一个简单的二次贝赛尔曲线实例:

quadraticCurveTo

function draw(){

var canvas=document.getElementById(‘test_quadraticCurveTo’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

ctx.beginPath();

ctx.moveTo(75,25);

ctx.quadraticCurveTo(25,25,25,62);

ctx.quadraticCurveTo(25,100,50,100);

ctx.quadraticCurveTo(50,120,30,125);

ctx.quadraticCurveTo(60,120,65,100);

ctx.quadraticCurveTo(125,100,125,62);

ctx.quadraticCurveTo(125,25,75,25);

ctx.stroke();

}

}

三次贝赛尔曲线:

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)

其中,cp1x为第一个控制点的x坐标;cp1y为第一个控制点的y坐标;cp2x为第二个控制点的x坐标;cp2y为第二个控制点的y坐标;x为结束点的x坐标;y为结束点的y坐标。

bezierCurveTo

由上面可以看出,三次贝赛尔曲线需要三个点。前两个点用于三次贝赛尔计算中的控制点,第三个点是曲线结束的控制点。同上,曲线的开始点是当前路径中最后一个点。如果路径不存在,可使用beginPath()和moveTo()方法来定义。

新建一个前端学习qun438905713,在群里大多数都是零基础学习者,大家相互帮助,相互解答,并且还准备很多学习资料,欢迎零基础的小伙伴来一起交流。

使用二次方和三次方的贝塞尔曲线是相当有挑战的,因为不像在矢量绘图软件 Adobe Illustrator 里那样有即时的视觉反馈。因为用它来画复杂图形是比较麻烦的。但如果你有时间,并且最重要是有耐心,再复杂的图形都可以绘制出来的。下面我们来画一个简单而又规律的图形。

一个简单的三次贝赛尔曲线实例:

bazierCurveTo

function draw(){

var canvas=document.getElementById(‘test_quadraticCurveTo’);

if(canvas.getContext){

var ctx=canvas.getContext(‘2d’);

ctx.beginPath();

ctx.moveTo(75,40);

ctx.bezierCurveTo(75,37,70,25,50,25);

ctx.bezierCurveTo(20,25,20,62.5,20,62);

ctx.bezierCurveTo(20,80,40,102,75,120);

ctx.bezierCurveTo(110,102,130,80,130,62);

ctx.bezierCurveTo(130,62.5,130,25,100,25);

ctx.bezierCurveTo(85,25,75,37,75,40);
ctx.fill();
}
}

canvas应用图像

最后

全网独播-价值千万金融项目前端架构实战

从两道网易面试题-分析JavaScript底层机制

RESTful架构在Nodejs下的最佳实践

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

一线互联网企业如何初始化项目-做一个自己的vue-cli

思维无价,看我用Nodejs实现MVC

代码优雅的秘诀-用观察者模式深度解耦模块

前端高级实战,如何封装属于自己的JS库

VUE组件库级组件封装-高复用弹窗组件

  • 25
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值