基于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 相关文章推荐
js 禁用浏览器的后退功能的简单方法
Dec 10 Javascript
jQuery each()方法的使用方法
Mar 18 Javascript
Extjs中常用表单介绍与应用
Jun 07 Javascript
jQuery固定浮动侧边栏实现思路及代码
Sep 28 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
Sep 10 Javascript
JS实现同一个网页布局滑动门和TAB选项卡实例
Sep 23 Javascript
jQuery时间插件jquery.clock.js用法实例(5个示例)
Jan 14 Javascript
BootStrap轻松实现微信页面开发代码分享
Oct 21 Javascript
js时间戳和c#时间戳互转方法(推荐)
Feb 15 Javascript
Vue官方文档梳理之全局配置
Nov 22 Javascript
vue-devtools的安装步骤
Apr 23 Javascript
jquery拖拽自动排序插件使用方法详解
Jul 20 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设计模式 php实现访问者模式(Visitor)
2015/12/07 PHP
PHP迭代与递归实现无限级分类
2017/08/28 PHP
ThinkPHP5&amp;5.1框架关联模型分页操作示例
2019/08/03 PHP
用Javascript同时提交多个Web表单的方法
2009/12/26 Javascript
js中查找最近的共有祖先元素的实现代码
2010/12/30 Javascript
利用jquery的获取JS文件中的字符串内容
2012/02/14 Javascript
基于IE下ul li 互相嵌套时的bug,排查,解决过程以及心得介绍
2013/05/07 Javascript
关于onchange事件在IE和FF下的表现及解决方法
2014/03/08 Javascript
js如何判断用户是否是用微信浏览器
2014/06/05 Javascript
Node.js中使用mongoskin操作mongoDB实例
2014/09/28 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
JavaScript对象数组的排序处理方法
2015/10/21 Javascript
jquery点击改变class并toggle的实现代码
2016/05/15 Javascript
jQuery的层级查找方式分析
2016/06/16 Javascript
JS无缝滚动效果实现方法分析
2016/12/21 Javascript
JavaScript中利用for循环遍历数组
2017/01/15 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
vue+element树组件 实现树懒加载的过程详解
2019/10/21 Javascript
Python写的一个简单DNS服务器实例
2014/06/04 Python
Django中的CBV和FBV示例介绍
2018/02/25 Python
Pycharm无法使用已经安装Selenium的解决方法
2018/10/13 Python
解决新版Pycharm中Matplotlib图像不在弹出独立的显示窗口问题
2019/01/15 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
Python图像处理库PIL中图像格式转换的实现
2020/02/26 Python
python利用opencv保存、播放视频
2020/11/02 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
经典c++面试题六
2012/01/18 面试题
领导的自我鉴定
2013/12/28 职场文书
业务内勤岗位职责
2014/04/30 职场文书
生活部的活动方案
2014/08/19 职场文书
2014年个人工作总结模板
2014/12/15 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS
Android使用EventBus发送消息,Fragment中接收消息的方法会执行多次
2022/04/24 Java/Android