• 【HTML5 绘图与动画】 绘制图形 1. 矩形 2. 路径 3. 直线 4. 圆弧 5. 二次方曲线 6. 三次方曲线


    以下内容为学习下图这本书做的笔记,非原创。做笔记主要是为了实践一下看看结果加深记忆。

    目录:

    1. 矩形 2. 路径 3. 直线 4. 圆弧 5. 二次方曲线 6. 三次方曲线

    1. 矩形

    ① 绘制 3 个嵌套的矩形

    语句:

     1 <canvas id="canvas" width="300" height="200" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         ctx.fillRect(25, 25, 100, 100);     //fillRect(x,y,width,height) : 绘制一个填充矩形
    11         ctx.clearRect(45, 45, 60, 60);    //clearRect(x,y,width,height) : 清除指定矩形区域,让清除部分完全透明
    12         ctx.strokeRect(50, 50, 50, 50);         //strokeRect(x,y,width,height) : 绘制一个矩形的边框
    13     }
    14 }
    15 </script>

    页面表现:

    2. 路径

    ① 绘制三角形

    语句:

     1 <canvas id="canvas" width="300" height="200" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         ctx.beginPath();    //beginPath() : 开始路径.新建一条路径,生成之后,图形绘制指令被指向到路径上生成路径.
    11         ctx.moveTo(75,50);   //moveTo(x,y) : 将笔触移动到指定的坐标 x 和 y 上.
    12         ctx.lineTo(100,75);    //绘制直线
    13         ctx.lineTo(100,25);
    14         ctx.fill();     //fill() : 填充路径.通过填充路径的内容区域生成实心的图图形
    15     }
    16 }
    17 </script>

    页面表现:

    ② 可以用 moveTo() 方法绘制一些不连续的路径。下面绘制一个笑脸图形

    语句:

     1 <canvas id="canvas" width="300" height="200" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         ctx.beginPath();    //beginPath() : 开始路径.新建一条路径,生成之后,图形绘制指令被指向到路径上生成路径.
    11         ctx.arc(75,75,50,0,Math.PI*2,true);
    12         ctx.moveTo(110,75);
    13         ctx.arc(75,75,35,0,Math.PI,false);
    14         ctx.moveTo(65,65);
    15         ctx.arc(60,65,5,0,Math.PI*2,true);
    16         ctx.moveTo(95,65);
    17         ctx.arc(90,65,5,0,Math.PI*2,true);
    18         ctx.stroke();       //stroke() :描边路径.通过填充路径的内容区域生成实心的图形
    19     }
    20 }
    21 </script>

    页面表现:

    3. 直线

       lineTo(x,y) : 绘制直线  

    ① 绘制 2 个三角形,一个是填充的,另一个是描边的。

    语句:

     1 <canvas id="canvas" width="300" height="200" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         //填充三角形
    11         ctx.beginPath();
    12         ctx.moveTo(25,25);
    13         ctx.lineTo(105,25);
    14         ctx.lineTo(25,105);
    15         ctx.fill();     //使用填充(filled),路径自动闭合
    16         //描边三角形
    17         ctx.beginPath();
    18         ctx.moveTo(125,125);
    19         ctx.lineTo(125,45);
    20         ctx.lineTo(45,125);
    21         ctx.closePath();    //如果不添加 closePath(),该三角形不完整
    22         ctx.stroke();       //使用描边(stroked)不会自动闭合路径
    23     }
    24 }
    25 </script>

    页面表现:

    4. 圆弧

    使用 arc() 方法可以绘制弧或者圆。用法:context.arc( x, y, r, sAngle, eAngle, counterlockwise );

    参数说明:x:圆心的x坐标  y: 圆心的y坐标 r: 圆的半径 sAngle: 起始角。以弧度计  eAngle:结束角。以弧度计  counterlockwise: 可选参数,定义绘图方向。false为顺时针,为默认值,true为逆时针。

    ① 绘制12个不同的角度以及填充的圆弧。

    语句:

     1 <canvas id="canvas" width="300" height="250" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         for( var i=0; i<4; i++ ){
    11             for( var j=0; j<3; j++ ){
    12                 ctx.beginPath();
    13                 var x = 25 + j*50;  //x 坐标值
    14                 var y = 25 + i*50;  //y 坐标值
    15                 var radius = 20;    //圆弧半径
    16                 var startAngle = 0; //开始点
    17                 var endAngle = Math.PI + (Math.PI*j)/2;     //结束点
    18                 var anticlockwise = i%2 == 0 ? false:true;  //顺时针或逆时针
    19                 ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise)
    20                 if( i>1 ){
    21                     ctx.fill();
    22                 }else{
    23                     ctx.stroke();
    24                 }
    25             }
    26         }
    27     }
    28 }
    29 </script>

    页面表现:

    单独画一个圆,加深理解:

    语句:

     1 <canvas id="canvas" width="300" height="250" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         ctx.beginPath();
    11         var x = 100;  //x 坐标值
    12         var y = 100 ;  //y 坐标值
    13         var radius = 30;    //圆弧半径
    14         var startAngle = 0; //开始点
    15         var endAngle = 90*Math.PI/180;    //结束点
    16         var anticlockwise = false;  //false为顺时针
    17         ctx.arc(x, y, radius, startAngle, endAngle, anticlockwise);
    18         ctx.stroke();
    19     }
    20 }
    21 </script>

    页面表现:

     如果将 anticlockwise 改为 true,则效果变为:

      ② 使用 lineTo() 和 arcTo() 方法绘制直线和曲线,然后连成圆角弧线

    使用 arcTo() 方法可以绘制曲线。用法:context.arcTo(x1, y1, x2, y2, r);

    参数:x1:弧的起点的x坐标   y1:弧的起点的y坐标   x2:弧的终点的x坐标   y2:弧的终点的y坐标   r:弧的半径  

    语句:

     1 <canvas id="canvas" width="300" height="200" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         ctx.beginPath();    
    11         ctx.moveTo(20, 20);     //设置起点
    12         ctx.lineTo(100,20);     //绘制水平直线
    13         ctx.arcTo(150, 20, 150, 70,50);     //绘制曲线//context.arcTo(x1,y1,x2,y2,r)
    14         ctx.lineTo(150, 120);   //绘制垂直直线
    15         ctx.stroke();           //开始绘制
    16     }
    17 }
    18 </script>

    页面表现:

    5. 二次方曲线

    ① 绘制一条二次方贝塞尔曲线

    语句:

     1 <canvas id="canvas" width="300" height="250" style="border:solid 1px #999;"></canvas>
     2 <script>
     3 draw();
     4 function draw(){
     5     //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
     6     var canvas = document.getElementById('canvas');
     7     //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
     8     if(canvas.getContext){
     9         var ctx = canvas.getContext('2d');
    10         //开始绘制一条二次方贝塞尔曲线,再绘制出其控制点和控制线
    11         ctx.strokeStyle = "dark";   
    12         ctx.beginPath();
    13         ctx.moveTo(0,200);  //确定开始点 ( 20,20 )
    14         ctx.quadraticCurveTo(75,50,300,200); //控制点:(75,50)  结束点:(300,200)
    15         ctx.stroke();
    16         ctx.globalCompositeOperation="source-over";
    17         //绘制直线,表示曲线的控制点和控制线,控制点坐标即两直线的交点(75.50)
    18         ctx.strokeStyle = "#ff00ff";
    19         ctx.beginPath();
    20         ctx.moveTo(75,50);
    21         ctx.lineTo(0,200);
    22         ctx.moveTo(75,50);
    23         ctx.lineTo(300,200);
    24         ctx.stroke();
    25     }
    26 }
    27 </script>

    页面表现:

    效果说明:

    6. 三次方曲线

    ① 绘制一条三次方贝塞尔曲线,还绘制出两个控制点和两条控制线

    语句:

    <canvas id="canvas" width="300" height="250" style="border:solid 1px #999;"></canvas>
    <script>
    draw();
    function draw(){
        //使用document.getElementById() 方法, 根据 canvas 元素的 id 获取对 canvas 的引用
        var canvas = document.getElementById('canvas');
        //通过 canvas 元素的 getContext() 方法获取画布上下文(context),创建 context 对象,以获取允许进行绘制的 2D 环境
        if(canvas.getContext){
            var ctx = canvas.getContext('2d');
            //下面开始绘制三次方贝塞尔曲线
            ctx.strokeStyle = "dark";
            ctx.beginPath();
            ctx.moveTo(0, 200); //确定开始点(0,200)
            ctx.bezierCurveTo(25, 50, 75, 50, 300, 200);    //第一个控制点(25,50) 第二个控制点(75,50) 结束点(200,20)
            ctx.stroke();
            ctx.globalCompositeOperation="source-over";
            //下面绘制直线.用于表示上面曲线的控制点和控制线,控制点坐标为(25,50)和(75,50)
            ctx.strokeStyle = "#ff00ff";
            ctx.beginPath();
            ctx.moveTo(25,50);
            ctx.lineTo(0,200);
            ctx.moveTo(75,50);
            ctx.lineTo(300,200);
            ctx.stroke();
        }
    }
    </script>

     页面表现:

    效果说明:

  • 相关阅读:
    跟我一起来学ORACLE开发系列之一:CentOS下ORACLE安装篇 老猫
    Oracle中常用的数据字典 老猫
    面试遇到的问题 老猫
    ORACLE删除重复数据 老猫
    fstab修改错了后的解决方案 老猫
    PHP 中使用参数化查询
    安装和配置 WAMP 网页服务
    SkyDrive API 的使用
    PHP 中错误的类型与处理
    JavaScript 中的事件模拟
  • 原文地址:https://www.cnblogs.com/xiaoxuStudy/p/12206957.html
Copyright © 2020-2023  润新知