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 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
ASP中Sub和Function的区别说明
Aug 30 Javascript
基于jquery的放大镜效果
May 30 Javascript
BootStrap 实现各种样式的进度条效果
Dec 07 Javascript
canvas实现动态小球重叠效果
Feb 06 Javascript
原生JavaScrpit中异步请求Ajax实现方法
Nov 03 Javascript
详解利用Angular实现多团队模块化SPA开发框架
Nov 27 Javascript
JavaScript继承与多继承实例分析
May 26 Javascript
vue实现element-ui对话框可拖拽功能
Aug 17 Javascript
angularjs1.5 组件内用函数向外传值的实例
Sep 30 Javascript
详解微信小程序中var、let、const用法与区别
Jan 11 Javascript
原生js实现点击轮播切换图片
Feb 11 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中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
PHP安全性漫谈
2012/06/28 PHP
Web程序工作原理详解
2014/12/25 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
2017/05/09 PHP
php实现socket推送技术的示例
2017/12/20 PHP
基于jquery的分页控件(C#)
2011/01/06 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
javaScript基础语法介绍
2015/02/28 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
JavaScript实现单击下拉框选择直接跳转页面的方法
2015/07/02 Javascript
SublimeText自带格式化代码功能之reindent
2015/12/27 Javascript
javascript this详细介绍
2016/09/19 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
JS实现根据指定值删除数组中的元素操作示例
2018/08/02 Javascript
Vue2.0 实现歌手列表滚动及右侧快速入口功能
2018/08/08 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
深入了解JavaScript 防抖和节流
2019/09/12 Javascript
node创建Vue项目步骤详解
2020/03/06 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
vue实现简易计算器功能
2021/01/20 Vue.js
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
python正则表达式判断字符串是否是全部小写示例
2013/12/25 Python
python中黄金分割法实现方法
2015/05/06 Python
Windows系统下使用flup搭建Nginx和Python环境的方法
2015/12/25 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
解决Python安装时报缺少DLL问题【两种解决方法】
2019/07/15 Python
python:动态路由的Flask程序代码
2019/11/22 Python
HTML5中的进度条progress元素简介及兼容性处理
2016/06/02 HTML / CSS
测试工程师职业规划书
2014/02/06 职场文书
学术研讨会主持词
2015/07/04 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
golang json数组拼接的实例
2021/04/28 Golang