美文网首页Web
JS中canvas画布绘制

JS中canvas画布绘制

作者: 追逐_chase | 来源:发表于2019-09-26 13:34 被阅读0次
web.jpeg

canvas的一些注意点

  • 有一个默认的宽度和高度 300 *150
  • 不要通过css控制 他的宽高 会导致内部的图片被拉伸
  • 重新设置标签的宽高属性会让画布清除所有的内容
  • 可以给画布设置背景颜色
1.绘制直线
<body>
    <!-- 
        1.有一个默认的宽度和高度 300 *150
        2.不要有css控制 他的宽高 会导致内部的图片被拉伸
        3.重新设置标签的宽高属性会让画布清除所有的内容
        4.可以给画布设置背景颜色
     -->
    <canvas id="con" width="900" height="600">
    </canvas>
    
</body>


<script>
    //获取标签
    var cancas = document.getElementById("con");
    //获取上下文
    var context = cancas.getContext("2d");
    
    //开始一条路径
    context.beginPath();
    //设置起点
    context.moveTo(100,50);
    //设置终点
    context.lineTo(100,300);
    //设置颜色
    context.strokeStyle = "red";
    //设置线条宽度
    context.lineWidth = 10;
    //闭合路径
    context.closePath();
    //渲染绘制
    context.stroke();
    
    
    //绘制第二条直线
    //需要开始一个新的路径
    context.beginPath()
    
    context.moveTo(20,150)
    context.lineTo(200,150);
    context.strokeStyle = "#0000FF";
    context.closePath();
    
    context.stroke();


</script>


image.png
  • 绘制坐标系图表
<script type="text/javascript">
    
    
    
    //获取
    var convas = document.getElementById("con");
    var margin = 20;
    var rows = convas.clientHeight/margin;
    var cols = convas.clientWidth/margin;
    //获取上下文
    var cxt = convas.getContext("2d");
    for(var i = 1; i < rows; i ++){
        cxt.moveTo(0,i * margin);
        cxt.lineTo(convas.clientWidth,i * margin);
        
    }
    cxt.strokeStyle = "red";
    cxt.lineWidth = 0.3;
    
    //渲染绘制
    cxt.stroke();
    
    //开辟一个新的路径
    cxt.beginPath();
    for(var i = 1; i < cols; i ++ ){
        //开启新的路径
        cxt.moveTo(i * margin,0);
        cxt.lineTo(i *margin,convas.clientHeight)
    };
    
    cxt.strokeStyle = "red";
    cxt.lineWidth = 0.3;
    
    //渲染绘制
    cxt.stroke();
    
    //绘制坐标系
    var x0 = 100;
    var y0 = 500;
    var maxWidth = 500;
    var maxHeight = 400;

    //绘制
    //开启一个新的路径
    cxt.beginPath();
    //设置起点
    cxt.moveTo(x0,y0);
    //设置终点
    cxt.lineTo(x0 + maxWidth,y0);

    cxt.lineTo(x0 + maxWidth - margin,y0 - margin);

    //在这是一个起点
    cxt.moveTo(x0 + maxWidth - margin,y0 + margin);
    cxt.lineTo(x0 + maxWidth,y0);

    //设置Y轴
    //起点
    cxt.moveTo(x0,y0);
    //终点
    cxt.lineTo(x0, y0 - maxHeight);
    //设置箭头
    cxt.lineTo(x0 + margin, y0 - maxHeight + margin);
    
    //设置起点
    cxt.moveTo(x0 - margin, y0 - maxHeight + margin);
    cxt.lineTo(x0, y0 - maxHeight);

    cxt.lineWidth = 1;
    cxt.strokeStyle = "blue";
    cxt.stroke();

    //绘制折线
    var data = [50,10,60,40,20,100];
    //缩放比例
    var w = maxWidth/data.length;
    var h = maxHeight/100;

    //制作坐标点
    var pointArr = [];

    for(var i = 0; i < data.length; i ++){

        var point = {
            x:x0 + (i + 1) * w,
            y: y0 - data[i] * h
        };

        pointArr.push(point);
    }

    //绘制
    cxt.beginPath();

    cxt.moveTo(x0, y0);

    for(var i = 0; i < pointArr.length; i ++){

        var point = pointArr[i];

        cxt.lineTo(point.x,point.y);
    }
    
    cxt.strokeStyle = "green";
    cxt.stroke();
    

    
    
