酷炫星空,连点成线

<!DOCTYPE html>

<html>

  <head>

    <meta charset="utf-8">

    <title></title>

    <style media="screen">

      *{

        margin: 0;

        padding: 0

      }

      html,body{

        height: 100%;

        margin: 0;

        padding: 0;

        background-color: #000000;

        overflow: hidden;

      }

      #canvas{

        height: 100%;

        width: 100%;

        overflow: hidden;

      }

    </style>

  </head>

  <body>

     <canvas id="canvas" ></canvas>

     <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" charset="utf-8"></script>

     <script type="text/javascript">

     $(function(){

       var canvas = document.querySelector(‘canvas‘),

           ctx = canvas.getContext(‘2d‘);

       canvas.width = window.innerWidth;

       canvas.height = window.innerHeight;

       //显得宽度为0.3

       ctx.lineWidth = 0.3;

       //生成随机的颜色

       ctx.strokeStyle = (new Color(150)).style;

       var mousePosition = {

         //初始化鼠标位置点,不明白为啥不直接写/2

         x: 50 * canvas.width / 100,

         y: 50 * canvas.height / 100

       };

       var dots = {

         //点的个数

         nb: 250,

         //两点间最大距离的平方除以2再开方,就是就是一个筛选值

         distance: 100,

         //鼠标有效半径

         d_radius: 150,

         //小球数组

         array: []

       };

     //rgb的色值介于0-255之间

       function colorValue(min) {

         return Math.floor(Math.random() * 255 + min);

       }

       function createColorStyle(r,g,b) {

         return ‘rgba(‘ + r + ‘,‘ + g + ‘,‘ + b + ‘, 0.9)‘;

       }

       //此处高能开始,一开始以为只是去两个颜色的中间值,没想到连直径的比例也加上去了

       function mixComponents(comp1, weight1, comp2, weight2) {

         return (comp1 * weight1 + comp2 * weight2) / (weight1 + weight2);

       }

     //用于返回连线的颜色

       function averageColorStyles(dot1, dot2) {

         //获取两点的颜色

         var color1 = dot1.color,

             color2 = dot2.color;

         var r = mixComponents(color1.r, dot1.radius, color2.r, dot2.radius),

             g = mixComponents(color1.g, dot1.radius, color2.g, dot2.radius),

             b = mixComponents(color1.b, dot1.radius, color2.b, dot2.radius);

         return createColorStyle(Math.floor(r), Math.floor(g), Math.floor(b));

       }

     //随机颜色生成器,这个写的挺神的

       function Color(min) {

         min = min || 0;

         this.r = colorValue(min);

         this.g = colorValue(min);

         this.b = colorValue(min);

         this.style = createColorStyle(this.r, this.g, this.b);

       }

     //生成一个点

       function Dot(){

         //点产生在页面的随机位置处

         this.x = Math.random() * canvas.width;

         this.y = Math.random() * canvas.height;

           //设定x和y轴的运动速度

         this.vx = -.5 + Math.random();

         this.vy = -.5 + Math.random();

         //直径大小,也是随机的

         this.radius = Math.random() * 2;

         //随机的颜色

         this.color = new Color();

         // console.log(this);

       }

     //原型上加绘制函数

       Dot.prototype = {

         //绘制小点的方法

         draw: function(){

           ctx.beginPath();

           ctx.fillStyle = this.color.style;

           ctx.arc(this.x, this.y, this.radius, 0, Math.PI * 2, false);

           ctx.fill();

         }

       };

     //创建了一个点的集合

       function createDots(){

         for(i = 0; i < dots.nb; i++){

           dots.array.push(new Dot());

         }

       }

     //碰撞检测函数

       function moveDots() {

         for(i = 0; i < dots.nb; i++){

           var dot = dots.array[i];

           if(dot.y < 0 || dot.y > canvas.height){

             dot.vx = dot.vx;

             dot.vy = - dot.vy;

           }

           else if(dot.x < 0 || dot.x > canvas.width){

             dot.vx = - dot.vx;

             dot.vy = dot.vy;

           }

           dot.x += dot.vx;

           dot.y += dot.vy;

         }

       }

     // 遍历点的数组,将满足的条件的两个点进行连线

       function connectDots() {

         for(i = 0; i < dots.nb; i++){

           for(j = 0; j < dots.nb; j++){

             i_dot = dots.array[i];

             j_dot = dots.array[j];

             //假设当前点距离和遍历的点的距离小于所定义的半径长度(其实为distance的平方乘以二再开方,三角函数),这两个判断到时大家可以重新研究一下谁在上谁在下,以做到算法最优化

             if((i_dot.x - j_dot.x) < dots.distance && (i_dot.y - j_dot.y) < dots.distance && (i_dot.x - j_dot.x) > - dots.distance && (i_dot.y - j_dot.y) > - dots.distance){

               //用来筛选处于鼠标所在点设定值半径内的所欲点

               if((i_dot.x - mousePosition.x) < dots.d_radius && (i_dot.y - mousePosition.y) < dots.d_radius && (i_dot.x - mousePosition.x) > - dots.d_radius && (i_dot.y - mousePosition.y) > - dots.d_radius){

                 ctx.beginPath();

                 //之前最好奇的就是线的渐变是怎么做的,看完顿时感觉,很高能

                 ctx.strokeStyle = averageColorStyles(i_dot, j_dot);

                 ctx.moveTo(i_dot.x, i_dot.y);

                 ctx.lineTo(j_dot.x, j_dot.y);

                 ctx.stroke();

                 ctx.closePath();

               }

             }

           }

         }

       }

     //数组中的所有小球,进行绘制

       function drawDots() {

         for(i = 0; i < dots.nb; i++){

           var dot = dots.array[i];

           dot.draw();

         }

       }

     //比定时器更加准确,跟着浏览器的渲染频率走

       function animateDots() {

         //清空画布,并且重新绘制,然后执行定时器,循环绘制

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

         moveDots();

         connectDots();

         drawDots();

         requestAnimationFrame(animateDots);

       }

     // 监听鼠标移动

       $(‘canvas‘).on(‘mousemove‘, function(e){

         mousePosition.x = e.pageX;

         mousePosition.y = e.pageY;

       });

     //鼠标移除,再次将默认位置重置为中心区域

       $(‘canvas‘).on(‘mouseleave‘, function(e){

         mousePosition.x = canvas.width / 2;

         mousePosition.y = canvas.height / 2;

       });

       // 创建点集合

       createDots();

       //其实用定时器是一样的,准确率差不了多少,估计作者想使用新技术,又或是本身是一个强迫症患者

       requestAnimationFrame(animateDots);

     });

     </script>

  </body>

