canvas实现漂亮的下雨效果

Canvas扩展:利用Fabric绘制图形 Fabric.js 是一个灵活、高效的 JavaScript 库,它为开发者提供了丰富的图形绘制和编辑功能。该库建立在原生 Canvas API 之上,通过封装抽象出更易于使用的图形对象和操作接口,使得开发者可以轻松地创建复杂的图形应用。Fabric.js 允许开发者定义自定义图形类型,以便满足特定的需求。// 定义自定义图形类},});},i++) {});// 创建自定义图形], {});// 添加自定义图形到画布。 阅读详情

说明

这篇文章说如何用canvas画出漂亮的下雨效果,先看看最后实现的效果吧。
效果图

解释

看图来分析下,我们需要实现哪些效果。
1、雨滴下落效果,移动鼠标控制下落方向
2、雨滴下落散成小水珠,小水珠的移动方向和鼠标移动方向相同
3、雨滴下落到鼠标坐标一定范围内,散成小水珠,同样的,小水珠的移动方向也和鼠标移动方向相同

好的,我们把整个效果大致拆分成三个效果,实现这三个效果,就完成了。
我们一步一步来实现。

1、雨滴下落效果,移动鼠标控制下落方向

实现整个效果的思路就是,
初始时
用一个数组保存雨滴对象。
一个雨滴对象里面有各个属性用来表示,雨滴的x坐标,y坐标,长度,下落速度,颜色,判断是否删除的标志位
更新动画时
往数组中添加一定数量的雨滴对象,然后遍历数组,修改每个雨滴对象的x坐标和y坐标,用canvas根据雨滴对象的坐标,画出两个点,连起来就是一个雨滴了。

所以实现效果的重点就在坐标上
初始化一个雨滴的时候
雨滴x坐标:一个随机数
雨滴y坐标:-100,这样是为了让雨滴从可视区域外进来
更新动画时
雨滴x坐标:原x坐标的值 + speed * speedx
speed 是一个固定的值,表示雨滴下落速度,
speedx 是一个和鼠标移动方向有关系的变量,
speedx = speedx + (maxspeedx - speedx) / 50

而maxspeedx 是根据鼠标移动方向得到的一个值
maxspeedx = (e.clientX - canvasEl.clientWidth / 2) / (canvasEl.clientWidth / 2),
e.clientX:鼠标距离可视区域左边的值
canvasEl.clientWidth:整个可视区域的宽度
也就是说 speedx 是一个逐渐接近maxspeedx 的值
maxspeedx 的取值范围是 -1 到 1,他的值越接近 -1,说明方向越向左,值越接近1,说明方向越向右。
为什么不直接用maxspeedx ?
这是为了让雨滴变化方向的速度不要那么快,不要跟随鼠标变化方向立即改变,要有点点的延迟,看上去更好些。
如果用maxspeedx ,是这样的效果

如果用speedx ,是这样的效果

雨滴y坐标:原y坐标的值 + speed
speed 和上面x坐标中提到的一样,是一个固定值,表示雨滴下落速度,

好的,最后就是用canvas根据雨滴对象的坐标,画两个点了,然后连起来,雨滴就画出来了
第一个点坐标比较简单,直接获取雨滴对象的x坐标和y坐标,就是这个点的坐标
第二个点的坐标:
x坐标 = 雨滴x坐标的值 + 雨滴长度 * speedx
y坐标 = 雨滴y坐标的值 + 雨滴长度
最后把这两个点连起来,就有一条线了,就是一个雨滴了

当设置x坐标时,又用上了变量 speedx,这是为了让 雨滴方向 和 雨滴下落方向相同,
当不用 speedx时,是这样

当用上speedx时,是这样

2、雨滴下落散成小水珠,小水珠的移动方向和鼠标移动方向相同

