【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>

 页面表现:

效果说明:

原文地址:https://www.cnblogs.com/xiaoxuStudy/p/12206957.html