JavaScript实现的贝塞尔曲线算法简单示例


Posted in Javascript onJanuary 30, 2018

本文实例讲述了JavaScript实现的贝塞尔曲线算法。分享给大家供大家参考,具体如下:

如果在HTML5支持好的浏览器中,可以看到用svg绘制的路径线。

在所有浏览器中,均可以看到一个小方块沿着贝塞尔曲线路径来回运动。

效果图:

JavaScript实现的贝塞尔曲线算法简单示例

主要代码:

<div style="position:absolute;left:0;top:0;width:500px;height:300px;overflow:hidden;">
<svg id="root" width="500" height="300" viewBox="0 0 500 300" xmlns="http://www.w3.org/2000/svg">
<title>svg</title>
<path d="M20,100 c80 -200 280 200 380 0 h-400" fill="none" stroke-width="1" stroke="gray" stroke-dasharray="3,3" />
</svg>
</div>
<div id="dotMove" style="position:absolute;width:6px;height:6px;overflow:hidden;background-color:#FF0000;"></div>
<script type="text/javascript">
/*
参考维基百科
http://zh.wikipedia.org/wiki/%E8%B2%9D%E8%8C%B2%E6%9B%B2%E7%B7%9A
*/
function Point2D(x,y){
  this.x=x||0.0;
  this.y=y||0.0;
}
/*
 cp在此是四??元素的?列:
 cp[0]?槠鹗键c,或上?D中的P0
 cp[1]?榈谝??控制?,或上?D中的P1
 cp[2]?榈诙??控制?,或上?D中的P2
 cp[3]?榻Y束?,或上?D中的P3
 t???抵担? <= t <= 1
*/
function PointOnCubicBezier( cp, t )
{
  var  ax, bx, cx;
  var  ay, by, cy;
  var  tSquared, tCubed;
  var  result = new Point2D ;
  /*?算多?式?S??/
  cx = 3.0 * (cp[1].x - cp[0].x);
  bx = 3.0 * (cp[2].x - cp[1].x) - cx;
  ax = cp[3].x - cp[0].x - cx - bx;
  cy = 3.0 * (cp[1].y - cp[0].y);
  by = 3.0 * (cp[2].y - cp[1].y) - cy;
  ay = cp[3].y - cp[0].y - cy - by;
  /*?算位於??抵?的曲??*/
  tSquared = t * t;
  tCubed = tSquared * t;
  result.x = (ax * tCubed) + (bx * tSquared) + (cx * t) + cp[0].x;
  result.y = (ay * tCubed) + (by * tSquared) + (cy * t) + cp[0].y;
  return result;
}
/*
 ComputeBezier以控制?cp所?生的曲??,填入Point2D???的?列。
 呼叫者必?分配足?虻挠????以供?出?果,其??lt;sizeof(Point2D) numberOfPoints>
*/
function ComputeBezier( cp, numberOfPoints, curve )
{
  var  dt;
  var  i;
  dt = 1.0 / ( numberOfPoints - 1 );
  for( i = 0; i < numberOfPoints; i++)
    curve[i] = PointOnCubicBezier( cp, i*dt );
}
var cp=[
  new Point2D(20, 0), new Point2D(100, 200), new Point2D(300, -200), new Point2D(400, 0)
];
var numberOfPoints=100;
var curve=[];
ComputeBezier( cp, numberOfPoints, curve );
var i=0, dot=document.getElementById("dotMove");
setInterval(function (){
  var j = (i<100)?i:(199-i);
  dot.style.left=curve[j].x+'px';
  dot.style.top=100-curve[j].y+'px';
  if(++i==200)i=0;
}, 50);
</script>

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JQuery AJAX提交中文乱码的解决方案
Jul 02 Javascript
TinyMCE 新增本地图片上传功能
Nov 05 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
Aug 15 Javascript
js基于面向对象实现网页TAB选项卡菜单效果代码
Sep 09 Javascript
Bootstrap每天必学之按钮(Button)插件
Apr 25 Javascript
jQuery简单设置文本框回车事件的方法
Aug 01 Javascript
纯js实现倒计时功能
Jan 06 Javascript
Vue.js数据绑定之data属性
Jul 07 Javascript
vue-resource请求实现http登录拦截或者路由拦截的方法
Jul 11 Javascript
js限制input只能输入有效的数字(第一个不能是小数点)
Sep 28 Javascript
vue.js实现h5机器人聊天(测试版)
Jul 16 Javascript
Vue+Spring Boot简单用户登录(附Demo)
Nov 12 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
Jan 30 #Javascript
AngularJS双向数据绑定原理之$watch、$apply和$digest的应用
Jan 30 #Javascript
微信小程序数据存储与取值详解
Jan 30 #Javascript
Vue精简版风格概述
Jan 30 #Javascript
vue自定义全局组件(自定义插件)的用法
Jan 30 #Javascript
vue2.0之多页面的开发的示例
Jan 30 #Javascript
vue-cli实现多页面多路由的示例代码
Jan 30 #Javascript
You might like
SONY ICF-SW07收音机电路分析
2021/03/02 无线电
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php实现mysql封装类示例
2014/05/07 PHP
PHP实现的增强性mhash函数
2015/05/27 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
Javascript类型系统之undefined和null浅析
2016/07/13 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
vue检测对象和数组的变化分析
2018/06/30 Javascript
vue项目打包后上传至GitHub并实现github-pages的预览
2019/05/06 Javascript
vue + typescript + video.js实现 流媒体播放 视频监控功能
2019/07/07 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
Vue实现小购物车功能
2020/12/21 Vue.js
python获取文件版本信息、公司名和产品名的方法
2014/10/05 Python
Python计算回文数的方法
2015/03/11 Python
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
使用Python的Tornado框架实现一个Web端图书展示页面
2016/07/11 Python
Python 3.7新功能之dataclass装饰器详解
2018/04/21 Python
详解Django+Uwsgi+Nginx 实现生产环境部署
2018/11/06 Python
Python多图片合并PDF的方法
2019/01/03 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
python做接口测试的必要性
2019/11/20 Python
Python实现仿射密码的思路详解
2020/04/23 Python
python 追踪except信息方式
2020/04/25 Python
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
小学教师师德感言
2014/02/10 职场文书
春节联欢晚会主持词范文
2014/03/24 职场文书
论文评语大全
2014/04/29 职场文书
2014年学习厉行节约反对浪费思想汇报
2014/09/10 职场文书
python3 hdf5文件 遍历代码
2021/05/19 Python
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技