《HTML5 Canvas开发详解》——2.5 高级路径方法

2.5 高级路径方法

接下来深入探讨一下其他绘制路径的方法,包括弧线和曲线,以组合成复杂的图像。

2.5.1 弧线
有4种函数可以绘制弧线和曲线。弧线可以是一个整圆,也可以是圆的任何一部分。

1.context.arc()

context.arc(x, y, radius, startAngle, endAngle, anticlockwise)

x和y定义圆心的位置,radius定义弧线的半径。startAngle和endAngle使用弧度值,而不是角度值。anticlockwise可以是true或false这两个值,用于定义弧线的方向。例如,绘制一个圆心在(100,100),半径为20的圆,如图2-4所示,可以使用下面这段drawScreen()代码。

context.arc(100, 100, 20, (Math.PI/180)0, (Math.PI/180)360, false);
例2-4显示创建一个简单圆形所必须的代码。

例2-4 圆弧

function drawScreen(){
   context.beginPath();
   context.strokeStyle = "black";
   context.lineWidth = 5;
   context.arc(100, 100, 20, (Math.PI/180)*0, (Math.PI/180)*360, false);

   //整圆
   context.stroke();
   context.closePath();

}

https://yqfile.alicdn.com/05848324b99620fa5a1a65477400470e8e50d77c.png" >

图片 16
图2-4 圆

注意,这里应将起始角度(0)和结束角度(360)乘以(Math.PI/180)来将其转换为弧度。使用0和360,可以创建一个完整的圆形。

如果不以0到360作为起止点,则可以绘制出一段圆弧。下面这段drawScreen()代码将按顺时针方向画四分之一个圆,如图2-5所示。

context.arc(100, 200, 20, (Math.PI/180)*0, (Math.PI/180)*90, false);

如果要画0~90以外的部分,如图2-6所示,可以将anticlockwise值设置为true。

context.arc(100, 200, 20, (Math.PI/180)*0, (Math.PI/180)*90, true);

2.context.arcTo()

context.arcTo(x1, y1, x2, y2, radius)

只有最新的一些浏览器支持arcTo方法,这个函数以给定的半径绘制一条弧线,圆弧的起点与当前路径的位置到(x1,y1)点的直线相切,圆弧的终点与(x1,y1)点到(x2,y2)的直线相切。

context.arcTo方法要求当前路径至少有一个子路径。那么,如果从(0,0)到(100,200)画一条直线,然后创建一条小弧线,这看起来会有点像一个钢丝衣架(没有更好的比喻了),如图2-7所示。

context.moveTo(0,0);
context.lineTo(100, 200);
context.arcTo(350,350,100,100,20);

2.5.2 贝塞尔曲线
贝塞尔曲线要比弧线灵活得多,它有立方和平方两种形式。

context.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
context.quadraticCurveTo(cpx, cpy, x, y)

在二维空间中,贝塞尔曲线通过“起点”、“终点”以及两个决定曲线走向的“控制”点定义完成。一个普通的立方贝塞尔曲线使用两个点,平方贝塞尔曲线使用一个点。平方贝塞尔曲线是最简单的曲线,如图2-8所示,只需要终点以及一个控制点即可完成绘制。

context.moveTo(0,0);
context.quadraticCurveTo(100,25,0,50);

这条曲线从(0,0)开始,到(0,50)结束,用来创建弧线的点位于(100,25),这个点大致上是圆弧的圆心。控制点的x值100把弧线拉伸成一个细长的曲线。

立方贝塞尔曲线具有两个控制点,因此带来了更多的选择,从而能够很容易地绘制出经典的“S”形曲线(如图2-9所示)。

context.moveTo(150,0);
context.bezierCurveTo(0,125,300,175,150,300);

https://yqfile.alicdn.com/00d1afb2894b2a83fcaf870dd39aa9f474c18aa8.png" >

