javascript Canvas动态粒子连线


Posted in Javascript onJanuary 01, 2020

好久没写博客了,最近负责了公司年会的大屏签到、滚动抽奖、节目投票,整个项目做下来有惊也有喜。期间用到了Canvas制作动画,我这边就简单做了个动态粒子连线的例子与大家分享。

一、效果图

javascript Canvas动态粒子连线

二、思路如下:

1.绘制随机区域的粒子,记录每个粒子x轴、y轴坐标以及x轴与y轴每次移动的距离

2.通过定时函数使得粒子进行移动,移动后判断是否超过界限,超过则将该粒子删除并生成一个新的粒子

3.判断所有粒子之间的距离,对给定距离的粒子进行连线。

三、代码如下:

<!DOCTYPE html>
<html>
 <head>
 <meta charset="UTF-8">
 <title>Canvas动态粒子连线</title>
 </head>
 
 <body>
 <canvas id="myCanvas" style="border: 1px solid #ddd; display: block;margin: 20px auto;"></canvas>
 <script>
 var myCanvas = document.getElementById("myCanvas");
 myCanvas.width = "800";
 myCanvas.height = "800";
 var cxt = myCanvas.getContext("2d");
 cxt.fillStyle="#ddd";
 var points =new Array();
 //绘制60个粒子
 for(var i=0;i<60;i++)
 {
 drawlizi();
 }
 setInterval(movelizi,100);
 
 //绘制静态粒子
 function drawlizi(){
 var x = generate_random(3,797);
 var y = generate_random(3,797);
 var speedx = generate_random(-4,4);
 var speedy = generate_random(-4,4);
 //防止出现不移动的粒子
 while(speedx==0&&speedy==0)
 {
 speedx = generate_random(-4,4);
 speedy = generate_random(-4,4);
 }
 var point={
 x_index:x,
 y_index:y,
 x_speed:speedx,
 y_speed:speedy
 };
 points.push(point);
 cxt.beginPath();
 cxt.arc(x,y,3,0,360);
 cxt.closePath();
 cxt.fill();
 }
 
 //粒子移动
 function movelizi(){
 cxt.clearRect(0, 0,myCanvas.width,myCanvas.height);
 for(var i=0;i<points.length;i++)
 {
 points[i].x_index = points[i].x_index+points[i].x_speed;
 points[i].y_index = points[i].y_index+points[i].y_speed;
 cxt.beginPath();
 cxt.arc(points[i].x_index,points[i].y_index,3,0,360);
 cxt.closePath();
 cxt.fill();
 //判断超过界限删除并再生
 if((points[i].x_index<3||points[i].y_index<3)||(points[i].x_index>797||points[i].y_index<3)||(points[i].x_index<3||points[i].y_index>797)||(points[i].x_index>797||points[i].y_index>797)){
 points.splice(i,1);
 drawlizi();
 }
 }
 //相近的粒子进行连线
 for (var i=0;i<points.length;i++) {
 for (var j=0;j<points.length;j++) {
 if(i!=j)
 {
 var one_x = points[i].x_index;
 var one_y = points[i].y_index;
 var two_x = points[j].x_index;
 var two_y = points[j].y_index;
 // 根据两点间的距离公式,小于界限值便进行连线
 var jl = Math.sqrt(Math.pow(one_x-two_x,2)+Math.pow(one_y-two_y,2));
 if(jl<100)
 {
 cxt.strokeStyle="#ddd";
 cxt.moveTo(one_x,one_y);
 cxt.lineTo(two_x,two_y);
 cxt.stroke();
 }
 }
 }
 }
 }
 //生成两个数之间的随机数
 function generate_random(min,max){
 return Math.floor(Math.random()*(max-min)+min);
 } 
 </script>
 </body>
 
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery+json实现数据列表分页示例代码
Nov 15 Javascript
jquery移动端TAB触屏切换实现效果
Dec 22 Javascript
浅谈jQuery中ajaxPrefilter的应用
Aug 01 Javascript
bootstrap table复杂操作代码
Nov 01 Javascript
微信小程序异步处理详解
Nov 10 Javascript
详解vue2.0+vue-video-player实现hls播放全过程
Mar 02 Javascript
解决linux下node.js全局模块找不到的问题
May 15 Javascript
Electron 如何调用本地模块的方法
Feb 01 Javascript
Node.js使用MongoDB的ObjectId作为查询条件的方法
Sep 10 Javascript
layui树形菜单动态遍历的例子
Sep 23 Javascript
js实现随机点名程序
Sep 17 Javascript
vue实现购物车结算功能
Jun 18 Javascript
小程序新版订阅消息模板消息
Dec 31 #Javascript
小程序实现长按保存图片的方法
Dec 31 #Javascript
使用webpack搭建vue环境的教程详解
Dec 31 #Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
Dec 31 #Javascript
TypeScript之调用栈的实现
Dec 31 #Javascript
Vue通过配置WebSocket并实现群聊功能
Dec 31 #Javascript
Vue实现剪贴板复制功能
Dec 31 #Javascript
You might like
如何选购合适的收音机
2021/03/01 无线电
解析PayPal支付接口的PHP开发方式
2010/11/28 PHP
PHP+Memcache实现wordpress访问总数统计(非插件)
2014/07/04 PHP
php实现比较全的数据库操作类
2015/06/18 PHP
cakephp2.X多表联合查询join及使用分页查询的方法
2017/02/23 PHP
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
javascript实现分栏显示小技巧附图
2014/10/13 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
JavaScript中通过提示框跳转页面的方法
2016/02/14 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(二)之数据支持json字符串、list集合
2016/08/11 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
浅谈js闭包理解
2019/03/28 Javascript
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Python简单生成8位随机密码的方法
2017/05/24 Python
Python实现利用163邮箱远程关电脑脚本
2018/02/22 Python
Python面向对象类继承和组合实例分析
2018/05/28 Python
利用Python库Scapy解析pcap文件的方法
2019/07/23 Python
python实现猜数字游戏
2020/03/25 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
python继承threading.Thread实现有返回值的子类实例
2020/05/02 Python
Django中FilePathField字段的用法
2020/05/21 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
CSS3标注引用的出处和来源的方法
2020/02/25 HTML / CSS
HTML5的download属性详细介绍和使用实例
2014/04/23 HTML / CSS
Desigual美国官方网站:西班牙服装品牌
2019/03/29 全球购物
初三家长会邀请函
2014/01/18 职场文书
关于运动会的稿件
2014/02/02 职场文书
优秀辅导员事迹材料
2014/02/16 职场文书
开学典礼演讲稿
2014/05/23 职场文书
销售经理岗位职责
2015/01/31 职场文书
python读取pdf格式文档的实现代码
2021/04/01 Python
《乙女游戏世界对路人角色很不友好》OP主题曲无字幕动画MV公开
2022/04/05 日漫