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 相关文章推荐
a标签的href和onclick 的事件的区别介绍
Jul 26 Javascript
Node.js实现批量去除BOM文件头
Dec 20 Javascript
使用JavaScript刷新网页的方法
Jun 04 Javascript
详解参数传递四种形式
Jul 21 Javascript
angularjs 源码解析之scope
Aug 22 Javascript
vue如何使用 Slot 分发内容实例详解
Sep 05 Javascript
js 中rewrap-ajax.js插件实例代码
Oct 20 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
开发用到的js封装方法(20种)
Oct 12 Javascript
VueJS 组件参数名命名与组件属性转化问题
Dec 03 Javascript
js中arguments对象的深入理解
May 14 Javascript
vue父组件给子组件的组件传值provide inject的方法
Oct 23 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
php笔记之:AOP的应用
2013/04/24 PHP
php json_encode与json_decode详解及实例
2016/12/13 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
PHP get_html_translation_table()函数用法讲解
2019/02/16 PHP
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
2012/01/13 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
JQuery实现简单的服务器轮询效果实例
2016/03/31 Javascript
修改ligerui 默认确认按钮的方法
2016/12/27 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
浅谈vue的iview列表table render函数设置DOM属性值的方法
2017/09/30 Javascript
使用JavaScript实现node.js中的path.join方法
2018/08/12 Javascript
vue-cli 打包使用history模式的后端配置实例
2018/09/20 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
[58:00]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Elephant BO3 第二场 2月7日
2021/03/11 DOTA
python分析nignx访问日志脚本分享
2015/02/26 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
2015/12/24 Python
50行Python代码实现人脸检测功能
2018/01/23 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
python中关于数据类型的学习笔记
2020/07/19 Python
python集合能干吗
2020/07/19 Python
Pytorch 图像变换函数集合小结
2021/02/01 Python
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
商务英语求职自荐信范文
2013/12/24 职场文书
我的大学生活职业生涯规划
2014/01/02 职场文书
小学教师求职信范文
2015/03/20 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
redis实现排行榜功能
2021/05/24 Redis
详解PHP服务器如何在有限的资源里最大提升并发能力
2021/05/25 PHP
Python实现生成bmp图像的方法
2021/06/13 Python
解决SpringBoot文件上传临时目录找不到的问题
2021/07/01 Java/Android
Java中的随机数Random
2022/03/17 Java/Android