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 相关文章推荐
ImageFlow可鼠标控制图片滚动
Jan 30 Javascript
Jquery easyUI 更新行示例
Mar 06 Javascript
Js操作树节点自动折叠展开的几种方法
May 05 Javascript
javascript生成大小写字母
Jul 03 Javascript
编写高性能Javascript代码的N条建议
Oct 12 Javascript
jQuery Validate表单验证深入学习
Dec 18 Javascript
js 自带的sort() 方法全面了解
Aug 16 Javascript
js实现简单的二级联动效果
Mar 09 Javascript
使用Xcache缓存器加速PHP网站的配置方法
Apr 22 Javascript
基于Vue.js实现tab滑块效果
Jul 23 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
Dec 25 Javascript
实现vuex原理的示例
Oct 21 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
深入php数据采集的详解
2013/06/02 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
php获取域名的google收录示例
2014/03/24 PHP
在CentOS上搭建LAMP+vsftpd环境的简单指南
2015/08/01 PHP
PHP中explode函数和split函数的区别小结
2016/08/24 PHP
php实现用户注册密码的crypt加密
2017/06/08 PHP
关于PhpStorm设置点击编辑文件自动定位源文件的实现方式
2020/12/30 PHP
javascript控制frame,iframe的src属性代码
2009/12/31 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
2015/08/01 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
Bootstrap实现带动画过渡的弹出框
2016/08/09 Javascript
微信小程序 网络请求(GET请求)详解
2016/11/16 Javascript
vue实现的上传图片到数据库并显示到页面功能示例
2018/03/17 Javascript
Element-UI Table组件上添加列拖拽效果实现方法
2018/04/14 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
js实现的在本地预览图片功能示例
2019/11/09 Javascript
vue 实现setInterval 创建和销毁实例
2020/07/21 Javascript
微信小程序对图片进行canvas压缩的方法示例详解
2020/11/12 Javascript
python实现倒计时的示例
2014/02/14 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
Selenium的使用详解
2018/10/19 Python
python实现列表的排序方法分享
2019/07/01 Python
详解有关PyCharm安装库失败的问题的解决方法
2020/02/02 Python
Python celery原理及运行流程解析
2020/06/13 Python
python 检测图片是否有马赛克
2020/12/01 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
2021/01/07 Python
Farnell德国:电子元器件供应商
2018/07/10 全球购物
SIXPAD智能健身仪英国官网:革命性的训练装备品牌
2018/09/27 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
LightInTheBox法国站:中国跨境电商
2020/03/05 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
工程造价自荐信
2013/10/09 职场文书
销售经理竞聘书
2014/03/31 职场文书
oracle设置密码复杂度及设置超时退出的功能
2022/06/28 Oracle