基于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 相关文章推荐
转换json格式的日期为Javascript对象的函数
Jul 13 Javascript
6款经典实用的jQuery小插件及源码(对话框/提示工具等等)
Feb 04 Javascript
javascript中数组的concat()方法使用介绍
Dec 18 Javascript
canvas实现动态小球重叠效果
Feb 06 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
使用Node.js搭建静态资源服务详细教程
Aug 02 Javascript
解决ie img标签内存泄漏的问题
Oct 13 Javascript
javascript基于定时器实现进度条功能实例
Oct 13 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
Angular 4根据组件名称动态创建出组件的方法教程
Nov 01 Javascript
JavaScript变量基本使用方法实例分析
Nov 15 Javascript
jQuery实现倒计时功能完整示例
Jun 01 jQuery
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的session反序列化漏洞问题
2017/06/15 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
javascript编程起步(第六课)
2007/01/10 Javascript
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
HTML复选框和单选框 checkbox和radio事件介绍
2012/12/12 Javascript
window.requestAnimationFrame是什么意思,怎么用
2013/01/13 Javascript
jQuery添加和删除指定标签的方法
2015/12/16 Javascript
canvas学习之API整理笔记(二)
2016/12/29 Javascript
React组件的三种写法总结
2017/01/12 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
2017/02/28 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
JavaScript阻止表单提交方法(附代码)
2017/08/15 Javascript
vue webuploader 文件上传组件开发
2017/09/23 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
原来JS还可以这样拆箱转换详解
2019/02/01 Javascript
python使用scrapy解析js示例
2014/01/23 Python
python实现爬虫统计学校BBS男女比例(一)
2015/12/31 Python
使用python实现knn算法
2017/12/20 Python
对python读取CT医学图像的实例详解
2019/01/24 Python
20行python代码的入门级小游戏的详解
2019/05/05 Python
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
Manuka Doctor英国官网:真正的麦卢卡蜂蜜和护肤品
2018/10/26 全球购物
自我鉴定范文
2013/11/10 职场文书
公司庆典活动邀请函
2014/01/09 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
自我推荐信范文
2014/05/09 职场文书
影子教师研修方案
2014/06/14 职场文书
中国梦读书活动总结
2014/07/10 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
大学军训心得体会800字
2016/01/11 职场文书
励志正能量20句:送给所有为梦想拼搏的人
2019/11/11 职场文书
浅谈Redis的keys命令到底有多慢
2021/10/05 Redis
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript