Canvas 线性图形(三):曲线
前言
画曲线要用到二次贝塞尔曲线或三次贝塞尔曲线。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如 PhotoShop。
二次贝塞尔曲线
二次贝塞尔曲线在一个平面中有三个点构成,P0、P1 和 P2。如下图,黑色的点与绿色线段的两端同时运动画出贝塞尔曲线,P0 是贝塞尔曲线的起始点,P1 是贝塞尔曲线的控制点,P2 是贝塞尔曲线的结束点。

在 Canvas 中绘制二次贝塞尔曲线是 quadraticCurveTo(cpx, cpy, x, y) 函数,函数中有四个参数:
- cpx:贝塞尔控制点的 x 坐标,图中 P1 在画布中的 x 坐标;
 - cpy:贝塞尔控制点的 y 坐标,图中 P1 在画布中的 y 坐标;
 - x:结束点的 x 坐标,图中 P2 在画布中的 x 坐标;
 - y:结束点的 y 坐标,图中 P2 在画布中的 y 坐标。
 
let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(10, 200); // P0 的起始坐标
ctx.quadraticCurveTo(60, 80, 200, 200);
ctx.lineWidth = 2;
ctx.strokeStyle = '#ff0000';
ctx.stroke();
确定路径的起始点,也就是moveTo(10, 200)。用二次贝塞尔曲线绘制曲线,前两个参数是贝塞尔曲线的控制点,也就是 P1;后两个参数是贝塞尔曲线最终运动的结束点,也就是 P2。

三次贝塞尔曲线
三次贝塞尔曲线在一个平面中有四个点构成,P0、P1、P2 和 P3。如下图,P0 是贝塞尔曲线的起始点,P1 和 P2 是贝塞尔曲线的控制点,P3 是贝塞尔曲线的结束点。黑色的点与绿色线段的两端同时运动画出贝塞尔曲线。
在 Canvas 中绘制二次贝塞尔曲线是 quadraticCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) 函数,函数中有六个参数:
- cp1x:贝塞尔控制点的 x 坐标,图中 P1 在画布中的 x 坐标;
 - cp1y:贝塞尔控制点的 y 坐标,图中 P1 在画布中的 y 坐标;
 - cp2x:贝塞尔控制点的 x 坐标,图中 P2 在画布中的 x 坐标;
 - cp2y:贝塞尔控制点的 y 坐标,图中 P2 在画布中的 y 坐标;
 - x:结束点的 x 坐标,图中 P3 在画布中的 x 坐标;
 - y:结束点的 y 坐标,图中 P3 在画布中的 y 坐标。
 
let canvas = document.getElementById('canvas');
let ctx = canvas.getContext('2d');
ctx.beginPath();
ctx.moveTo(30, 250);
ctx.bezierCurveTo(20, 120, 150, 120, 250, 250);
ctx.lineWidth = 2;
ctx.strokeStyle = '#FF0000';
ctx.stroke();

最终效果图如下:

Canvas 线性图形(三):曲线的更多相关文章
- Canvas 线性图形(一):路径
		
路径的概念 路径是从起始点到结束点之间的连线.个人认为,二维画布中分为线性图形和非线性图形,线性图形包括矩形.直线.曲线.圆形等各种几何图形:非线性图形包括图象.文本.像素.线性图形中又分为路径和非路 ...
 - Canvas 线性图形(五):多边形
		
前言 CanvasRenderingContext2D 没有提供绘制多边形的函数,所以只能由我们自己来实现绘制多边形的函数.以六边形为基础,需要用到三角函数:sin 和 cos. 点 A 坐标 (一) ...
 - Canvas 线性图形(四):矩形
		
函数 CanvasPath.rect(x, y, w, h) 参数名 类型 描述 x Number 矩形起始位置 y Number 矩形起始位置 w Number 矩形宽度 h Number 矩形高度 ...
 - Canvas 线性图形(二):圆形
		
函数 arc(x, y, radius, startAngle, endAngle, counterclockwise) 参数名 描述 x.y 圆心坐标轴 radius 圆的半径 startAngle ...
 - HTML5—canvas绘制图形(1)
		
1.canvas基础知识 canvas元素是HTML5中新增的一个重要的元素,专门用来绘制图形,不过canvas本身不具备画图的能力,在页面中放置了canvas元素,就相当于在页面中放置了一块矩形的“ ...
 - canvas学习总结三:绘制路径-线段
		
Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRect(),虽然strokezText(),fillText() ...
 - HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版
		
HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...
 - canvas基础—图形变换
		
1.canvas转换方法 1.1canvas转换方法 二.canvas实现图形的中心点旋转 step1:获取canva元素并指定canvas的绘图环境 var canvas=document.getE ...
 - canvas学习总结三:绘制虚线
		
上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...
 
随机推荐
- SQL如何用表A更新表B
			
文章标题很短,因为问题的描述过于具体,标题就会显得过长. 这个问题更为准确地描述应该是这样:表结构雷同或者有相似字段的两张表A和B,如何用A表的字段数据去更新B表字段的数据? 操作方法: 1 upda ...
 - Eoapi — 一个可拓展的开源 API 工具
			
 在社区中时常会出现"抱怨某商业产品越来越臃肿"的声音,API 工具也是如此.从最早期只做 API 调试的工具,到经过多年的演进后集成全面功能的"庞然大物", ...
 - k8s client-go源码分析 informer源码分析(5)-Controller&Processor源码分析
			
client-go之Controller&Processor源码分析 1.controller与Processor概述 Controller Controller从DeltaFIFO中pop ...
 - JAVA - 如何判断一个类是无用的类
			
JAVA - 如何判断一个类是无用的类 方法区主要回收的是无用的类,那么如何判断一个类是无用的类的呢? 判定一个常量是否是"废弃常量"比较简单,而要判定一个类是否是"无用 ...
 - 一个ES设置操作引发的“血案”
			
背景说明 ES版本 7.1.4 在ES生产环境中增加字段,一直提示Setting index.mapper.dynamic was removed after version 6.0.0错误.但是我只 ...
 - 使用Group By子句的时候,一定要记住下面的一些规则
			
使用Group By子句的时候,一定要记住下面的一些规则:(1)不能Group By非标量基元类型的列,如不能Group By text,image或bit类型的列(2)Select指定的每一列都应该 ...
 - 树莓派开发笔记(十七):树莓派4B+上Qt多用户连接操作Mysql数据库同步(单条数据悲观锁)
			
前言 安装了mysq数据库,最终时为了实现在一个树莓派上实现多用户多进程操作的同步问题,避免数据并发出现一些错误,本篇安装了远程服务并且讲述了使用Qt进行悲观锁for update操作,命令行进行 ...
 - Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)
			
Citus 11.0 来了! Citus 是一个 PostgreSQL 扩展,它为 PostgreSQL 添加了分布式数据库的超能力. 使用 Citus,您可以创建跨 PostgreSQL 节点集群透 ...
 - Javaweb-Servlet学习
			
1.Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个借口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个 ...
 - JavaScript写倒计时
			
在网页中,特别是电商网站中,倒计时的出现频率很高,接下来给大家介绍一下怎么用JavaScript写一个倒计时.代码如下: 首先我们通过Date构造函数的方法创建一个倒计时的结束的时间.并将其转换为毫秒 ...