</html>

  

原文地址:https://www.cnblogs.com/mhxy13867806343/p/8447178.html

时间: 2024-10-08 06:14:34

酷炫星空,连点成线的相关文章

MVC中使用SignalR打造酷炫实用的即时通讯功能

資料來源:http://www.fangsi.net/1144.html 前言,现在这世道写篇帖子没个前言真不好意思发出来.本贴的主要内容来自于本人在之前项目中所开发的一个小功能,用于OA中的即时通讯.由于当时走的太急,忘记把代码拿出来.想想这已经是大半年前的事情了,时间过了这么久,在当时最新的SignalR2.0.1到现在已经变成了2.2.昨天晚上特地熬了个夜,重新又把它写出来做了一个小小的Demo.当然我只是大自然的搬运工,这个SignalR即时通讯功能里面有一些前端的类库不是我自己写的.我

Android常用酷炫控件(开源项目)github地址汇总

转载一个很牛逼的控件收集贴... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. 一.ListView android-pulltorefresh一个强大的拉动

MVC中使用SignalR打造酷炫实用的即时通讯功能附源码

前言,现在这世道写篇帖子没个前言真不好意思发出来.本贴的主要内容来自于本人在之前项目中所开发的一个小功能,用于OA中的即时通讯.由于当时走的太急,忘记把代码拿出来.想想这已经是大半年前的事情了,时间过了这么久,在当时最新的SignalR2.0.1到现在已经变成了2.2.昨天晚上特地熬了个夜,重新又把它写出来做了一个小小的Demo.当然我只是大自然的搬运工,这个SignalR即时通讯功能里面有一些前端的类库不是我自己写的.我只是改吧改吧~~在此鸣谢 @贤心,是他的几条库才使得我的这个功能如此酷炫.

