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 相关文章推荐
JScript内置对象Array中元素的删除方法
Mar 08 Javascript
js浮点数精确计算(加、减、乘、除)
Dec 26 Javascript
JavaScript中用于生成随机数的Math.random()方法
Jun 15 Javascript
Ionic项目中Native Camera的使用方法
Jun 07 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
Jul 18 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
微信小程序日历组件使用方法详解
Dec 29 Javascript
JavaScript私有变量实例详解
Jan 24 Javascript
详解vue项目中使用token的身份验证的简单实践
Mar 08 Javascript
layui-table对返回的数据进行转变显示的实例
Sep 04 Javascript
小谈angular ng deploy的实现
Apr 07 Javascript
vue watch监控对象的简单方法示例
Jan 07 Vue.js
详解刷新页面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
PHP4与PHP5的时间格式问题
2008/02/17 PHP
php简单分页类实现方法
2015/02/26 PHP
ThinkPHP模型详解
2015/07/27 PHP
thinkphp中字符截取函数msubstr()用法分析
2016/01/09 PHP
JavaScript 快捷键设置实现代码
2009/03/13 Javascript
JSChart轻量级图形报表工具(内置函数中文参考)
2010/10/11 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
JS中dom0级事件和dom2级事件的区别介绍
2016/05/05 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
使用jQuery实现一个类似GridView的编辑,更新,取消和删除的功能
2017/03/15 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
js实现延迟加载的几种方法详解
2019/01/19 Javascript
微信小程序云开发 搭建一个管理小程序
2019/05/17 Javascript
layui实现三级导航菜单
2019/07/26 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
JavaScript实现多层颜色选项卡嵌套
2020/09/21 Javascript
Openlayers实现地图全屏显示
2020/09/28 Javascript
python计算最小优先级队列代码分享
2013/12/18 Python
在Python中使用列表生成式的教程
2015/04/27 Python
python使用wmi模块获取windows下硬盘信息的方法
2015/05/15 Python
详解python的几种标准输出重定向方式
2016/08/15 Python
Python中作用域的深入讲解
2018/12/10 Python
Python 实现try重新执行
2019/12/21 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
python+selenium自动化实战携带cookies模拟登陆微博
2021/01/19 Python
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
Europcar比利时:租车
2019/08/26 全球购物
WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用?
2015/08/25 面试题
授权委托书(法人单位用)
2014/09/29 职场文书
党员个人整改方案及措施
2014/10/25 职场文书
学习保证书怎么写
2015/02/26 职场文书
道歉信范文
2015/05/12 职场文书
消费者理赔投诉书
2015/07/02 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书