基于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 相关文章推荐
用YUI做了个标签浏览效果
Feb 20 Javascript
JS获取父节点方法
Aug 20 Javascript
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
javascript操作table(insertRow,deleteRow,insertCell,deleteCell方法详解)
Dec 16 Javascript
动态的绑定事件addEventListener方法的使用
Jan 24 Javascript
IE、FF浏览器下修改标签透明度
Jan 28 Javascript
JS 清除字符串数组中,重复元素的实现方法
May 24 Javascript
详解AngularJs中$resource和restfu服务端数据交互
Sep 21 Javascript
BootStrap modal模态弹窗使用小结
Oct 26 Javascript
bootstrap suggest搜索建议插件使用详解
Mar 25 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
Feb 09 Javascript
关于js对textarea换行符的处理方法浅析
Aug 03 Javascript
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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
用apply让javascript函数仅执行一次的代码
2010/06/27 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
js+xml生成级联下拉框代码
2012/07/24 Javascript
javascript时间函数大全
2014/06/30 Javascript
jQuery获取字符串中出现最多的数
2016/02/22 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
jQuery插件实现的日历功能示例【附源码下载】
2018/09/07 jQuery
Python中的zip函数使用示例
2015/01/29 Python
复习Python中的字符串知识点
2015/04/14 Python
python简单读取大文件的方法
2016/07/01 Python
python实现FTP服务器服务的方法
2017/04/11 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
django模板获取list中指定索引的值方式
2020/05/14 Python
python实现猜单词游戏
2020/05/22 Python
Python与C/C++的相互调用案例
2021/03/04 Python
Mansur Gavriel官网:纽约市的一个设计品牌
2019/05/02 全球购物
如何为DataGridView添加一个定制的Column Type
2014/01/21 面试题
计算机专业毕业生自荐信
2013/12/31 职场文书
上课说话检讨书大全
2014/01/22 职场文书
活动策划邀请函
2014/02/06 职场文书
开业庆典主持词
2014/03/21 职场文书
保护环境倡议书
2014/04/14 职场文书
党员民主生活会材料
2014/12/15 职场文书
优秀学生干部事迹材料
2014/12/24 职场文书
作文批改评语
2014/12/25 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
机器人瓦力观后感
2015/06/12 职场文书
Mysql 如何批量插入数据
2021/04/06 MySQL
如何使用flask将模型部署为服务
2021/05/13 Python
一篇文章带你复习java知识点
2021/06/28 Java/Android
通过shell脚本对mysql的增删改查及my.cnf的配置
2021/07/07 MySQL