这里的思路其实,和上面的效果有些相似
初始时
用一个数组保存小水珠对象。
一个小水珠,其实就是画一个圆弧。
一个小水珠对象里面有各个属性用来表示,小水珠的坐标,x轴移动速度,y轴移动速度,圆的半径,判断是否删除的标志位。
更新动画时
往数组中添加一定数量的小水珠对象,然后遍历数组,修改每个小水珠对象的x坐标和y坐标,用canvas根据小水珠对象的坐标属性 和 半径属性,画一个圆弧。

所以实现效果的重点还在坐标上
初始化一个小水珠的时候
小水珠是雨滴消失的时候出现的,所以小水珠的坐标也是根据雨滴的坐标来的,删除一个雨滴,就出现一些小水珠,而且小水珠的移动方向也是和雨滴下落方向,鼠标移动方向一样,所以还是会需要上面提到的变量 speedx,
小水珠x坐标: 删除的雨滴x坐标 + 删除的雨滴长度 * speedx
小水珠y坐标:删除的雨滴y坐标 + 删除的雨滴长度
更新动画时
这里要用到小水珠对象的两个属性 vx(x轴的值 的变化速度) 和vy(y轴的值 的变化速度),
小水珠的x坐标
vx = vx + speedx / 2
小水珠的x坐标 =原x坐标 + vx,

speedx:上面提到的和鼠标移动方向相关的一个变量,这里的作用就是用来控制小水珠的移动方向和其他方向相同
speedx / 2,除2是为了使 让小水珠 在x轴的移动距离短一点,看上去更真实点

小水珠的y坐标
vy = vy + gravity
小水珠的y坐标 = 原y坐标 + vy;,
vy:一个负数
gravity:重力,一个正数,完整代码里设置的是0.5
因为 原y坐标 是一个正数,这样小水珠y坐标的值,就会先减小后增大,这是为了实现小水珠会先上升后下降的效果,看图

最后就是用canvas根据小水珠的坐标属性和半径属性画圆弧就可以了,弧度是随机的

3、雨滴下落到鼠标坐标一定范围内,散成小水珠,同样的,小水珠的移动方向也和鼠标移动方向相同


确定图中圆的大小容易,假设圆的半径是35,我们能获取到鼠标的坐标,以鼠标的坐标为圆心,35为半径,就确定了圆的大小。
重点在于如何判断,雨滴是不是进入了这个范围,这就要用勾股定理了,看图。
这里写图片描述
因为雨滴是两个点连起来的一条线,要看雨滴是不是进入了这个范围内, 就是看雨滴靠下边的点的坐标,到鼠标的直线距离是多少,就是图中AB线段的长度。

勾股定理:直角三角形的两条直角边的平方和等于斜边的平方。

AB = Math.sqrt(BC*BC + AC * AC)

BC = 雨滴x坐标 - 鼠标x坐标
AC = 雨滴y坐标 - 鼠标y坐标
Math.sqrt()方法用来计算一个数的平方根

我们知道雨滴到鼠标的直线距离后,和圆的半径比较下,大于半径就不在范围内,否则就是在了。
如果在范围内,就删除雨滴,画一些小水珠。

总结

要实现这个效果,麻烦的地方在于方向,雨滴方向,雨滴下落方向,小水珠移动方向,而这些都和鼠标移动方向相关,确定各种方向后,根据距离,用canvas不断的画线,画圆弧就行了。

完整代码

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <style>
    * {
      margin: 0;
      padding: 0;
    }
  </style>
