基于js Canvas实现二次贝塞尔曲线


Posted in Javascript onDecember 25, 2018

本文实例为大家分享了js Canvas实现二次贝塞尔曲线的具体代码,供大家参考,具体内容如下

先上效果图:

基于js Canvas实现二次贝塞尔曲线

实现代码:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>二次贝塞尔曲线</title>
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
 body, h1{margin:0;}
 canvas{margin: 20px; }
</style>
</head>
<body>
 <h1>二次贝塞尔曲线</h1>
 <canvas id="canvas" width=600 height=600 style="border: 1px solid #ccc;"></canvas>
<script>
 /**
 * @param sx 起始点x坐标
 * @param sy 起始点y坐标
 * @param ex 结束点x坐标
 * @param ey 结束点y坐标
 * @param cx 控制点x坐标
 * @param cy 控制点y坐标
 * @param part 将起始点到控制点的线段分成的份数,数值越高,计算出的曲线越精确
 */
 function draw(sx, sy, ex, ey, cx, cy, part) {
 var canvas = document.getElementById('canvas');
 var ctx = canvas.getContext('2d'); 
 //绘制起始点、控制点、终点 
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 ctx.lineTo(cx, cy);
 ctx.lineTo(ex, ey);
 ctx.stroke();
 
 // 绘制二次贝塞尔曲线
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 // 起始点到控制点的x和y每次的增量
 var changeX1 = (cx - sx) / part;
 var changeY1 = (cy - sy) / part;
 // 控制点到结束点的x和y每次的增量
 var changeX2 = (ex - cx) / part;
 var changeY2 = (ey - cy) / part;
 
 for(var i = 0; i < part; i++) {
 // 计算两个动点的坐标
 var qx1 = sx + changeX1 * i;
 var qy1 = sy + changeY1 * i;
 var qx2 = cx + changeX2 * i;
 var qy2 = cy + changeY2 * i;
 // 计算得到此时的一个贝塞尔曲线上的点坐标
 var bx = qx1 + (qx2 - qx1) * i / part;
 var by = qy1 + (qy2 - qy1) * i / part;
 
 ctx.lineTo(bx, by);
 }
 ctx.stroke();
 }
 
 window.onload = function () {
 draw(0, 0, 600, 0, 150, 450, 100);
 };
</script>
</body>
</html>

上面的是静态的,来个动态的看一看:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>二次贝塞尔曲线</title>
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
 body, h1{margin:0;}
 canvas{margin: 20px; }
</style>
</head>
<body>
 <h1>二次贝塞尔曲线</h1>
 <canvas id="canvas" width=600 height=600 style="border: 1px solid #ccc;"></canvas>
<script>
 /**
 * @param sx 起始点x坐标
 * @param sy 起始点y坐标
 * @param ex 结束点x坐标
 * @param ey 结束点y坐标
 * @param cx 控制点x坐标
 * @param cy 控制点y坐标
 * @param part 将起始点到控制点的线段分成的份数,数值越高,计算出的曲线越精确
 * @param interval 画图的间隔
 * @return function 调用一次就向后画一段曲线
 */
 function draw(sx, sy, ex, ey, cx, cy, part, interval) {
 var canvas = document.getElementById('canvas');
 var ctx = canvas.getContext('2d'); 
 //绘制起始点、控制点、终点 
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 ctx.lineTo(cx, cy);
 ctx.lineTo(ex, ey);
 ctx.stroke();
 
 // 绘制二次贝塞尔曲线
 ctx.beginPath();
 ctx.moveTo(sx, sy);
 // 起始点到控制点的x和y每次的增量
 var changeX1 = (cx - sx) / part;
 var changeY1 = (cy - sy) / part;
 // 控制点到结束点的x和y每次的增量
 var changeX2 = (ex - cx) / part;
 var changeY2 = (ey - cy) / part;
 // 上次的点坐标
 var lastX = sx;
 var lastY = sy;
 
 var i = 0;
 
 return function () {
 // 计算两个动点的坐标
 var qx1 = sx + changeX1 * i;
 var qy1 = sy + changeY1 * i;
 var qx2 = cx + changeX2 * i;
 var qy2 = cy + changeY2 * i;
 // 计算得到此时的一个贝塞尔曲线上的点
 var bx = qx1 + (qx2 - qx1) * i / part;
 var by = qy1 + (qy2 - qy1) * i / part;
 // 从上次的点继续画
 ctx.beginPath();
 ctx.moveTo(lastX, lastY);
 ctx.lineTo(bx, by);
 ctx.stroke();
 // 保存点坐标
 lastX = bx;
 lastY = by;
 
 i += 1;
 
 if (i < part) {
 setTimeout(arguments.callee, interval);
 }
 }
 }
 
 window.onload = function () {
 var display = draw(0, 0, 600, 0, 150, 450, 200, 50);
 display();
 };
