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捕获超链接事件进行局部刷新代码
May 10 Javascript
js/html光标定位的实现代码
Sep 23 Javascript
javascript中通过arguments参数伪装方法重载
Oct 08 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
Javascript计算二维数组重复值示例代码
Dec 18 Javascript
使用JS在浏览器中判断当前网络连接状态的几种方法
May 05 Javascript
vue2.0 axios前后端数据处理实例代码
Jun 30 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
Dec 25 Javascript
详解Vue源码学习之双向绑定
Apr 10 Javascript
django中使用vue.js的要点总结
Jul 07 Javascript
使用refresh_token实现无感刷新页面
Apr 26 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 字符串长度判断效率更高的方法
2014/03/02 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
laravel 中某一字段自增、自减的例子
2019/10/11 PHP
7款吸引人眼球的jQuery/CSS3特效实例分享
2013/04/25 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
node-webkit打包成exe文件被360误报木马的解决方法
2015/03/11 Javascript
js实现1,2,3,5数字按照概率生成
2017/09/12 Javascript
Nuxt.js踩坑总结分享
2018/01/18 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
vue使用lodop打印控件实现浏览器兼容打印的方法
2021/02/07 Vue.js
跟老齐学Python之不要红头文件(1)
2014/09/28 Python
Python编程入门之Hello World的三种实现方式
2015/11/13 Python
Tensorflow之构建自己的图片数据集TFrecords的方法
2018/02/07 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
python解析含有重复key的json方法
2019/01/22 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
Django对数据库进行添加与更新的例子
2019/07/12 Python
使用python实现飞机大战游戏
2020/03/23 Python
如何让python的运行速度得到提升
2020/07/08 Python
英国天然宝石首饰购买网站:Gemondo Jewellery
2018/10/23 全球购物
澳大利亚人信任的清洁平台,您的私人管家:Jarvis
2020/12/25 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
文化与传播毕业生求职信
2014/03/09 职场文书
新年联欢会主持词
2014/03/27 职场文书
2014年大学团支部工作总结
2014/12/02 职场文书
2014年终工作总结范本
2014/12/15 职场文书
贷款工作证明模板
2015/06/12 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
在 SQL 语句中处理 NULL 值的方法
2021/06/07 SQL Server
如何优化vue打包文件过大
2022/04/13 Vue.js
Windows Server 版本 20H2 于 8 月 9 日停止支持,Win10 版本 21H1 将于 12 月结束支
2022/07/23 数码科技