</head>
<body>
  <canvas id="canvas" style="position: absolute; height: 100%; width:100%;"></canvas>
  <script>
    window.onload = main;
    function main() {
      // 获取canvas元素
      var canvasEl = document.getElementById('canvas');
      var ctx = canvasEl.getContext('2d');
      // canvas画布的 背景颜色
      var backgroundColor = '#000';

      // canvas画布的宽 等于 可视区域的宽
      canvasEl.width = canvasEl.clientWidth;
      // canvas画布的高 等于 可视区域的高
      canvasEl.height = canvasEl.clientHeight;

      // 保存小水珠的数组
      // 雨滴下落后散成小水珠,小水珠就是一些圆弧
      var dropList = [];

      // 重力
      // 雨滴下落后散成小水珠,小水珠会先上升后下降,主要是因为 gravity 这个变量的缘故
      var gravity = 0.5;

      // 保存雨滴的数组
      // 每个雨滴 都是 画的一条线 
      var linelist = [];

      // 保存鼠标的坐标 
      // mousePos[0] 代表x轴的值,mousePos[1] 代表y轴的值 
      var mousePos = [0, 0];

      // 跟随鼠标, mouseDis 大小区域内的雨滴会消失,形成散落效果
      // 以mousePos为圆心,mouseDis为半径,这个范围内的雨滴 都会散开,形成许多小水珠
      var mouseDis = 35;

      // 更新一次动画,画lineNum 条雨滴,lineNum 值越大,下雨就越密集
      var lineNum = 3;

      // 跟随鼠标方向 变化下雨方向的 速度
      // 鼠标移动后,下雨的方向 会慢慢改变,主要靠speedx 这个变量
      var speedx = 0;

      // maxspeedx 为 speedx 可以取的最大值
      // 当 speedx = maxspeedx时,下雨方向 会 随鼠标移动方向立即改变
      var maxspeedx = 0;

      // 页面大小发生变化时,重置canvas画布大小
      window.onresize = function () {
        canvasEl.width = canvasEl.clientWidth;
        canvasEl.height = canvasEl.clientHeight;
      }

      //移动鼠标触发事件
      window.onmousemove = function (e) {
        //  设置mousePos 等于 鼠标坐标
        //  e.clientX 为距离 浏览器窗口可视区域 左边的距离
        //  e.clientY 为距离 浏览器窗口可视区域 上边的距离
        mousePos[0] = e.clientX;
        mousePos[1] = e.clientY;

        // 通过鼠标位置,设置 maxspeedx的值,取值范围是 -1 到 1
        // maxspeedx的值,关系到 
        // 1、雨滴的方向
        // 2、雨滴下落的方向
        // 3、雨滴下落方向 跟随 鼠标移动方向变化的速度
        // 4、小水珠的移动方向
        // 值越接近1,表示方向越向右
        // 值越接近-1,表示方向越向左
        maxspeedx = (e.clientX - canvasEl.clientWidth / 2) / (canvasEl.clientWidth / 2);
      }

      // 根据参数,返回一个rgb颜色,用于给雨滴设置颜色
      function getRgb(r, g, b) {
        return "rgb(" + r + "," + g + "," + b + ")";
      }

      // 画 一滴雨(一条线)
      function createLine(e) {
        // 随机生成 雨滴的长度
        var temp = 0.25 * (50 + Math.random() * 100);
        // 一个 line 对象,代表一个雨滴
        var line = {
          // 雨滴下落速度  
          speed: 5.5 * (Math.random() * 6 + 3),
          // 判断是否删除,值为true就删除
          die: false,
          // 雨滴x坐标 
          posx: e,
          // 雨滴y坐标 
          posy: -50,
          // 雨滴的长度
          h: temp,
          // 雨滴的颜色
          color: getRgb(Math.floor(temp * 255 / 75), Math.floor(temp * 255 / 75), Math.floor(temp * 255 / 75))
        };
        // 把创建好的line(雨滴)对象,添加到保存雨滴的数组
        linelist.push(line);
      }

      // 画一个小水珠(雨滴散开后的小水珠就是一个个的圆弧)
      function createDrop(x, y) {
        // 一个 drop 对象,代表一个圆弧
        var drop = {
          // 判断是否删除,值为true就删除
          die: false,
          // 圆弧圆心的x坐标 
          posx: x,
          // 圆弧圆心的y坐标 
          posy: y,
          // vx 表示 x轴的值 变化的速度
          vx: (Math.random() - 0.5) * 8,
          // vy 表示 y轴的值 变化的速度 取值范围:-3 到 -9
          vy: Math.random() * (-6) - 3,
          // 圆弧的半径
          radius: Math.random() * 1.5 + 1
        };
        return drop;
      }

      // 画一定数量的小水珠
      function madedrops(x, y) {
        // 随机生成一个数 maxi
        // maxi 代表要画小水珠的数量
        var maxi = Math.floor(Math.random() * 5 + 5);
        for (var i = 0; i < maxi; i++) {
          dropList.push(createDrop(x, y));
        }
      }

      // 开始调用update函数,更新动画
      window.requestAnimationFrame(update);
      // 更新动画
      function update() {
        // 如果保存小水珠的数组有内容
        if (dropList.length > 0) {
          // 遍历保存小水珠的数组
          dropList.forEach(function (e) {
            //设置e.vx,vx表示x坐标变化的速度
            // (speedx)/2 是为了,让小水珠 在x轴的移动距离短一点,看上去更真实点
            // 也使 小水珠的移动方向 和 雨滴方向,雨滴下落方向,鼠标移动方向相同
            e.vx = e.vx + (speedx / 2);
            e.posx = e.posx + e.vx;
			
			//设置e.vy,vy表示y坐标变化的速度
            // e.vy的范围是-3 到 -9,而这时e.posy(y坐标)一定是正值,所以 e.posy的值会先减小后增大
            // 也就是实现 雨滴散成小水珠,小水珠会先上升后下降的效果
            e.vy = e.vy + gravity;
            e.posy = e.posy + e.vy;

            // 如果 小水珠y坐标 大于 可视区域的高度,设置die属性为true
            // 小水珠如果超出可视区域就删除掉
            if (e.posy > canvasEl.clientHeight) {
              e.die = true;
            }
          });
        }

        // 删除 die属性为ture 的数组成员
        // 可视区域外的小水珠删除掉
        for (var i = dropList.length - 1; i >= 0; i--) {
          if (dropList[i].die) {
            dropList.splice(i, 1);
          }
        }

        // 设置下雨方向变换的速度,取值范围: -1 到 1
        // 当 speedx = maxspeedx时,下雨方向 会 随鼠标移动方向立即改变
        speedx = speedx + (maxspeedx - speedx) / 50;

        // 根据lineNum的值,画一定数量雨滴
        for (var i = 0; i < lineNum; i++) {
		  // 调用createLine 函数,参数是雨滴x坐标
          createLine(Math.random() * 2 * canvasEl.width - (0.5 * canvasEl.width));
        }

        // 设置结束线,也就是雨滴散开 形成许多小水珠的位置
        var endLine = canvasEl.clientHeight - Math.random() * canvasEl.clientHeight / 5;

        // 遍历保存雨滴的数组
        linelist.forEach(function (e) {

          // 利用勾股定理 确定一个范围,在这个范围内雨滴会散开形成小水珠
          // e.posx + speedx * e.h 是雨滴x坐标
          // e.posy + e.h 是雨滴y坐标
          var dis = Math.sqrt(((e.posx + speedx * e.h) - mousePos[0]) * ((e.posx + speedx * e.h) - mousePos[0]) + (e.posy + e.h - mousePos[1]) * (e.posy + e.h - mousePos[1]));

          // 如果在mouseDis区域内,就删除雨滴,画一些小水珠(圆弧)
          // 实现鼠标碰到雨滴,雨滴散成小水珠的效果
          if (dis < mouseDis) {
            // 删除 雨滴
            e.die = true;
            // 画一些小水珠(圆弧)
            madedrops(e.posx + speedx * e.h, e.posy + e.h);
          }

          // 如果雨滴超过 结束线,删除雨滴,画一些小水珠(圆弧)
          if ((e.posy + e.h) > endLine) {
            e.die = true;
            madedrops(e.posx + speedx * e.h, e.posy + e.h);
          }

          // 如果 雨滴 y坐标 大于 可视区域的高度,设置die属性为true
          // 如果 雨滴 超出可视区域就删除掉
          if (e.posy >= canvasEl.clientHeight) {
            e.die = true;
          } else {
            // 逐渐增加 雨滴 y坐标的值
            e.posy = e.posy + e.speed;

            // 变化雨滴 x坐标
            // * speedx 用来控制雨滴 下落 方向
            // 使 雨滴下落方向 和 鼠标移动方向相同
            e.posx = e.posx + e.speed * speedx;
          }
        });

        // 删除 die属性为ture 的数组成员
        // 鼠标区域内的,超过结束线的,可视区域外的雨滴删除掉
        for (var i = linelist.length - 1; i >= 0; i--) {
          if (linelist[i].die) {
            linelist.splice(i, 1);
          }
        }

        // 渲染
        render();
        // 递归调用 update,实现动画效果
        window.requestAnimationFrame(update);
      }

      // 渲染
      function render() {
        // 画一个和可视区域一样大的矩形
        ctx.fillStyle = backgroundColor;
        ctx.fillRect(0, 0, canvasEl.width, canvasEl.height);

        // 画雨滴效果
        ctx.lineWidth = 5;
        linelist.forEach(function (line) {
          ctx.strokeStyle = line.color;
          ctx.beginPath();
          ctx.moveTo(line.posx, line.posy);

          // * speedx 用来控制雨滴方向
          // 使 雨滴方向 和 鼠标移动方向相同
          ctx.lineTo(line.posx + line.h * speedx, line.posy + line.h);
          ctx.stroke();
        });

        // 画雨滴散开形成小水珠效果
        ctx.lineWidth = 1;
        ctx.strokeStyle = "#fff";
        dropList.forEach(function (e) {
          ctx.beginPath();
          ctx.arc(e.posx, e.posy, e.radius, Math.random() * Math.PI * 2, 1 * Math.PI);
          ctx.stroke();
        });

        // 解开注释,可看见鼠标范围
        /*
          ctx.beginPath();
          ctx.arc(mousePos[0], mousePos[1], mouseDis, 0, 2 * Math.PI);
          ctx.stroke();
        */
      }
    }
  </script>
</body>

</html>

最后说一句

这个特效是从 sxq111本尊 大神那里学来的,喜欢的小伙伴们也可以去github上给他个小star哦。

canvas 雨滴特效 一、雨滴特效需求 雨滴从窗口顶部随机下落到达底部将呈现波纹逐渐散开变淡直到消失,雨滴特效随窗口变化自适应 二、雨滴实现思路 1. 用面向对象的思维 首先创建canvas画布 ,绘制一个雨滴的初始化形状 2. 在给雨滴添加运动的方法 3. 通过定时器让雨滴运动起来 三、具体分析 1.雨滴初始化需要的属性有哪些? 坐标x,y 宽高w,h 。 2.雨滴下落是逐渐加速下落不是匀速需要给一个加速度的属性,也就是y轴坐标不断加上加速度的值 3.雨滴下落到底部某一个区域后开始呈现波纹逐渐散开,也就是到达底部某个范围内开 阅读详情

相关推荐

从零实现满屏爱心弹窗:CSS动画与DOM管理实战

在前端开发中,弹窗是高频交互组件,但如何实现一个流畅、可定制且不阻塞页面的特效弹窗,却需要深入理解浏览器渲染机制。本文从原生alert的阻塞缺陷切入,引出CSS动画与DOM节点操作的核心原理——通过@keyframes驱动爱心飘落,借助JavaScript定时器控制生成节奏,并利用animationend事件及时清理节点,避免内存泄漏。此类效果可广泛应用于页面通知、节日活动等场景,工程化实现还可以封装为可复用的弹窗组件,兼顾性能与可维护性。文章提供完整代码与排错指南,帮助开发者从整活代码走向规范化组件设计。

weixin_34205826的博客 402

canvas为你的天气预报添加雨雪效果 | 微信小程序

关注前端瓶子君,回复“交流”加入我们一起学习,天天进步来源:行舟客https://yunxiaomeng.blog.youkuaiyun.com/article/details/110059776...

我本可以容忍阳光,如果我不曾见过太阳,然而阳光已使我荒凉,成为更新的荒凉。 825

Godot引擎高级雨滴特效实现:从粒子系统到环境交互的完整指南

在游戏开发中,粒子系统是模拟自然现象和增强视觉沉浸感的核心技术之一,它通过程序化生成大量微小图形单元来表现火焰、烟雾、水流等动态效果。其原理在于利用GPU或CPU高效计算每个粒子的生命周期、运动轨迹和外观变化,从而以较低的性能开销实现复杂的视觉效果。这项技术的价值在于能够极大地提升游戏的环境真实感和玩家代入感,广泛应用于角色技能、天气系统、爆炸场景和UI反馈等多个领域。本文聚焦于天气模拟中的一个经典应用——雨滴特效,深入探讨如何超越基础粒子发射,通过结合GPUParticles3D、自定义着色器以及屏幕空间

weixin_34375251的博客 410

前端--canvas实现漂亮的下雨效果

说明 这篇文章说如何用canvas画出漂亮的下雨效果,先看看最后实现的效果吧。  效果图  解释 看图来分析下,我们需要实现哪些效果。  1、雨滴下落效果,移动鼠标控制下落方向  2、雨滴下落散成小水珠,小水珠的移动方向和鼠标移动方向相同  3、雨滴下落到鼠标坐标一定范围内,散成小水珠,同样的,小水珠的移动方向也和鼠标移动方向相同 好的,我们把整个效果大致拆分成三个效果,实现这三个效果,...