2.5.3 Canvas裁切区域
结合save()函数和restore()函数,Canvas裁切区域可以限制路径及其子路径的绘制区域。首先通过rect()函数设置一个用来绘图的矩形区域,然后调用clip()函数把用rect()函数定义的矩形设置为裁切区域。现在,无论在当前上下文绘制什么内容,它只显示裁切区域以内的部分。这也可以理解成是绘图操作的一种蒙版。例2-5显示如何操作,裁切结果如图2-10所示。

例2-5 Canvas裁切区域

function drawScreen(){
   //在屏幕上绘制一个大方块
   context.fillStyle = "black";
   context.fillRect(10, 10, 200, 200);
   context.save();
   context.beginPath();

   //裁切画布从(0,0)点至50*50的正方形
   context.rect(0, 0, 50, 50);
   context.clip();

   //红色圆
   context.beginPath();
   context.strokeStyle = "red"; //需要可用颜色列表
   context.lineWidth = 5;
   context.arc(100, 100, 100, (Math.PI/180)*0, (Math.PI/180)*360, false);

   //整圆
   context.stroke();
   context.closePath();

   context.restore();

   //再次裁切整个画布
   context.beginPath();
   context.rect(0, 0, 500, 500);
   context.clip();

   //绘制一个没有裁切的蓝线
   context.beginPath();
   context.strokeStyle = "blue"; //需要可用颜色列表
   context.lineWidth = 5;
   context.arc(100, 100, 50, (Math.PI/180)*0, (Math.PI/180)*360, false);
   //整圆
   context.stroke();
   context.closePath();
}

例2-5首先在画布上画了一个200×200的黑色矩形,然后将Canvas裁切区域设置为rect(0,0,50,50),clip()函数按照这些参数对画布进行裁切设置,所画的红色圆弧形只能看到在这个矩形以内的部分,最后将裁切区域调整回rect(0,0,500,500)并画一个新的蓝色圆弧,此时整个圆都能够看到。
提示:
也可以将其他Canvas方法配合裁切区域使用,最常见的的是arc()函数。

arc(float x, float y, float radius, float startAngle,
float endAngle, boolean anticlockwise)

这可以创建一个圆形的裁切区域,而不是矩形的裁切区域。

时间: 2024-10-30 17:51:45

《HTML5 Canvas开发详解》——2.5 高级路径方法的相关文章

《HTML5 canvas开发详解(第2版)》——2.5 高级路径方法

2.5 高级路径方法 接下来,深入探讨一下其他绘制路径的方法,包括弧线和曲线,以组合成复杂的图像. 2.5.1 弧线有4种函数可以绘制弧线和曲线.弧线可以是一个整圆,也可以是圆的任何一部分. 1.context.arc()context.arc()的使用方法如下: context.arc(x, y, radius, startAngle, endAngle, anticlockwise) x和y定义圆心的位置,radius定义弧线的半径.startAngle和endAngle使用弧度值,而不是角

《HTML5 canvas开发详解(第2版)》——导读

前言第2版介绍自从本书第1版发行之后,在过去的两年里,HTML5 Canvas的使用有了突飞猛进的增长.本书的第1版可以称得上是第一批介绍Canvas的专著之一.在我们为自己的快速而感到自豪同时也意味着我们曾经独自进行了大量的研究和探索.早在2011年,只有极少数HTML5 Canvas应用的例子和教程.但在2013年情形发生了改变.现在有许多关于HTML5 Canvas的资源可供选择,从框架到API,有许多网站和书籍进行专门的阐述.为了编写第2版,我们进行了大量艰辛的工作来检查在第1版中哪些部

《HTML5 Canvas开发详解》——导读

https://yqfile.alicdn.com/bc81e95aba389209ecb7176965c56b0ba2d9c780.png" > 前言HTML5 Canvas为开发者提供了一个新的机会,利用它仅使用普通的HTML和JavaScript语言就可以在常见的浏览器中创建动画图形.Canvas是HTML5中使用率最高的一部分,它被用于许多演示与游戏.它提供了视觉效果很棒的交互特性,而且它还提供了非常大的自由度,几乎允许开发者在浏览器窗口中做任何事情.然而它与JavaScript的