</script>


image.png
2.绘制矩形
  • cxt.rect(200,200,200,200);
<script type="text/javascript">
     var can = document.getElementById("con");
     
     var cxt = can.getContext("2d");
     
     
     //绘制矩形的方法
     cxt.rect(20,20,60,60);
     
     cxt.strokeStyle = "blue";
     cxt.lineWidth = 20;
     //描边
     cxt.stroke();
     //填充
     cxt.fillStyle = "red";
     cxt.fill();
     
    
    //快速描边
    cxt.strokeStyle = "red";
    cxt.lineWidth = 10;
    cxt.strokeRect(200,200,200,200);
    
    //快速填充
    cxt.fillStyle = "blue";
    cxt.fillRect(200,200,200,200);
    
    
    //清除 橡皮檫 可以清除你画的
    cxt.clearRect(200,200,100,100);
    
</script>

image.png
3.绘制弧线arc
<script type="text/javascript">
    
    var canvas = document.getElementById("con");
    //获取上下文
    var cxt = canvas.getContext("2d");
    /**
     *  参数一: 坐标 x 点
     * 参数二: 坐标 y 点
     * 参数三: 半径
     * 参数四: 开始的角度
     * 参数五:结束的角度
     * 参数6: 是否是顺时针 true 是 逆时针   false 顺时针
     */
    cxt.arc(200,200,50,0,30,true);
    cxt.lineWidth = 5;
    cxt.stroke();
    
</script>

image.png

4.非零正交原则

  • 计数器初始值为0
  • 在要判断是否填充的区域,画一条射线,看射线与路径是否相交,顺时针相交+1,逆时针相交-1
  • 计数器的最终值 如果为0就不填充,不是0填充
image.png

<script type="text/javascript">
    var canvas = document.getElementById("con");
    //获取上下文
    var cxt = canvas.getContext("2d");
    //例子
    //顺时针画圆
    cxt.arc(200,200,80,0,2 * Math.PI,false);
    //逆时针画圆
    cxt.arc(200,200,60,0,2 *Math.PI,true);
    cxt.fillStyle = "red";
    cxt.fill();
</script>
WX20190925-124632.png
5.绘制文字
  • cxt.strokeText("绘制文字,哈哈",100,100);

<script type="text/javascript">
    var canvas = document.getElementById("con");
    //获取上下文
    var cxt = canvas.getContext("2d");
    
    //绘制文字
    //文字的类型和大小
    cxt.font = "20px '微软雅黑'";
    // c绘制
    cxt.strokeStyle = "red";
    //设置对齐方式
    cxt.textAlign  = "center";
    cxt.strokeText("绘制文字,哈哈",100,100);
    
    //绘制填充文字
    cxt.beginPath();
    cxt.font = "20px '微软雅黑'";
    // c绘制
    cxt.textAlign = "right";
    cxt.fillStyle = "red";
    cxt.fillText("绘制文字,哈哈",200,200);
    
    
</script>

image.png
  • 绘制饼状图
<script type="text/javascript">
    var canvas = document.getElementById("con");
    //获取上下文
    var cxt = canvas.getContext("2d");
    //设置数据
    var data = [
        {name:"上海",coclor:"red",res:0.2},
        {name:"北京",coclor:"green",res:0.2},
        {name:"深圳",coclor:"black",res:0.3},
        {name:"郑州",coclor:"purple",res:0.1},
        {name:"南京",coclor:"blue",res:0.2},
    ];
    
    var x = canvas.clientWidth *0.5;
    var y = canvas.clientHeight *0.5;
    var r = 180;
    var startA = - Math.PI * 0.5;
    var endA = 0;
    var temp = 0;
    for(var i = 0; i < data.length; i ++){
        
        var obj = data[I];
        temp =  obj.res * 360 *Math.PI/180;
        //设置结束的度数
        endA = startA + temp;
        //每一次 开启一个新的路径
        cxt.beginPath();
        //设置一个起点 为了 填充
        cxt.moveTo(x,y);
        //绘制弧线
        cxt.arc(x,y,r,startA,endA,false);
        //填充颜色
        cxt.fillStyle = obj.coclor;
        //填充
        cxt.fill();
        
        //绘制文字
        //获取文字拼接
        var text = obj.name + obj.res * 100 + "%";
        //获取文字显示的位置
        var textX =  Math.cos(startA + temp/2) * (r + 20) + x;
        var textY =  Math.sin(startA + temp/2) * (r + 20) + y;
        console.log(textX+"---" + textY);
        //让左半圆的文字 向右对齐显示完整
        if(startA + temp/2 > 90 *Math.PI /180 && startA + temp/2 < 270 * Math.PI/180){
            cxt.textAlign = "right";
        }
        
        cxt.fillText(text,textX,textY);
        
        //更新起点
        startA = endA;
    }
    
