canvas 元素、渲染上下文、矩形、路径、圆弧、赛贝尔曲线

https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API

<canvas>是一个可以使用脚本(通常为JavaScript)来绘制图形的 HTML 元素.
例如,它可以用于绘制图表、制作图片构图或者制作简单的(以及不那么简单的)动画. 

<canvas> 最早由Apple引入WebKit,用于Mac OS X 的 Dashboard,随后被各个浏览器实现。
如今,所有主流的浏览器都支持它。

为了在 Canvas 上绘制图形,我们使用一个JavaScript上下文对象,它能动态创建图像(creates graphics on the fly)。


canvas 元素
<canvas id="tutorial" width="150" height="150"></canvas>

与 <img> 元素不同,<canvas> 元素需要结束标签(</canvas>)。
如果结束标签不存在,则文档的其余部分会被认为是替代内容,将不会显示出来。

渲染上下文(The rendering context)
<canvas> 元素创造了一个固定大小的画布,它公开了一个或多个渲染上下文,其可以用来绘制和处理要展示的内容。
var canvas = document.getElementById('tutorial');
var ctx = canvas.getContext('2d');

画布栅格(canvas grid)以及坐标空间
栅格的起点为左上角(坐标为(0,0))。所有元素的位置都相对于原点定位。

不同于 SVG,<canvas> 只支持两种形式的图形绘制:矩形和路径(由一系列点连成的线段)。

fillRect(x, y, width, height)
绘制一个填充的矩形

strokeRect(x, y, width, height)
绘制一个矩形的边框

clearRect(x, y, width, height)
清除指定矩形区域,让清除部分完全透明。

x与y指定了在canvas画布上所绘制的矩形的左上角(相对于原点)的坐标。

图形的基本元素是路径。路径是通过不同颜色和宽度的线段或曲线相连形成的不同形状的点的集合。
一个路径,甚至一个子路径,都是闭合的。

beginPath()
新建一条路径,生成之后,图形绘制命令被指向到路径上生成路径。

closePath()
闭合路径之后图形绘制命令又重新指向到上下文中。

stroke()
通过线条来绘制图形轮廓。

fill()
通过填充路径的内容区域生成实心的图形。

moveTo(x, y)
将笔触移动到指定的坐标x以及y上。

lineTo(x, y)
绘制一条从当前位置到指定x以及y位置的直线。

arc(x, y, radius, startAngle, endAngle, anticlockwise)
画一个以(x,y)为圆心的以radius为半径的圆弧(圆),从startAngle开始到endAngle结束,按照anticlockwise给定的方向(默认为顺时针)来生成。
arc方法有六个参数:x,y为绘制圆弧所在圆上的圆心坐标。radius为半径。startAngle以及endAngle参数用弧度定义了开始以及结束的弧度。这些都是以x轴为基准。参数anticlockwise为一个布尔值。为true时,是逆时针方向,否则顺时针方向。
arc()函数中表示角的单位是弧度,不是角度。角度与弧度的js表达式:
弧度=(Math.PI/180)*角度。

arcTo(x1, y1, x2, y2, radius)
根据给定的控制点和半径画一段圆弧,再以直线连接两个控制点。


quadraticCurveTo(cp1x, cp1y, x, y)
绘制二次贝塞尔曲线,cp1x,cp1y为一个控制点,x,y为结束点。

bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
绘制三次贝塞尔曲线,cp1x,cp1y为控制点一,cp2x,cp2y为控制点二,x,y为结束点。

rect(x, y, width, height)
绘制一个左上角坐标为(x,y),宽高为width以及height的矩形。

Path2D 对象所有的路径方法比如moveTo, rect, arc或quadraticCurveTo等,如我们前面见过的,都可以在Path2D中使用。

function draw() {
  var canvas = document.getElementById('canvas');
  if (canvas.getContext){
    var ctx = canvas.getContext('2d');

    var rectangle = new Path2D();
    rectangle.rect(10, 10, 50, 50);

    var circle = new Path2D();
    circle.moveTo(125, 35);
    circle.arc(100, 35, 25, 0, 2 * Math.PI);

    ctx.stroke(rectangle);
    ctx.fill(circle);
  }
}


使用 SVG paths
var p = new Path2D("M10 10 h 80 v 80 h -80 Z");
这条路径将先移动到点 (M10 10) 然后再水平移动80个单位(h 80),然后下移80个单位 (v 80),接着左移80个单位 (h -80),再回到起点处 (z)。

猜你喜欢

转载自blog.csdn.net/aganliang/article/details/114274108