《HTML5 canvas开发详解(第2版)》——第1章 HTML5 Canvas简介1.1 什么是HTML5

第1章 HTML5 Canvas简介 HTML5是新一代的HTML,即超文本标记语言.HTML从1993年第一次标准化后,便奠定了万维网的基础.HTML通过使用将标签用尖括号(< >)括起来的方式定义Web页面内容. HTML5 Canvas是屏幕上的一个由JavaScript控制的即时模式位图区域.即时模式是指在画布上呈现像素的方式,HTML Canvas通过JavaScript调用Canvas API,在每一帧中完全重绘屏幕上的位图.作为一名程序员,所要做的就是在每一帧渲染之前设置屏幕的显

《HTML5 Canvas开发详解》——第1章 HTML5 Canvas简介1.1 基础的HTML页面

第1章 HTML5 Canvas简介 HTML5是新一代的HTML,即超文本标记语言.HTML从1993年第一次标准化后,便奠定了万维网的基础.HTML通过使用将标签用尖括号(< >)括起来的方式定义Web页面内容. HTML5 Canvas是屏幕上的一个由JavaScript控制的即时模式位图区域.即时模式是指在画布上呈现像素的方式,HTML Canvas通过JavaScript调用Canvas API,在每一帧完全重绘屏幕上的位图.作为一个程序员,所要做的就是在每一帧渲染之前设置屏幕显示,

《HTML5 canvas开发详解(第2版)》——1.11 动画版本的Hello World

1.11 动画版本的Hello World "Hello World"和"猜字母"本身都是不错的示例,但是它们都没能回答出"为什么"--究竟为什么要使用HTML5 Canvas?自创立以来,静态的图像和文字就是HTML的领域,那么画布的不同之处在哪里呢?要回答这个问题,需要创建第二个"Hello World"示例.这个示例将介绍画布与HTML上的其他显示方式的最大不同之处:动画.在这个示例中,将为"Hello Wor

《HTML5 canvas开发详解(第2版)》——1.6 HTML5 Canvas版“Hello World!”

1.6 HTML5 Canvas版"Hello World!" 如前所述,将Canvas放入HTML5页面时第一件要做的事就是,看看整个页面是否已经加载,并且开始操作前是否所有HTML元素都已展现.在用Canvas处理图像和声音的时候,这点会非常重要. 为此,这里要使用JavaScript的事件.当定义的事件发生时,事件从对象发出.其他对象监听事件,这样就可以基于事件进行处理.用JavaScript可以监听对象的一些常见事件,包括键盘输入.鼠标移动以及加载结束. 第一个需要监听的事件是

《Web前端开发精品课——HTML5 Canvas开发详解》——第一部分第二章节

第2章 直线图形 2.1 直线图形简介 在Canvas中,基本图形有两种:①直线图形:②曲线图形.Canvas常见的直线图形有三种,分另是直线.矩形.多边形. 这一章我们先来学习Canvas中的直线图形. 2.2 直线 2.2.1 Canvas坐标系 在学习Canvas之前,我们先来介绍一下Canvas中的坐标系是如何使用的.了解Canvas使用的坐标系是学习Canvas的最基本的前提. 我们经常见到的坐标系是数学坐标系,而Canvas使用的坐标系是W3C坐标系,这两种坐标系唯一的区别在于y轴正

《HTML5 canvas开发详解(第2版)》——1.9 HTML5 Canvas对象

1.9 HTML5 Canvas对象 Canvas对象是通过在HTML页面的< body >部分中放置< canvas >标签创建的,也可以通过以下代码创建画布实例. var theCanvas = document.createElement("canvas"); Canvas对象有两个相关的属性和方法可以通过JavaScript访问:width和height.这些属性显示当前HTML页面创建的画布的宽度和高度.这里需要强调的是,这两个属性并不是只读的.例如,