fumushan的博客 1970

GPT-4o全模态原生架构:从多模态交互到情境共在的技术跃迁

大模型多模态能力正从‘模块拼接’迈向‘原生融合’,其核心在于打破语音、图像、文本的模态壁垒,实现统一token空间下的联合感知与实时推理。这种全模态原生支持不仅大幅降低端到端延迟(如230ms内语音响应),更催生了情境共在、情绪隐式建模、跨语言语义对齐等新范式。技术价值体现在人机交互自然度跃升——用户无需切换模式,即可通过说、指、拍等任意方式表达意图;典型应用场景覆盖教育陪练、多语言客服、无障碍生活助手等真实场域。GPT-4o正是这一演进路径的关键里程碑,标志着生成式AI由工具向认知协作者的根本转变。

weixin_34126557的博客 338

Canvas制作下雨雨滴效果

canvas绘制下雨雨滴打在地面动画特效。

大剑师兰特的GIS世界 781

HTML5 Canvas 模拟下雨

前段时间做一个基于html5的活动页面,清明时节雨纷纷,就在网上找了一个模拟下月的插件,做了一些修改,然后客户很满意,我也很开心

使用 Canvas 和 JavaScript 创建逼真的下雨效果

  HTML5 规范引进了很多新特性,其中最令人期待的之一就是 Canvas 元素,HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法,非常强大。这里向大家展示一个使用 Canvas 和 JavaScript 创建逼真的下雨效果。 您可能感兴趣的相关文章 Pace.js – 页面加载进度自动指示和 Ajax 导航效果 使用 iosOverlay.js 创建 i...

weixin_30297281的博客 124

mac搭建ios自动化环境之WebDriverAgent配置

一、WebDriverAgent 1、简单介绍: WebDriverAgent是facebook为苹果公司开发的一款自动化测试工具,github上有下载资源;另外appium安装后也会自动安装自带的WebDriverAgent;可以用自带的,也可以从github下载并替换自带的; 2、不同appium版本自带WebDriverAgent默认路径不同 1)appium 1.10.1之前版本: npm方式安装: /usr/local/lib/node_modules/appium/node_modules/a

qq_30237715的博客 2761

Xilinx Vitis arm-xilinx-eabi-gcc.exe: error: *.c: Invalid argument