</script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript中call的两种用法实例
Dec 13 Javascript
node.js Web应用框架Express入门指南
May 28 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
在JavaScript中处理数组之reverse()方法的使用
Jun 09 Javascript
plupload+artdialog实现多平台上传文件
Jul 19 Javascript
对Js OOP编程 创建对象的一些全面理解
Jul 26 Javascript
jquery 实现复选框的全选操作实例代码
Jan 24 Javascript
JavaScript中数组的各种操作的总结(必看篇)
Feb 13 Javascript
微信提示 在浏览器打开 效果实现过程解析
Sep 10 Javascript
react结合bootstrap实现评论功能
May 30 Javascript
解决vue项目运行npm run serve报错的问题
Oct 26 Javascript
Vue如何跨组件传递Slot的实现
Dec 14 Vue.js
JavaScript实现小球沿正弦曲线运动
Sep 07 #Javascript
微信小程序使用二次贝塞尔曲线画波浪
Dec 25 #Javascript
微信小程序开发问题之wx.previewImage
Dec 25 #Javascript
微信小程序使用for循环动态渲染页面操作示例
Dec 25 #Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 #Javascript
使用gulp构建前端自动化的方法示例
Dec 25 #Javascript
JavaScript实现的级联算法示例【省市二级联动功能】
Dec 25 #Javascript
You might like
PHP自动生成月历代码
2006/10/09 PHP
关于mysql 字段的那个点为是定界符
2007/01/15 PHP
逆序二维数组插入一元素的php代码
2012/06/08 PHP
PHP贪婪算法解决0-1背包问题实例分析
2015/03/23 PHP
PHP面向对象类型约束用法分析
2019/06/12 PHP
在laravel-admin中列表中禁止某行编辑、删除的方法
2019/10/03 PHP
JavaScript 字符串连接性能优化
2008/12/20 Javascript
JavaScript中数组的排序、乱序和搜索实现代码
2011/11/30 Javascript
js当一个变量为函数时 应该注意的一点细节小结
2011/12/29 Javascript
iframe的父子窗口之间的对象相互调用基本用法
2013/09/03 Javascript
window.open打开页面居中显示的示例代码
2013/12/27 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
使用jquery清空、复位整个输入域
2015/04/02 Javascript
js中实现字符串和数组的相互转化详解
2016/01/24 Javascript
使用jquery.form.js实现图片上传的方法
2016/05/05 Javascript
Js查找字符串中出现次数最多的字符及个数实例解析
2016/09/05 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
基于Javascript实现的不重复ID的生成器
2016/12/25 Javascript
jQuery复合事件用法示例
2017/06/10 jQuery
vue2.0 根据状态值进行样式的改变展示方法
2018/03/13 Javascript
vue打包使用Nginx代理解决跨域问题
2018/08/27 Javascript
js中this的指向问题归纳总结
2018/11/28 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
layui 实现表单和文件上传一起传到后台的例子
2019/09/16 Javascript
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
python实现单向链表详解
2018/02/08 Python
Python smtplib实现发送邮件功能
2018/05/22 Python
Python批量生成特定尺寸图片及图画任意文字的实例
2019/01/30 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
用HTML5制作烟火效果的教程
2015/05/12 HTML / CSS
澳大利亚体育和露营装备在线/实体零售商:Find Sports
2020/06/03 全球购物
仓库门卫岗位职责
2013/12/22 职场文书
六一儿童节开幕词
2015/01/29 职场文书
Pytorch 统计模型参数量的操作 param.numel()
2021/05/13 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript