`
wjlgryx
  • 浏览: 306847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

html5 图形的基础 - 路径

阅读更多

在 Canvas 中,所有基本图形都是以路径为基础的,也就是说,我们在调用 2dContext 的 lineTo、rect 等方法时,其实就是往已经的 context 路径集合中再添加一些路径点,在最后使用 fill 或 stroke 方法进行绘制时,都是依据这些路径点来进行填充或画线。
在每次开始绘制路径前,都应该使用 context.beginPath() 方法来告诉 Context 对象开始绘制一个新的路径,否则接下来绘制的路径会与之前绘制的路径叠加,在填充或画边框时就会出现问题。在绘制完成路径后,可以直接使用 context.closePath() 方法来关闭路径,或者手动关闭路径。另外,如果在填充时路径没有关闭,那么 Context 会自动调用 closePath 方法将路径关闭。
基本路径方法
1. beginPath, closePath
这两个方法在前面已经介绍过,分别用来通知 Context 开始一个新的路径和关闭当前的路径。
在 Canvas 中使用路径时,应该要保持一个良好的习惯,每次开始绘制路径前都要调用一次 beginPath 方法,否则画出来的效果难看不说,还会严重影响性能。
在下面这张图中,左边的图形在每次绘制矩形前都调用了一次 beginPath 来清除之前的路径并重新开始绘制新的路径,而后面的图形则就只在绘制所有图形前调用了一次 beginPath 来清除路径,因此,虽然这里是使用的边框色是 #666,但是右边的图形颜色比左边的深一些,因为每次使用 stroke 绘制边框时,会把之前的路径再次绘制一遍,叠加起来颜色就比原来深一些。

<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.strokeStyle = "#666";
function useBeginPath() {
for (var i = 0; i < 5; ++i) {
ctx.beginPath();
ctx.rect(10 + i*20, 10 + i*20, 210 - i*40, 210 - i*40);
ctx.stroke();
}
}
function notUseBeginPath() {
ctx.beginPath();
for (var i = 0; i < 5; ++i) {
ctx.rect(240 + i*20, 10 + i*20, 210 - i*40, 210 - i*40);
ctx.stroke();
}
}
useBeginPath();
notUseBeginPath();
</script>

   提示:您可以先修改部分代码再运行

在 Context 中路径数较少时,如果不考虑显示效果,性能上还可以接受,但是如果 Context 中的路径数很多时,在开始绘制新路径前不使用 beginPath 的话,因为每次绘制都要将之前的路径重新绘制一遍,这时性能会以指数下降。
因此,除非有特殊需要,每次开始绘制路径前都要调用 beginPath 来开始新路径。
2. 移动与直线 moveTo, lineTo, rect

<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.moveTo(10, 10);
ctx.lineTo(110,110);
ctx.lineTo(10, 110);
ctx.lineTo(10, 10);
ctx.stroke();
ctx.beginPath();
ctx.rect(120, 10, 100, 100);
ctx.stroke();
</script>

   提示:您可以先修改部分代码再运行

void moveTo(in float x, in float y);
在 Canvas 中绘制路径,一般是不需要指定起点的,默认的起点就是上一次绘制路径的终点,因此,如果需要指定起点的话,就需要使用 moveTo 方法来指定要移动到的位置。
void lineTo(in float x, in float y);
lineTo 方法则是绘制一条直接路径到指定的位置。在调用完 lineTo 方法后,Context 内部的绘制起点会移动到直线的终点。
void rect(in float x, in float y, in float w, in float h);
rect 方法用来绘制一个矩形路径,通过参数指定左上角位置以及宽和高。在调用 rect 后,Context 的绘制起点会移动到 rect 绘制的矩形的左上角。
rect 方法与后面要介绍的 arc 方法与其他路径方法有一点不同,它们是使用参数指定起点的,而不是使用 Context 内部维护的起点。
3. 曲线 arcTo, arc, quadraticCurveTo, bezierCurveTo
void arcTo(in float x1, in float y1, in float x2, in float y2, in float radius);
按照 WHATWG 文档的说明,这个方法是画一个与两条射线相切的的圆弧,两条射线其中一条为穿过 Context 绘制起点,终点为 (x1, y1),另外一条为穿过 (x2, y2),终点为 (x1, y1),这条圆弧为最小的与这两条射线相切的圆弧。在调用完 arcTo 方法后,将 圆弧与 射线 (x1, y1)-(x2, y2) 的切点添加到当前路径中,做为下次绘制的起点。
在测试中发现,Firefox 和 Opera 目前对这个方法的支持并不好,只有 Chrome 和 Safari 4 能绘制出正确的路径。

图中的的两条灰色直线是偏移 4 个像素后的两条射线所在的位置。
<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.translate(200, 200);
ctx.moveTo(10, 10);
ctx.arcTo(110, 60, 10, 110, 30);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "#999";
ctx.moveTo(10, 6);
ctx.lineTo(114, 60);
ctx.lineTo(10, 114);
ctx.stroke();
</script>

   提示:您可以先修改部分代码再运行

void arc(in float x, in float y, in float radius, in float startAngle, in float endAngle, in boolean anticlockwise);
arc 方法用来绘制一段圆弧路径,通过圆心位置、起始弧度、终止弧度来指定圆弧的位置和大小,这个方法也不依赖于 Context 维护的绘制起点。而在画圆弧时的旋转方向则由最后一个参数 anticlockwise 来指定,如果为 true 就是逆时针,false 则为顺时针。
void quadraticCurveTo(in float cpx, in float cpy, in float x, in float y);
quadraticCurveTo 方法用来绘制二次样条曲线路径,参数中 cpx 与 cpy 指定控制点的位置,x 和 y 指定终点的位置,起点则是由 Context 维护的绘制起点。
void bezierCurveTo(in float cp1x, in float cp1y, in float cp2x, in float cp2y, in float x, in float y);
bezierCurveTo 方法用来绘制贝塞尔曲线路径,它与 quadraticCurveTo 相似,不过贝塞尔曲线有两个控制点,因此参数中的 cp1x, cp1y, cp2x, cp2y 用来指定两个控制点的位置,而 x 和 y 指定绺的位置。

<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.translate(10, 10);
ctx.beginPath();
ctx.arc(50, 50, 50, 0, Math.PI, true);
ctx.stroke();
// quadraticCurveTo
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.moveTo(110, 50);
ctx.quadraticCurveTo(160, 0, 210, 50);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "red";
ctx.moveTo(110, 50);
ctx.lineTo(160, 0);
ctx.lineTo(210, 50);
ctx.stroke();
// bezierCurveTo
ctx.beginPath();
ctx.strokeStyle = "#000";
ctx.moveTo(220, 50);
ctx.bezierCurveTo(250, 0, 280, 10, 320, 50);
ctx.stroke();
ctx.beginPath();
ctx.strokeStyle = "red";
ctx.moveTo(220, 50);
ctx.lineTo(250, 0);
ctx.lineTo(280, 10);
ctx.lineTo(320, 50);
ctx.stroke();
</script>

   提示:您可以先修改部分代码再运行

4. fill, stroke, clip
fill 与 stroke 这两个方法很好理解,分别用来填充路径与绘制路径线条。
clip 方法用来给 Canvas 设置一个剪辑区域,在调用 clip 方法之后的代码只对这个设定的剪辑区域有效,不会影响其他地方,这个方法在要进行局部更新时很有用。默认情况下,剪辑区域是一个左上角在 (0, 0),宽和高分别等于 Canvas 元素的宽和高的矩形。

在画这个图时,虽然两次都是使用 fillRect(0, 0, 100, 100) 填充了一个 100x100 大小矩形,但是显示的结果却是第二次填充的只是中间的一小块,这是因为在两次填充之间使用 clip 方法设定了剪辑区域,这样第二次填充时只会影响到所设定的中间那一小部分区域。
<canvas id="canvas" width="500" height="500"></canvas>
<script type="text/javascript">
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
ctx.translate(10, 10);
// fill a green rectangle
ctx.fillStyle = "green";
ctx.fillRect(0, 0, 100, 100);
// set the clipping region
ctx.beginPath();
ctx.rect(30, 30, 40, 40);
ctx.clip();
ctx.stroke();
// fill a yellow rectangle
ctx.fillStyle = "yellow";
ctx.fillRect(0, 0, 100, 100);
</script>

   提示:您可以先修改部分代码再运行

5. clearRect, fillRect, strokeRect
这三个方法并不是路径方法,而是用来直接处理 Canvas 上的内容,相当于 Canvas 的背景,调用这三个方法也不会影响 Context 绘图的起点。
要清除 Canvas 上的所有内容时,可以直接调用 context.clearRect(0, 0, width, height) 来直接清除,而不需要使用路径方法绘制一个与 Canvas 同等大小的矩形路径再使用 fill 方法去清除。
分享到:
评论

相关推荐

    JavaScript高效图形编程--高清版.pdf

    3. Canvas API:Canvas API是HTML5中的一个重要特性,它允许JavaScript创建和操作图形。Canvas API涉及绘制图形(如矩形、圆形、路径等)、设置样式、处理事件等。 4. SVG:可缩放矢量图形(Scalable Vector ...

    html基础------简单易学

    "html基础------简单易学"这个主题旨在为初学者提供一个易理解的HTML学习路径,通过简单明了的解释,帮助他们快速掌握常用HTML标记。 HTML由一系列的元素组成,这些元素通常被称为标签。每个标签都有其特定的功能,...

    html5图形化编辑

    HTML5图形化编辑是现代网页开发中的一个重要领域,它利用HTML5的新特性,如Canvas、SVG和WebGL等,提供了一种在浏览器中创建、编辑和展示图形的强大方式。随着前端技术的飞速发展,HTML5图形化编辑工具已经成为了...

    HTML5 Canvas核心技术—图形、动画与游戏开发一书源代码

    HTML5 Canvas是Web开发中的一个关键技术,它提供了一个在网页上绘制图形的API,使得开发者可以直接在浏览器中创建丰富的交互式2D图形、动画以及游戏。"HTML5 Canvas核心技术—图形、动画与游戏开发"这本书深入浅出地...

    html5 canvas绘制几何图形动画特效

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的视觉效果。这个技术尤其适合创建几何图形动画特效,给用户带来互动且引人入胜的体验。以下是对HTML5 Canvas绘制几何...

    HTML5常用命令-零基础

    HTML5,即超文本标记语言的第五次重大修改版,是构建现代网页的基础技术之一。它为网页添加了多媒体、图形以及更高级的交互功能,同时提供了更好的搜索引擎优化和辅助工具支持。下面我们将详细介绍HTML5中的常用命令...

    HTML5-Animation-with-JavaScript

    ### HTML5与JavaScript动画:深度解析与应用技巧 #### 基础概念与技术要点 **HTML5动画**,作为现代网页设计中的一个重要组成部分,它不仅提升了用户体验,还为开发者提供了更加灵活和强大的表现手段。结合...

    HTML5基础知识-Web简介.pptx

    **HTML5基础知识与Web简介** **1. Web的诞生** Web的起源可以追溯到1989年,当时由蒂姆·伯纳斯-李(Tim Berners-Lee)创建了第一个Web服务器和第一个Web客户端,这标志着World Wide Web(WWW)的诞生。WWW成为了...

    Html基础教材--源代码

    HTML5引入了许多新特性,比如`&lt;canvas&gt;`用于绘制图形,`&lt;audio&gt;`和`&lt;video&gt;`用于多媒体播放,以及`&lt;form&gt;`中的新输入类型,如`&lt;input type="email"&gt;`用于电子邮件输入验证。 在学习这些源代码时,还可以了解到如何...

    《HTML5 Canvas核心技术图形动画与游戏开发》高清中文 + 源码

    HTML5 Canvas是现代Web开发中的一个关键特性,它允许开发者在网页上绘制2D图形,创建复杂的动画效果以及构建互动式游戏。这本书《HTML5 Canvas核心技术图形动画与游戏开发》全面探讨了Canvas API的各个方面,旨在...

    js+html5 svg创建点路径生成器工具代码.zip

    HTML5和SVG(Scalable Vector Graphics)是现代网页开发中的重要技术,它们结合JavaScript可以创建出丰富的交互式图形和动态视觉效果。本压缩包"js+html5 svg创建点路径生成器工具代码.zip"提供了这样一个工具,允许...

    HTML5 Canvas核心技术—图形、动画与游戏开发【扫描版PDF(71M)+试读章节+源码】

    1. **Canvas元素**:HTML5中的 `&lt;canvas&gt;` 标签是图形绘制的基础,它提供了一个二维绘图表面,可以通过JavaScript进行操作。 2. **绘图API**:Canvas API提供了丰富的绘图方法,如`fillRect()`用于填充矩形,`...

    使用高德地图Web服务-路径规划,用ArcGIS JS显示数据在天地图底图上

    总结来说,这个项目涵盖了高德地图Web服务的路径规划,ArcGIS JS的图层管理和图形渲染,以及天地图的集成。通过这个实践,开发者不仅可以学习到GIS应用开发的基本流程,还能深入了解不同地图服务之间的交互与整合。

    html5-canvas-3d-earth-rotate.zip

    HTML5 Canvas是一个强大的绘图工具,允许开发者在网页上进行动态图形绘制,为网页带来了丰富的交互性和视觉效果。 **HTML5 Canvas** HTML5 Canvas是HTML5标准的一部分,它提供了一个2D渲染上下文,通过JavaScript ...

    HTML5系列教程-HTML5框架、背景和实体

    本系列教程将深入探讨HTML5的框架、背景以及实体,帮助你全面掌握这一现代Web开发的基础。 1. **HTML5框架** - **Bootstrap**:是最受欢迎的前端框架之一,提供了响应式设计和丰富的组件库,简化了页面布局和样式...

    《HTML5 Canvas核心技术 图形、动画与游戏开发》

    通过学习《HTML5 Canvas核心技术 图形、动画与游戏开发》,读者将掌握如何利用Canvas进行复杂图形绘制、流畅动画制作,以及开发互动性游戏的基础知识。这本书适合对游戏开发有兴趣的初学者,也对有经验的开发者提供...

    html5-canvas-web-图片涂鸦

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创造出丰富的交互式用户体验。"html5-canvas-web-图片涂鸦"这个主题涉及到的知识点主要集中在如何利用HTML5的Canvas API来实现图片...

    html5-image-extrusion.zip

    传统的HTML4只能通过标签插入静态图片,而HTML5则引入了Canvas元素,这是一个基于矢量图形的画布,允许开发者通过JavaScript动态绘制图形,包括对图像进行各种操作,如裁剪、旋转、滤镜效果,甚至创建3D效果。...

    HTML5 Canvas核心技术 图形、动画与游戏开发

    ### HTML5 Canvas核心技术:图形、动画与游戏开发 #### 第1章 基础知识 - **1.1 canvas元素** - **1.1.1 canvas元素的大小与绘图表面的大小**:`canvas`元素是HTML5中新增的一个用于绘制图形的标签。它本身并不...

    html5 canvas核心技术图形、动画与游戏开发完整源码

    HTML5 Canvas是Web开发中的一个强大工具,它允许开发者在网页上进行动态图形绘制,创建丰富的交互式用户体验,包括动画和游戏。这个“HTML5 Canvas核心技术图形、动画与游戏开发完整源码”压缩包可能包含了多个示例...

Global site tag (gtag.js) - Google Analytics