那些酷炫的充电方式

百万红包.火热开启!!!有你更精彩! 目录[-] --> 正文 --> 网友“猫身后的萝卜”: 听说美国大学已经研发出了利用WiFi给数码设备充电的技术,据说还将支持手机,真是让人眼前一亮,未来是不是会有更多奇特的充电方式? 腾讯科技: 近日,美国媒体报道称,华盛顿大学已经成功利用WiFi路由器充当无线充电设备.它可以在不扰乱数据传输的背景下,在10米范围内给数码相机等设备充满电,并且未来有望将该技术用于智能手机. 该项目的研究人员唐拉(VamsiTalla)表示,安装在硬件设备上的充电传感器

Android使用SVG矢量图打造酷炫动效!

尊重原创,欢迎转载,转载请注明: FROM  GA_studio   http://blog.csdn.net/tianjian4592 一个真正酷炫的动效往往让人虎躯一震,话不多说,咱们先瞅瞅效果: 这个效果我们需要考虑以下几个问题: 1. 这是图片还是文字: 2. 如果是图片该如何拿到图形的边沿线坐标,如果是文字呢? 3. 如果拿到了边沿线坐标,如何让光线沿着路径跑动: 4. 怎么处理过程的衔接: 以上四个问题似乎不是太好处理,而这几个问题也正好是这个效果精华所在,接下来咱们一个一个进行考虑

【Android】 给我一个Path,还你一个酷炫动画

本篇文章已授权微信公众号 hongyangAndroid (鸿洋)独家公布 转载请标明出处: http://blog.csdn.net/zxt0601/article/details/53040506 本文出自:[张旭童的CSDN](http://blog.csdn.net/zxt0601) 代码传送门:喜欢的话.随手点个star.多谢 https://github.com/mcxtzhang/PathAnimView 一 概述 原本仅仅是想模仿一下我魂牵梦萦的StoreHouse效果.没想到意

纯CSS3实现的一些酷炫效果

纯CSS3实现的一些酷炫效果 之前在网上看到一些用纯CSS3实现的酷炫效果,以为实现起来比较困难,于是想看看具体是怎么实现的. 一.笑脸猫动画 实现效果如下: 这个实现起来确实比较麻烦,很多地方需要花时间,有耐心地调整. 1.先看下页面结构: <body> <div class="container"> <!-- 脸 --> <div class="face"> <!-- 头发 --> <div cl

js特效之酷炫的彩虹圈

此代码非本人所写 望使用者不要拿来做商业用途 致谢! <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><style&

[Asp.net 开发系列之SignalR篇]专题二:使用SignalR实现酷炫端对端聊天功能

一.引言 在前一篇文章已经详细介绍了SignalR了,并且简单介绍它在Asp.net MVC 和WPF中的应用.在上篇博文介绍的都是群发消息的实现,然而,对于SignalR是为了实时聊天而生的,自然少了不像QQ一样的端对端的聊天了.本篇博文将介绍如何使用SignalR来实现类似QQ聊天的功能. 二.使用SignalR实现端对端聊天的思路 在介绍具体实现之前,我先来介绍了使用SignalR实现端对端聊天的思路.相信大家在前篇文章已经看到过Clients.All.sendMessage(name,