</script>


image.png
6.绘制图片
  • cxt.drawImage(imgObj,sx,sy,swidth,sheight,x,y,width,height);
参数解释:
sx,sy是裁剪图片的起始点

swidth,sheight是裁剪图片的宽和高
                
x,y把裁剪得到的图片 放置的坐标点
                
width,height 把裁剪得到的图片 设置显示的宽和高
<script type="text/javascript">
    
    window.onload = function(){
        var canvas = document.getElementById("con");
        //获取上下文
        var cxt = canvas.getContext("2d");
        
        //获取一个图片对象
        var image = document.getElementById("img_1");
        
        //绘制图片
        /*
          在绘制图片的时候 必须有一个 图片的对象
        */
       //图片的宽高要等比缩放
       var w = 300;
       var h = image.height/image.width *w;
        cxt.drawImage(image,10,10,w,h);
        
    </script>   
image.png
  • 图片绘制的裁剪

<script type="text/javascript">
    
    window.onload = function(){
        var canvas = document.getElementById("con");
        //获取上下文
        var cxt = canvas.getContext("2d");
//方式二
    
        var imgObj = new Image();
        imgObj.src = "img/1.jpg";
        //图片加载完成之后,才可以绘制
        imgObj.onload = function(){
            
            // cxt.drawImage(imgObj,sx,sy,swidth,sheight,x,y,width,height);
            /*
                
                sx,sy是裁剪图片的起始点
                swidth,sheight是裁剪图片的宽和高
                
                x,y把裁剪得到的图片 放置的坐标点
                
                width,height 把裁剪得到的图片 设置显示的宽和高
                
            */
            cxt.drawImage(imgObj, 100, 100, 400, 200, 450, 100, 400, 200);
        }
        
        
    }
    
    
    
</script>
image.png

相关文章

  • JS中canvas画布绘制

    canvas的一些注意点 有一个默认的宽度和高度 300 *150 不要通过css控制 他的宽高 会导致内部的图片...

  • android绘图之Canvas基础(2)

    Android 绘图学习 1 Canvas 基础 Canvas画布,用于绘制出各种形状配合画布的变幻操作可以绘制出...

  • 初识canvas(画布)

    canvas(画布) 1、 HTML5提供的新元素2、 Canvas在HTML页面提供画布的功能,可以在页面中绘制...

  • 二维CANVAS画板基本语法(线与基本图形)

    是什么: Canvas是h5中的一个新标签,是用来绘制图形的画布。绘制的过程在JS中完成。 用途: 数据的可视化(...

  • 小程序利用canvas绘制分享图

    1、DOM中创建canvas 2、创建canvas画布 3、绘制分享图内容 4、将当前画布指定区域的内容导出生成指...

  • 四、Android绘制知识总结(画布篇)

    Canvas(画布),绘制的载体,通过Paint(画笔)可以在上面绘制所有你想绘制的图案。 1、Canvas绘制A...

  • Android自定义View onDraw详解

    onDraw的作用:绘制控件的内容 绘制的核心:Canvas(画布)、Paint(画笔) Canvas Canva...

  • canvas初识

    canvas是html5中新增的标签,用于配合js绘制图形 创建一个画布 canvas 是一个二维网格。左上角坐标...

  • Flutter自定义View(CustomPainter) 之

    画布canvas 画布是一个矩形区域,我们可以控制其每一像素来绘制我们想要的内容 canvas 拥有多种绘制点、线...

  • Canvas WebGL Three.js

    Canvas: h5 的新标签, 作为一张画布, 用 js 来绘制各种图形 WebGL 就是基于 OpenGL 设...

网友评论

    本文标题:JS中canvas画布绘制

    本文链接:https://www.haomeiwen.com/subject/iqyguctx.html