前言

画曲线要用到二次贝塞尔曲线或三次贝塞尔曲线。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如 PhotoShop。

二次贝塞尔曲线

二次贝塞尔曲线在一个平面中有三个点构成,P0、P1 和 P2。如下图,黑色的点与绿色线段的两端同时运动画出贝塞尔曲线,P0 是贝塞尔曲线的起始点,P1 是贝塞尔曲线的控制点,P2 是贝塞尔曲线的结束点

在 Canvas 中绘制二次贝塞尔曲线是 quadraticCurveTo(cpx, cpy, x, y) 函数,函数中有四个参数:

  1. cpx:贝塞尔控制点的 x 坐标,图中 P1 在画布中的 x 坐标;
  2. cpy:贝塞尔控制点的 y 坐标,图中 P1 在画布中的 y 坐标;
  3. x:结束点的 x 坐标,图中 P2 在画布中的 x 坐标;
  4. 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) 函数,函数中有六个参数:

  1. cp1x:贝塞尔控制点的 x 坐标,图中 P1 在画布中的 x 坐标;
  2. cp1y:贝塞尔控制点的 y 坐标,图中 P1 在画布中的 y 坐标;
  3. cp2x:贝塞尔控制点的 x 坐标,图中 P2 在画布中的 x 坐标;
  4. cp2y:贝塞尔控制点的 y 坐标,图中 P2 在画布中的 y 坐标;
  5. x:结束点的 x 坐标,图中 P3 在画布中的 x 坐标;
  6. 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 线性图形(三):曲线的更多相关文章

  1. Canvas 线性图形(一):路径

    路径的概念 路径是从起始点到结束点之间的连线.个人认为,二维画布中分为线性图形和非线性图形,线性图形包括矩形.直线.曲线.圆形等各种几何图形:非线性图形包括图象.文本.像素.线性图形中又分为路径和非路 ...

  2. Canvas 线性图形(五):多边形

    前言 CanvasRenderingContext2D 没有提供绘制多边形的函数,所以只能由我们自己来实现绘制多边形的函数.以六边形为基础,需要用到三角函数:sin 和 cos. 点 A 坐标 (一) ...

  3. Canvas 线性图形(四):矩形

    函数 CanvasPath.rect(x, y, w, h) 参数名 类型 描述 x Number 矩形起始位置 y Number 矩形起始位置 w Number 矩形宽度 h Number 矩形高度 ...

  4. Canvas 线性图形(二):圆形

    函数 arc(x, y, radius, startAngle, endAngle, counterclockwise) 参数名 描述 x.y 圆心坐标轴 radius 圆的半径 startAngle ...

  5. HTML5—canvas绘制图形(1)

    1.canvas基础知识 canvas元素是HTML5中新增的一个重要的元素,专门用来绘制图形,不过canvas本身不具备画图的能力,在页面中放置了canvas元素,就相当于在页面中放置了一块矩形的“ ...

  6. canvas学习总结三:绘制路径-线段

    Canvas绘图环境中有些属于立即绘制图形方法,有些绘图方法是基于路径的. 立即绘制图形方法仅有两个strokeRect(),fillRect(),虽然strokezText(),fillText() ...

  7. HTML5 Canvas核心技术:图形、动画与游戏开发 PDF扫描版​

    HTML5 Canvas核心技术:图形.动画与游戏开发 内容简介: <HTML5 Canvas核心技术:图形.动画与游戏开发>中,畅销书作家David Geary(基瑞)先生以实用的范例程 ...

  8. canvas基础—图形变换

    1.canvas转换方法 1.1canvas转换方法 二.canvas实现图形的中心点旋转 step1:获取canva元素并指定canvas的绘图环境 var canvas=document.getE ...

  9. canvas学习总结三:绘制虚线

    上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...

随机推荐

  1. 架构师必备:HBase行键设计与应用

    首先要回答一个问题,为何要使用HBase? 随着业务不断发展.数据量不断增大,MySQL数据库存在这些问题: MySQL支持的数据量为TB级,不能一直保留历史数据.而HBase支持的数据量为PB级,适 ...

  2. 第2章 C++编程入门

    C++中的数据分为常量和变量. 2.1常量(Constants) 顾名思义,常量的值在程序中不能改变 Type of constant(常量数据类型) | integer:整型 | floating- ...

  3. VBA驱动SAP GUI实现办公自动化(一)

    小爬之前写过一系列Python驱动SAP GUI实现办公自动化的文章,其实如果我们的实际业务不是太复杂,且我们对VBA语法比较熟悉的话,我们完全可以借助Excel VBA来驱动SAP GUI做很多自动 ...

  4. make 随笔

    # --with--cc-opt flag导致./configure时找不到对应库文件? checking for --with-ld-opt="-Wl,-z,relro -Wl,-z,no ...

  5. springboot available: expected at least 1 bean which qualifies as autowire candidate奇葩问题

    Exception encountered during context initialization - cancelling refresh attempt: org.springframewor ...

  6. 关于Vue在面试中常常被提到的几点(持续更新……)

    1.Vue项目中为什么要在列表组件中写key,作用是什么? 我们在业务组件中,会经常使用循环列表,当时用v-for命令时,会在后面写上:key,那么为什么建议写呢? key的作用是更新组件时判断两个节 ...

  7. Vue回炉重造之三次封装axios

    源码目录 在src目录下建立一个request文件夹.里面建立两个文件: http.js api.js 源码内容 http.js import axios from 'axios' // 引入axio ...

  8. NC202492 仓库选址

    NC202492 仓库选址 题目 题目描述 牛能在某小城有了固定的需求,为了节省送货的费用,他决定在小城里建一个仓库,但是他不知道选在哪里,可以使得花费最小. 给出一个 \(m \times n\) ...

  9. docker下node环境搭建

    初始化⼀个NodeJs程序 以下操作必须已经安装了NodeJS. ⾸先创建⼀个空⽂件夹.并创建以下⽂件: server.js package.json Dockerfile .dockerignore ...

  10. 关于使用netstat -lantup查看的SSHD 6010端口解释

    关于使用netstat -lantup查看的SSHD 6010端口解释: 1.使用netstat -lantup查看当前系统开启的服务端口 tcp6       0      0 ::1:6010   ...