HTML5 Canvas学习笔记之详解弧线的绘制

本文深入探讨HTML5 Canvas的基本属性及其在绘制线条、矩形、圆弧等方面的实践,包括弧线绘制、圆角矩形绘制及贝塞尔曲线的应用,并通过代码示例展示了绘制星空效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Canvas翻译过来呢就是画布
所以Canvas的作用就是把网页当成一张画布,在其中画画——说实话H5中最令我感兴趣的就是Canvas了。

在html中引入canvas

<canvas id="canvas" style="height:100%">
    当前浏览器不支持Canvas,请更换浏览器后再试
</canvas>

绘制一条线、矩形与圆弧

这里先说Canvas的几个属性:

  • 绘制一条线
  • 绘制矩形
  • 绘制圆
window.onload=function(){
    var canvas=document.getElementById('canvas');
    canvas.width=800;
    canvas.height=800;
    var context=canvas.getContext('2d');
    context.beginPath();
    context.moveTo(100,100);//从(100,100)点到(700,700)划一根直线
    context.lineTo(700,700);
    context.lineWidth=5; //指定样式,直线宽度为5,直线的颜色为红色
    context.strokeStyle="red";
    context.stroke();
    context.closePath();//必须closepath,不然下面会从这儿开始
   //绘制矩形
    context.beginPath();
    context.moveTo(100,100);
    context.lineTo(700,700);
    context.lineTo(100,700);
    context.lineTo(100,100);
    context.lineWidth=5;
    context.strokeStyle="blue";
    context.stroke();
    context.fillStyle="grey";//设置填充样式
    context.fill();
    context.closePath();
     //绘制圆弧
    context.beginPath();
    context.arc(300, 300, 200, 0, 1.5*Math.PI, false);
    //acr()的参数为(X,Y,R,)
    context.lineWidth=5;
    context.strokeStyle="#005";
    context.stroke();
    context.closePath();
}

效果图:
这里写图片描述

弧线的绘制

  • arc()
  • arcTo()
acr() ,圆弧和圆角矩形

context.arc(centerX,centerY,radius,startingAngle,endingAngle,anticlockwise=false)
弧度永远是从顺时针开始0,0.5pi ,1.0pi, 1.5pi, 2pi,不管anticlockwise等于多少,这些值永远不变。

window.onload=function(){
    var canvas=document.getElementById('canvas');
    canvas.width=800;
    canvas.height=800;
    var context=canvas.getContext('2d');

    context.beginPath();
    context.arc(300, 300,100, 0, 1.5*Math.PI, false);
    context.lineWidth=5;
    context.strokeStyle="#005";
    context.stroke();
    context.closePath();

    context.beginPath();
    context.arc(600, 300, 100, 0, 1.5*Math.PI, true);//逆时针
    context.lineWidth=5;
    context.strokeStyle="#005";
    context.stroke();
    context.closePath();
}

运行截图
这里写图片描述
由此可见,1.5pi永远是上方的点

利用圆弧绘制圆角矩形

function drawRoundRect(cxt,x,y,width,height,radius){
  cxt.save()
  cxt.translate(x,y)
  pathRoundRect(cxt,width,height,radius)
  cxt.stroke()
  cxt.restore()
}
function pathRoundRect(cxt,width,height,radius){
  cxt.beginPath()
  cxt.arc(width-radius,height-radius,radius,0,Math.PI/2)
  cxt.lineTo(radius,height)
  cxt.arc(radius,height-radius,radius,Math.PI/2,Math.PI)
  cxt.lineTo(0,radius)
  cxt.arc(radius,radius,radius,Math.PI,Math.PI*3/2)
  cxt.lineTo(width-radius,0)
  cxt.arc(width-radius,radius,radius,Math.PI*3/2,Math.PI*2)
  cxt.closePath()
}

这里写图片描述

arcTo()

context.arcTo(x1,y1,x2,y2,radius)
利用控制点(x1,y1),(x2,y2)。起始点不一定是(x0,y0),终点也不一定是(x2,y2)

window.onload=function(){
    var canvas=document.getElementById('canvas');
    canvas.width=800;
    canvas.height=800;
    var context=canvas.getContext('2d');
    context.beginPath()
    context.moveTo(150,150)
    context.arcTo(600,150,650,650,300)
    context.lineWidth=5
    context.strokeStyle='red'
    context.stroke()

    context.beginPath()
    context.moveTo(150,150)
    context.lineTo(650,150)
    context.lineTo(650,650)
    context.lineWidth=5
    context.strokeStyle='gray'
    context.stroke()

}

这里写图片描述
可以尝试改变radius的值
radius=600
这里写图片描述

贝塞尔Bezier二次曲线

context.moveTo(x0,y0)
context.quadraticCurveTo(x1,y1,x2,y2)
指定起始点(x0,y0),终止点(x2,y2),控制点(x1,y1)
贝塞尔曲线和arcTo的含义其实类似,但是这里的起始点和终止点就是真正的起始点和终止点,所以画出的并不是真正的圆弧,而是曲线。
可以上http://tinyurl.com/html5quadratic
上查看,这里形象的展示了quadratic的用法

贝塞尔三次曲线

拥有两个控制点,可以绘制花瓣、波浪效果等
context.moveTo(x0,y0)
context.bezierCurveTo(x1,y1,x2,y2,x3,y3)
可以上查看演示
http://blogs.sitepointstatic.com/examples/tech/canvas-curves/bezier-curve.html
这里写图片描述

该文章是学习了慕课网上Canvas绘图详解而总结的学习笔记
http://www.imooc.com/learn/185
感谢老师!

我的代码在https://github.com/daisyHawen/html5-canvas-stars.git
在其中展示了如何使用这些canvas基本属性,同时展示了一个实现绘制一片星空效果:
这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值