其他分享
首页 > 其他分享> > Canvas:曲线的绘制和填充

Canvas:曲线的绘制和填充

作者:互联网

 曲线的绘制和填充

 语法

arc():在当前子路经添加一条弧线;

语法:context.arc(x,y,r,sAngle,eAngle,counterclockwise);

参数描述
x 圆的中心的 x 坐标。
y 圆的中心的 y 坐标。
r 圆的半径。
sAngle 起始角,以弧度计。(弧的圆形的三点钟位置是 0 度)。
eAngle 结束角,以弧度计。
counterclockwise 可选。规定应该逆时针还是顺时针绘图。False = 顺时针,true = 逆时针。

 

绘制弧形

var canvas = document.querySelector("#box")
var ctx = canvas.getContext("2d") //Context 上下文
let deg=Math.PI/180
ctx.arc(300,300,200,0*deg,270*deg,true)
ctx.stroke()

效果图:

 

绘制 钟表

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title></title>
    </head>
    <body>
        <style>
            #box {
                border: 1px gray solid;
            }
        </style>
        <canvas id="box" width="600" height="600">
        </canvas>
        <script>
            var canvas = document.querySelector("#box")
            var ctx = canvas.getContext("2d")
            var deg = Math.PI / 180//计算度数用作单位
            function biaopan(){
                var r=200//半径
                var y1=300//中心x坐标
                var x1=300//中心y坐标
                var kedu=10//刻度长度
                ctx.arc(x1, y1, r, 0, 360 * deg)//绘制一个完整的园
                var startAnge=6;//一个刻度有6°
                for(let i=0;i<60;i++){
                    let a;//大刻度
                    if(i%5){a=kedu}//如果刻度被5整除,那么变为大刻度
                    else{a=kedu*2}                
                    var y2=y1+r*Math.sin(i*startAnge*deg)//半径×刻度夹角6°+中心y坐标=刻度在圆上的y坐标
                    var x2=x1+r*Math.cos(i*startAnge*deg)//半径×刻度夹角6°+中心x坐标=刻度在圆上的x坐标
                    var y3=y1+(r-a)*Math.sin(i*startAnge*deg)//半径-大/刻度的长度=刻度向内端点的y坐标
                    var x3=x1+(r-a)*Math.cos(i*startAnge*deg)//半径-大/刻度的长度=刻度向内端点的x坐标
                    ctx.moveTo(x2,y2)//连接刻度的首尾(首)
                    ctx.lineTo(x3,y3)//(尾)
                }            
                ctx.stroke()
            }
            
            function biaozhen(){
                var sh=160//秒长度
                var hh=100//时
                var mh=140//分
                var s=new Date().getSeconds()
                var h = new Date().getHours()
                var m = new Date().getMinutes()

                //秒针
                ctx.moveTo(300,300)
                var y4=300+sh*Math.sin((s*6-90)*deg)
                var x4=300+sh*Math.cos((s*6-90)*deg)
                ctx.lineTo(x4,y4)

                //时针
                ctx.moveTo(300,300)
                //var y5=300+hh*Math.sin((s*0.5/60-90)*deg)
                //var x5=300+hh*Math.cos((s*0.5/60-90)*deg)
                var y5=300+hh*Math.sin((m/60-90)*deg)
                var x5=300+hh*Math.cos((m/60-90)*deg)
                ctx.lineTo(x5,y5)
                
                
                //分针
                ctx.moveTo(300,300)
                var y6=300+mh*Math.sin((m*6-90)*deg)
                var x6=300+mh*Math.cos((m*6-90)*deg)
                ctx.lineTo(x6,y6)
                ctx.stroke()
            }
            
            setInterval(()=>{
                canvas.width=canvas.width
                biaopan()
                biaozhen()
            },1000)
            
            
            
        </script>
    </body>
</html>

 

 

饼状图

            var canvas = document.querySelector("#box")
            var ctx = canvas.getContext("2d")
            var arr = [{
                name: "衣服",
                money: 8000
            }, {
                name: "car",
                money: 2000
            }, {
                name: "food",
                money: 7000
            }, {
                name: "cash",
                money: 1000
            },{
                name: "cash2",
                money: 5000
            },{
                name: "cash3",
                money: 5400
            }]
            arr.total=0;
            //求总金额 
            for(var i=0;i<arr.length;i++){
                arr.total=arr.total+arr[i].money
            }
            
            
            var start=0;
            var deg=Math.PI/180
            arr.forEach(el=>{
                ctx.beginPath()
                var r=parseInt(Math.random()*255)
                var g=parseInt(Math.random()*255)
                var b=parseInt(Math.random()*255)
                ctx.fillStyle=`rgb(${r},${g},${b})`    
                var n=(el.money/arr.total)*360//每一类与总数的比例
                ctx.arc(300,300,200,start*deg,(start+n)*deg)
                ctx.lineTo(300,300)
                start=start+n
                ctx.fill()
                ctx.stroke()
            })
            

 

 

 

标签:Canvas,填充,300,money,ctx,canvas,var,绘制,deg
来源: https://www.cnblogs.com/LIXI-/p/16511157.html