html5 控制鼠标移动,HTML5 Canvas随鼠标移动的引力粒子群

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

'use strict';

// Initial Setup

var canvas = document.querySelector('canvas');

var c = canvas.getContext('2d');

canvas.width = innerWidth;

canvas.height = innerHeight;

// Variables

var mouse = {

x: innerWidth / 2,

y: innerHeight / 2

};

var ballCount = 750;

var balls = [];

var gravityPos = [];

var friction = .995;

var explosionDistance = 2;

var shouldExplode = false;

var colors = ['#81C3D7', '#D9DCD6', '#3A7CA5', '#2F6690'];

var bgColor = '#16425B';

// Event Listeners

addEventListener("mousemove", function(event) {

mouse.x = event.clientX;

mouse.y = event.clientY;

gravityPos = [mouse.x, mouse.y];

});

addEventListener("mouseout", function(event) {

gravityPos = [canvas.width / 2, canvas.height / 2];

});

addEventListener("resize", function() {

canvas.width = innerWidth;

canvas.height = innerHeight;

init();

});

addEventListener("click", function() {

init();

});

// Utility Functions

function randomIntFromRange(min, max) {

return Math.floor(Math.random() * (max - min + 1) + min);

}

function randomeFloatFromRange(min, max) {

return Math.random() * (max - min) + min;

}

function randomColor(colors) {

return colors[Math.floor(Math.random() * colors.length)];

}

// Objects

function Ball(px, py, vx, vy, f, radius, color) {

this.p = [px, py];

this.v = [vx, vy];

this.gv = [0, 0];

this.gp = 0;

this.radius = radius;

this.color = color;

this.f = f;

this.update = function() {

// calculate gravity vector

this.gv = [gravityPos[0] - this.p[0], gravityPos[1] - this.p[1]];

// Calculate gravity intensity

var a = gravityPos[0] - this.p[0];

var b = gravityPos[1] - this.p[1];

this.gp = 1 / Math.sqrt(a * a + b * b);

// Explode if needed

if (shouldExplode) {

this.v[0] *= randomeFloatFromRange(-10, 10);;

this.v[1] *= randomeFloatFromRange(-10, 10);;

}

// Reduce ball's own velocity with friction

this.v[0] *= this.f;

this.v[1] *= this.f;

// Calculate new velocity, add gravity

this.v[0] += this.gv[0] * this.gp * this.f;

this.v[1] += this.gv[1] * this.gp * this.f;

// Move

this.p[0] += this.v[0];

this.p[1] += this.v[1];

this.draw();

};

this.draw = function() {

c.save();

c.beginPath();

c.arc(this.p[0], this.p[1], this.radius, 0, Math.PI * 2, false);

c.fillStyle = this.color;

c.fill();

c.closePath();

c.restore();

};

}

// Implementation

function init() {

gravityPos = [canvas.width / 2, canvas.height / 2];

balls = [];

for (var i = 0; i < ballCount; i++) {

var rd = randomeFloatFromRange(1, 7);

var px = randomeFloatFromRange(0, canvas.width / 3) + canvas.width / 3;

var py = randomeFloatFromRange(0, canvas.height / 3) + canvas.height / 3;

var vx = randomeFloatFromRange(-10, 10);

var vy = randomeFloatFromRange(-10, 10);

var f = friction;

balls.push(new Ball(px, py, vx, vy, f, rd, randomColor(colors)));

}

}

// Animation Loop

function animate() {

requestAnimationFrame(animate);

resetCanvas(bgColor);

updateShouldExplode();

for (var i = 0; i < balls.length; i++) {

balls[i].update();

}

}

init();

animate();

function resetCanvas(color) {

if (color) {

c.save();

c.fillStyle = color;

c.fillRect(0, 0, canvas.width, canvas.height);

c.restore();

} else {

c.clearRect(0, 0, canvas.width, canvas.height);

}

}

