diff --git a/17.md b/17.md index 77cfa79..c966c17 100644 --- a/17.md +++ b/17.md @@ -8,7 +8,7 @@ 但是,在一些场景中,使用DOM并不符合我们的设计初衷。比如我们很难使用普通的HTML元素画出任意两点之间的线段这类图形。 -这里有两种解决办法。第一种方法基于DOM,但使用可缩放矢量图形(SVG,Scalable Vector Graphics)代替HTML元素。我们可以将SVG看成一门专用于描述图形文档而非描述文字文档。你可以在HTML文档中嵌入SVG,还可以在<img>标签中引用它。 +这里有两种解决办法。第一种方法基于 DOM,但使用可缩放矢量图形(SVG,Scalable Vector Graphics)代替 HTML。我们可以将 SVG 看成文档标记方言,专用于描述图形而非文字。你可以在HTML文档中嵌入SVG,还可以在<img>标签中引用它。 我们将第二种方法称为画布(canvas)。画布是一个能够封装图片的DOM元素。它提供了在空白的html节点上绘制图形的编程接口。SVG与画布的最主要区别在于SVG保存了对于图像的基本信息的描述,我们可以随时移动或修改图像。 @@ -31,10 +31,10 @@ xmlns属性把一个元素(以及他的子元素)切换到一个不同的XML命名空间。这个由url定义的命名空间,规定了我们当前使用的语言。在HTML中不存在的<circle>与<rect>标签,但这些标签在SVG中是有意义的,你可以通过这些标签的属性来绘制图像并指定样式与位置。 -和HTML标签一样,这些标签会创建对应的DOM元素。例如,下面的代码可以把<circle>元素的颜色替换为青色。 +和HTML标签一样,这些标签会创建DOM元素,脚本可以和它们交互。例如,下面的代码可以把<circle>元素的颜色替换为青色。 ```html -var circle = document.querySelector("circle"); +let circle = document.querySelector("circle"); circle.setAttribute("fill", "cyan"); ``` @@ -44,19 +44,19 @@ circle.setAttribute("fill", "cyan"); 新的画布是空的,意味着它是完全透明的,看起来就像文档中的空白区域一样。 -<canvas>标签可以支持多种不同风格的绘图。要获取真正的绘图接口,首先我们要创建一个能够提供绘图接口的方法的上下文(context)。目前有两种得到广泛支持的绘图接口:用于绘制二维图形的“2d”与通过openGL接口绘制三维图形的“webgl”。 +<canvas>标签允许多种不同风格的绘图。要获取真正的绘图接口,首先我们要创建一个能够提供绘图接口的方法的上下文(context)。目前有两种得到广泛支持的绘图接口:用于绘制二维图形的“2d”与通过openGL接口绘制三维图形的“webgl”。 本书只讨论二维图形,而不讨论WebGL。但是如果你对三维图形感兴趣,我强烈建议大家自行深入研究WebGL。它提供了非常简单的现代图形硬件接口,同时你也可以使用JavaScript来高效地渲染非常复杂的场景。 -我们可以在<canvas>元素上调用getContext方法创建context对象。 +您可以用`getContext`方法在`` DOM 元素上创建一个上下文。 ```html

Before canvas.

After canvas.

@@ -66,22 +66,22 @@ circle.setAttribute("fill", "cyan"); 与HTML(或者SVG)相同,画布使用的坐标系统将(0,0)放置在左上角,并且y轴向下增长。所以(10,10)是相对于左上角向下并向右各偏移10像素的位置。 -### 16.3 填充与描边 +### 直线和平面 我们可以使用画布接口填充图形,也就是赋予某个区域一个固定的填充颜色或填充模式。我们也可以描边,也就是沿着图形的边沿画出线段。SVG也使用了相同的技术。 fillRect方法可以填充一个矩形。他的输入为矩形框左上角的第一个x和y坐标,然后是它的宽和高。相似地,strokeRect方法可以画出一个矩形的外框。 -两个方法都不需要其他任何参数。填充的颜色以及轮廓的粗细等等都不能由方法的参数决定(假如你这样期望),而是由context对象的属性决定。 +两个方法都不需要其他任何参数。填充的颜色以及轮廓的粗细等等都不能由方法的参数决定(像你的合理预期一样),而是由上下文对象的属性决定。 -通过设置fillStyle参数可以改变图形填充的方式。我们可以将其设置为描述颜色的字符串,或其他可由css解析的颜色信息。 +设置fillStyle参数控制图形的填充方式。我们可以将其设置为描述颜色的字符串,使用 CSS 所用的颜色表示法。 strokeStyle属性的作用很相似,但是它用于规定轮廓线的颜色。线条的宽度由lineWidth属性决定。lineWidth的值都为正值。 ```html ``` -当没有设置width或者height参数时,正如上例一样,画布元素的默认宽度为300像素,默认高度为150像素。 +当没有设置width或者height参数时,正如示例一样,画布元素的默认宽度为300像素,默认高度为150像素。 ### 16.4 路径 @@ -98,9 +98,9 @@ strokeStyle属性的作用很相似,但是它用于规定轮廓线的颜色。 ```html -``` - -尽管to单词暗示着arcTo方法会画出从圆弧部分终点到目标点的线段,但是该方法并不会这样做。你可以通过调用lineTo方法并赋予相同的目标点坐标来画出这部分线段。 - -如果想画出一个圆,你可以调用4次arcTo方法(每次旋转90度)。但是arc方法提供了一个更加简单的方式。它接受一对弧度中心的坐标,一个半径,以及一个起始和终止的弧度。 我们可以使用最后两个参数画出部分圆。角度是通过弧度来测量的,而不是度数。这意味着一个完整的圆拥有2π的弧度,或者2*Math.PI(大约为6.28)的弧度。弧度从圆心右边的点开始并以顺时针的方向计数。你可以使用一个以0为起始并以一个比2π大的数值(比如7)作为终止值来画出一个完整的圆。 ```html ``` -上面这段代码绘制出的图形包含了一条从完整圆(第一次调用arc)的右侧到四分之一圆(第二次调用arc)的左侧的直线。arc与其他绘制路径的方法一样,默认会自动连接到上一个路径上。如果你想避免这种行为,需要使用moveTo创建一条新路径。 +上面这段代码绘制出的图形包含了一条从完整圆(第一次调用arc)的右侧到四分之一圆(第二次调用arc)的左侧的直线。arc与其他绘制路径的方法一样,会自动连接到上一个路径上。你可以调用`moveTo`或者开启一个新的路径来避免这种情况。 ### 16.6 绘制饼状图 -设想你刚刚从EconomiCorp获得了一份工作,并且你的第一个任务是画出一个描述其用户满意度调查结果的饼状图。results变量包含了一个表示调查结果的对象的数组。 +设想你刚刚从EconomiCorp获得了一份工作,并且你的第一个任务是画出一个描述其用户满意度调查结果的饼状图。results绑定包含了一个表示调查结果的对象的数组。 ```js -var results = [ +const results = [ {name: "Satisfied", count: 1043, color: "lightblue"}, {name: "Neutral", count: 563, color: "lightgreen"}, {name: "Unsatisfied", count: 510, color: "pink"}, @@ -227,14 +209,13 @@ var results = [ ```html ``` -但如果表格无法告诉我们其代表的含义,那么这个表格是毫无用处的。因此我们需要将文字画在画布上。 +但表格并没有告诉我们切片代表的含义,它毫无用处。因此我们需要将文字画在画布上。 ### 16.7 文本 -2D画布的context对象提供了fillText方法和strokeText方法。第二个方法可以用于绘制字母轮廓,但通常情况下我们需要的是fillText方法。该方法使用当前的fillColor来填充特定的文字。 +2D画布的context对象提供了fillText方法和strokeText方法。第二个方法可以用于绘制字母轮廓,但通常情况下我们需要的是fillText方法。该方法使用当前的fillColor来填充特定文字的轮廓。 ```html ``` -你可以通过font属性来设定文字的大小,样式和字体。本例给出了一个字体的大小和字体族名称。你可以添加italic或者bold来选择样式。 +你可以通过font属性来设定文字的大小,样式和字体。本例给出了一个字体的大小和字体族名称。也可以添加italic或者bold来选择样式。 -传递给fillText(和strokeText)的后两个参数用于指定绘制文字的位置。默认情况下,这个位置指定了文字的字符基线(baseline)的起始位置,我们可以将其假想为字符所站立的位置,基线不考虑j或p字母中那些向下突出的部分。你可以设置textAlign属性(end或center)来改变起始点的横向位置,也可以设置textBaseline属性(top、middle或bottom)来设置基线的纵向位置。 +传递给fillText和strokeText的后两个参数用于指定绘制文字的位置。默认情况下,这个位置指定了文字的字符基线(baseline)的起始位置,我们可以将其假想为字符所站立的位置,基线不考虑j或p字母中那些向下突出的部分。你可以设置textAlign属性(end或center)来改变起始点的横向位置,也可以设置textBaseline属性(top、middle或bottom)来设置基线的纵向位置。 -在本章末尾的练习中,我们会回头来看看饼状图,并解决给饼状图分片标注的问题。 +在本章末尾的练习中,我们会回顾饼状图,并解决给饼状图分片标注的问题。 ### 16.8 图像 计算机图形学领域经常将矢量图形和位图图形分开来讨论。本章一直在讨论第一种图形,即通过对图形的逻辑描述来绘图。而位图则相反,不需要设置实际图形,而是通过处理像素数据来绘制图像(光栅化的着色点)。 -我们可以使用drawImage方法在画布上绘制像素值。此处的像素数值可以来自<img>元素,或者来自其他的画布,并且两者都不需要在实际的文档中可见。下例创建了一个独立的<img>元素,并且加载了一张图像文件。但我们无法马上使用该图片进行绘制,因为浏览器可能还没有完成图片的获取操作。为了处理这个问题,我们在图像元素上注册一个“load”事件处理程序并且在图片加载完之后开始绘制。 +我们可以使用drawImage方法在画布上绘制像素值。此处的像素数值可以来自<img>元素,或者来自其他的画布。下例创建了一个独立的<img>元素,并且加载了一张图像文件。但我们无法马上使用该图片进行绘制,因为浏览器可能还没有完成图片的获取操作。为了处理这个问题,我们在图像元素上注册一个“load”事件处理程序并且在图片加载完之后开始绘制。 ```html ``` -默认情况下,drawImage会根据原图的尺寸绘制图像。你也可以增加两个参数来规定图片的宽度和高度。 +默认情况下,drawImage会根据原图的尺寸绘制图像。你也可以增加两个参数来设置不同的宽度和高度。 如果我们向drawImage函数传入9个参数,我们可以用其绘制出一张图片的某一部分。第二个到第五个参数表示需要拷贝的源图片中的矩形区域(x,y坐标,宽度和高度),同时第六个到第九个参数给出了需要拷贝到的目标矩形的位置(在画布上)。 @@ -306,13 +288,13 @@ clearRect方法可以帮助我们在画布上绘制动画。该方法类似于fi ```html ``` -cycle变量用于记录角色在动画图像中的位置。每显示一帧,我们都要将cycle加1,并通过取余数确保cycle的值在0~7这个范围内。我们随后使用该变量计算精灵当前形象在图片中的x坐标。 +cycle绑定用于记录角色在动画图像中的位置。每显示一帧,我们都要将cycle加1,并通过取余数确保cycle的值在0~7这个范围内。我们随后使用该绑定计算精灵当前形象在图片中的x坐标。 ### 16.9 变换 -但是,如果我们希望角色可以向左走而不是向右走该怎么办?诚然,我们可以添加一组新的精灵,但我们也可以使用另一种方式在画布上绘图。 +但是,如果我们希望角色可以向左走而不是向右走该怎么办?诚然,我们可以绘制另一组精灵,但我们也可以使用另一种方式在画布上绘图。 我们可以调用scale方法来缩放之后绘制的任何元素。该方法接受两个输入参数,第一个参数是横向缩放比例,第二个参数是纵向缩放比例。 ```html