This problem may be a bugof version 2021.1 only. Unfortunately, I'm just currently using this version. After Build Project: Find where this Makefile is through "make: Leaving directory" information. For me, it is located atZynq_CPU_wrapper_hw_platfo...

Ayka的博客 6660

Android自定义View——下雨效果

Android自定义View-下雨效果 先来看一下效果: 根据效果图,我们来分析一下需求。 1、雨滴由一条线段构成 2、一个RainWidget包含许多雨滴 3、雨滴的长度、宽度、速度、透明度是随机的 4、雨滴向下滴落,当超出屏幕高度,将重新随机在屏幕上边缘生成 5、一打开应用,雨滴就随机分布在屏幕,而不是出生在屏幕最上方 接下来,我们就一步一步分析该View是如何实现的 ...

catzifeng的博客 2382

Android双目摄像头(RGB+IR)实时预览与人脸活体检测实战指南

本文详细介绍了Android双目摄像头(RGB+IR)实时预览与人脸活体检测的实战指南。通过双摄同步预览、人脸检测与活体判断等技术实现,提升安全认证的准确性和鲁棒性。文章还提供了开发环境搭建、常见问题解决方案及性能优化建议,帮助开发者快速掌握双目摄像头在Android平台的应用。

vulkan6gpu的博客 689

centos mysql confirure 编译安装_Meng小羽

说明这篇文章说如何用canvas画出漂亮的下雨效果,先看看最后实现的效果吧。效果图解释看图来分析下,我们需要实现哪些效果。1、雨滴下落效果,移动鼠标控制下落方向2、雨滴下落散成小水珠,小水珠的移动方向和鼠标移动方向相同3、雨滴下落到鼠标坐标一定范围内,散成小水珠,同样的,小水珠的移动方向也和鼠标移动方向相同好的,我们把整个效果大致拆分成三个效果,实现这三个效果,就完成了。我们一步一步来实现。1、雨...

weixin_28955231的博客 126

分支界定法(branch and bound)与背包问题的代码实现

分支界定法(branch and bound)与背包问题的代码实现 LastEditTime: - 2021.2.3 不卖茶的吴龙茗茶 分支界定法是一种在整数规划中常用的算法,其主要思想为将大问题分割成小问题进行求解。分支界定法是围绕着一个二叉树进行的,以背包问题为例: 假设小明有一个背包,其总的容积为30,小明有三件东西可以带,三件东西的体积分别为:10,15,20。求问小明如何能够在背包中装下更大体积的物品? .

小吴同学的小屋 1884

基于IEEE39节点系统的风力发电机组并网改造与稳定性研究

本文研究了基于IEEE39节点系统的风力发电机组并网改造与稳定性问题。首先将系统工作频率从60Hz转换为50Hz,并对同步发电机、变压器、线路和负荷参数进行相应调整。随后将30、32、34、37号节点的同步发电机替换为不同容量的永磁同步发电机(PMSG)和双馈感应发电机(DFIG),详细建立了两种风电机组的数学模型和控制策略。通过Simulink仿真验证,改造后的系统能够稳定运行并满足并网要求。研究成果为大规模风电并网系统仿真提供了参考,对提高电力系统可再生能源消纳能力具有重要意义。

huanghm88的专栏 109

Cesium+WebGPU降雨汇流模拟:从地形高程到动态水量场的实时计算

三维GIS可视化中,地形分析与GPU并行计算是构建数字孪生、洪涝推演等应用的基础能力。传统降雨模拟仅停留在视觉层,而真正的汇流模拟需要回答雨水落地后向何处流动、何处积水等物理问题,这要求同时处理地形高程、动态水量场以及持续更新的计算机制。WebGPU的Compute Shader专为大规模数据并行而生,适合承担水量场逐帧演算任务;Cesium则负责三维场景、地形与交互。通过采样地形高程、编写WGSL着色器、双缓冲更新水量并叠加回场景,即可实现实时汇流模拟。该方案可自然延伸至淹没分析、污染扩散等场景,为三维空