function updateShouldExplode() {

var x = 0;

var y = 0;

for (var i = 0; i < balls.length; i++) {

x += balls[i].v[0] < 0 ? balls[i].v[0] * -1 : balls[i].v[0];

y += balls[i].v[1] < 0 ? balls[i].v[1] * -1 : balls[i].v[1];

}

shouldExplode = x / balls.length < explosionDistance && y / balls.length < explosionDistance;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/303699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

茫茫内存,我该如何用 windbg 找到你 ?

一&#xff1a;背景 1. 讲故事前天wx上有个朋友丢给我一个dump&#xff0c;让我帮忙鉴定一下某些敏感信息在内存中是否也是加密的&#xff0c;现在数据安全很重要&#xff0c;不仅数据库中的信息要加密&#xff0c;灌到内存后数据同样也需密文存储&#xff0c;随用随解密&#…

初中数学知识点总结_初中数学知识点总结大全_经典版_

初中数学必考知识点总结一、基本知识㈠、数与代数A、数与式&#xff1a;1、有理数有理数&#xff1a;①整数→正整数/0/负整数②分数→正分数/负分数数轴&#xff1a;①画一条水平直线&#xff0c;在直线上取一点表示0(原点)&#xff0c;选取某一长度作为单位长度&#xff0c;规…

官方的正则表达式组件 RegularExpressions (4) : 表达式选项

TRegExOption (roNone, //无roIgnoreCase, //不区分大小写roMultiLine, //多行模式; 可使 ^ 和 $ 匹配每个行首或行尾roExplicitCapture, //只捕获指定了名称或编号的子表达式roCompiled, //预编译表达式; 这在反复使用更有效率roSing…

一篇文章,带你了解 “机器学习工程师” 必备技能图谱

5月8日&#xff0c;谷歌召开一年一度的Google I/O大会。在现场演示的演示中&#xff0c;Google Assistant表现得自然流畅&#xff0c;电话那头的理发店员工丝毫没有察觉到自己竟然是在和AI对话&#xff01;阿里的王坚博士曾在一次主题演讲里谈到&#xff1a;「不要担心 AI 毁灭…

俄语使用计算机怎么说,计算机俄语常用词汇

计算机俄语常用词汇аксессуары 附件микрофон 话筒наушники 耳机MIDI клавиатура MIDI键盘MP3 плеер MP3播放器очки 眼镜иктофон 录音机ержатель копий 拷贝存放夹Принтеры 打印机матричный…

一日一技:在Ocelot网关中实现IdentityServer4密码模式(password)

概述IdentityServer4 是为ASP.NET Core 2.系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证框架。将identityserver部署在你的应用中&#xff0c;具备如下的特点可以为你的应用&#xff08;如网站、本地应用、移动端、服务&#xff09;做集中式的登录逻辑和工作流控制…

uibot在子程序执行js失败_使用 Node.js 将珍藏的 bash 脚本封装成命令行工具

阐述如何将一个常用的 bash 脚本融入 npm 生态之中&#xff0c;此处以最近遇到的一个 CR 提交脚本为例。背景作为程序猿&#xff0c;大家或多或少地都用过 GitHub 上的 merge request 功能。当然&#xff0c;除了这类 Code Review 方式&#xff0c;不少公司都有自己的 Code Rev…

Insus Binary Utility

一个将数据流转换为binary(二进制)数据小工具&#xff0c;返回字符串。可以在三层架构中的二层程序处理数据流。 使用时需要引用名称空间using Insus.NET; 类别名称InsusBinaryUtility&#xff0c;需要实例化。 下载地址&#xff1a;http://download.cnblogs.com/insus/library…

圆周率里有每个人的银行卡密码和生日?混知乎的程序员果然都是神一般的存在...

有人好奇&#xff0c;既然圆周率是无限不循环小数&#xff0c;会不会包括这个世界上的任何信息&#xff0c;包含了这个世界&#xff1f;能否包含“任何信息”不好说&#xff0c;但一个冷知识是&#xff0c;圆周率里有每个人的银行卡密码&#xff01;不信&#xff1f;看看这位来…

如何提高Debug效率

大家好&#xff0c;我是Z哥。可以不夸张地说&#xff0c;程序员可能有一半的时间都在修bug。虽说&#xff0c;根据28原则大部分bug都可以在搜索引擎上搜到&#xff08;业务性bug除外&#xff09;&#xff0c;但是往往剩下的那20%bug会花费我们80%的时间。虽然解决这个问题最好的…

中断原理在计算机中的应用,最新 计算机原理与应用 复习3-判断题

最新 计算机原理与应用 复习题目1.INTR、INTA和NMI信号都是与中断有关的信号。( ) √2.8088在访问存储器时&#xff0c;必须用HOLD和HLDA两条信号线指示出总线是否可用。( )3.在8088时序中&#xff0c;在时钟周期T4状态期间&#xff0c;S2S1S0的任何变化指示一个总线周期的开始…

baidumap vue 判断范围_懂一点前端—Vue快速入门

01. 什么是 VueVue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架&#xff0c;是当下很火的一个 JavaScript MVVM 库&#xff0c;是以 数据驱动和组件化 的思想构建的。MVVM 模式简述下图不仅概括了 MVVM 模式 (Model-View-ViewModel)&#xff0c…

open*** 结合pam_mysql认证 failed to authenticate: Permission denied

open***的认证有很多方式&#xff0c;比如证书认证&#xff0c;用户名密码认证&#xff0c;而用户名密码认证也可用通过两种方式实现&#xff0c;一是使用pam_mysql实现open***利用mysql认证&#xff0c;二是使用radius实现open***利用mysql认证&#xff0c;网上这种配置都很多…

用文本挖掘剖析近5万首《全唐诗》,发现了这些有趣的秘密

楔子近些年来&#xff0c;弘扬中华传统文化的现象级综艺节目不断涌现&#xff0c;如《中国汉字听写大会》、《中国成语大会》、《中国谜语大会》、《中国诗词大会》等&#xff0c;其背后的社会成因&#xff0c;在于人们对中国文化中最精致文字的膜拜心理&#xff0c;虽然浸淫于…

如何在 C#9 中使用顶级程序 (top-level)

当我们用 C# 进行编码的时候&#xff0c;总需要写很多的模板代码&#xff0c;即使是最简单的 console 程序,想象一下&#xff0c;如果去测试一个 类库 或者 API 的功能&#xff0c;通常你会用 Console 程序去实现&#xff0c;在开始工作的时候会发现你受到了 C# 标准模板的限制…

跨部门不配合工作_跨部门协作,队友总是“甩锅”,这三个方法教你快速避坑!...

在日常的工作中&#xff0c;你觉得跨部门沟通的时间占用了多少时间&#xff1f;前阵子我经常会看到有人抱怨&#xff0c;说跨部门沟通的工作实在太难了&#xff0c;同事总是推脱扯皮&#xff0c;领导交代下来的事情&#xff0c;要么说不是自己的职责&#xff0c;要么说以前没做…

web页面在线编辑功能

首先在web.config文件中添加 <system.web> <httpHandlers> <add verb"GET" path"FtbWebResource.axd" type"FreeTextBoxControls.AssemblyResourceHandler,FreeTextBox"/> </httpHandlers></system.web> 注…

html哪个是最大标题,在下面的HTML中,哪个是最大的标题( )

参考答案如下下中单选(2分) 新民主主义革命的三大法宝是( )单选(2分) 关于计算机为什么基于二进制数来实现&#xff0c;标题下列说法不正确的是单选(3分) “某些人天生具有一些特质&#xff0c;下中这些特质会使他们成为伟大的领导者。”这是以下哪种理论的观点?标题单选(3分)…

C#通过工厂模式,我把一大堆if干掉了

概述之前做微信项目的时候&#xff0c;会涉及到一个回调&#xff0c;大家都知道回调事件是很多类型的&#xff0c;一般是根据不同的类型在进行不同的逻辑处理。这样就会延伸出一个问题&#xff0c;就是入口处会有一大堆if判断。这样本身是没什么问题的&#xff0c;只是看起来比…

再过四十年,你的女朋友可能是个美丽的机器人!不信你看

“美国西部、科幻、人工智能 、 机器人革命”&#xff0c;这 4 个看似不相关的元素却组成了一部新神剧《西部世界&#xff1a;Westworld》。《西部世界》可是聚粉丝千万&#xff0c;由1973年迈克尔克里奇顿执导的同名电影改编而成的电视剧。在剧中&#xff0c;整个“西部世界”…