weixin_34302798的博客 325

20251121更新纷玩岛

【代码】20251121更新纷玩岛。

猫敷雪 1017

用 Claude 生成会断电自救的赛博城市:HTML 单文件与状态机实战

自然语言生成代码正在改变前端原型开发的方式,而单文件 HTML 应用则是这一趋势中最轻量的载体。无需构建工具、无需外部依赖,一个文件即可承载完整的视觉表现与交互逻辑。城市断电后自动恢复的机制,本质上是状态机在前端中的应用:通过定义有限状态与事件驱动切换,实现可控、可测试的程序行为。理解状态机的核心原理,能帮助开发者更高效地驾驭 AI 生成交互系统。当灯光熄灭、备用电源自动启动、核心设施逐步恢复,一个看似炫酷的动画背后,是事件驱动、自动恢复机制与实时渲染的工程实践。本文以赛博朋克城市模拟为切入点,拆解 AI

weixin_30954265的博客 394

Google Earth Engine:LandTrendr (Landsat Collection 2)全更新使用(代码调用+UI交互)

本文介绍了使用Landsat Collection 2进行连续变化监测的分析方法,包含代码实现和可视化界面两部分。代码部分通过Google Earth Engine平台运行LandTrendr算法,设置参数包括时间范围、光谱指数、变化检测阈值等,最终生成变化幅度和检测年份的可视化图层,并将结果导出至Google Drive。可视化界面部分展示了基于LandTrendr的土地覆盖变化结果,结合Landsat影像进行分析。整个方法实现了从数据处理到结果展示的完整流程,适用于森林覆盖等环境变化监测。

此星光明博客 210

【Visual Assist X助手安装问题】Visual Assist X无法安装(双击安装包没反应) | Visual Assist X安装后在Visual Studio中找不到(亲测有效)

本文分享了Visual Assisant X助手的安装与使用问题的详细解决办法,因为网上搜集的信息比较少,所以有一定的参考价值。考虑到很多开发新手会遇到上述问题,可能对Windows系统不熟悉,所以相关操作步骤讲解的很详细!

dvlinker的技术专栏 6万+

Python+Tkinter桌面天气应用开发实战与踩坑记录

桌面应用开发中,技术选型往往决定了最终体验的轻量程度与维护成本。Python自带Tkinter作为GUI框架,以极小的安装体积和快速启动著称,适合构建信息密度低、交互简洁的常驻工具。通过封装外部天气API,配合超时重试与本地缓存,可以实现稳定的数据刷新;而PyInstaller打包与资源路径、DPI适配则是发布环节的关键工程实践。从手机天气应用的信息冗余痛点切入,一个基于Python+Tkinter的桌面天气应用从接口选型、界面布局到打包踩坑的全过程被完整记录,为同类轻量桌面小工具开发提供参考。

weixin_31315567的博客 190

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

UE5数字孪生项目实战:UMG界面与蓝图交互全流程解析

数字孪生是将物理世界在虚拟空间中实时映射的技术,其核心不在于静态的三维模型有多逼真,而在于动态数据能否驱动场景并反馈控制。在智慧城市领域,这一需求尤为突出。UE5凭借Nanite和Lumen带来的高保真渲染能力,以及内置的UMG界面系统和蓝图逻辑工具,让开发者无需依赖大量第三方插件即可构建从数据接收到可视化交互的完整链路。工程实践中,搭建一套可复用的UMG界面架构,通过蓝图设计稳定的交互逻辑,结合触屏适配和性能优化,能够高效支撑城市级场景的精细操作。本文基于UE5.1,从项目配置、场景导入、UMG布局、蓝图

weixin_34221276的博客 336

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: JavaScript实现冒泡排序 可视化
下一篇: JavaScript实现 超范围的数 相加
FEWY
FEWY 领域专家: 前端开发技术领域 领域专家: 前端开发技术领域
博客等级 码龄10年 504粉丝 77原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值