js网页模拟野火燃烧蔓延效果

2023-10-31

野火通过燃床蔓延是自然界的一个复杂现象.本文综述了为认识这一现象所作的研究工作,包括分析各种理化机制及通过基本物理规律构造数学模型。现有的数学模型可分为统计模型、经验模型和物理模型三类.本文着重以统一的观点评述了近五十年来所建立的各种物理模型,并讨论了考虑湍流热对流和化学反应动力学的新方向.

本问通过用js模拟野火蔓延效果来实现一个可视化的蔓延展示:

点击草原上点可以点燃火苗,旋转的箭头表明风的方向。

在线demo地址

index.html

<!doctype html>

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Fire</title>
  <link rel="shortcut icon" href="data:image/x-icon;," type="image/x-icon">
  <link rel="stylesheet" href="style.css">
</head>

<body>
  <div id="tools" style="width: 750px; position: relative; height: 5em;">
    <div style="position: absolute; left: 0; top: 0;">
      <button class="ignite">燃烧</button>
      <button class="firebreak">防火隔离带</button>
      <div class="compass">
        <div class="wind"></div>
      </div>
    </div>


    <div  style="position: absolute; right: 0; top: 0;">
      <span id="fps" style="color: #000; font-weight: bold; margin-right: 1em;">
        <span class="model"></span>
        +
        <span class="view"></span>
      </span>
      <button id="reset-button">重置</button>
    </div>
  </div>
  <div id="burned">
    <div></div>
  </div>
  <div id="grid">
  </div>
  
  <script src="main.js" type="module"></script>
</body>

main.js

import { FireGrid } from './lib/FireGrid.js';
import { FireGridView } from './lib/FireGridView.js';
import { FireGridControl } from './lib/FireGridControl.js';

const width = 375;
const height = 375;
const scale = 2;

const container = document.querySelector('#grid');
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
canvas.id = 'fire-grid';
container.appendChild(canvas);

/*
const target = document.createElement('div');
target.className = 'target';
container.appendChild(target);
*/

const dom = {
  grid: document.querySelector('#fire-grid'),
  target: document.querySelector('#grid .target'),
  reset: document.querySelector('#reset-button'),
  burned: document.querySelector('#burned div'),
  burnedAmount: document.querySelector('#burned div'),
  toolIgnite: document.querySelector('#tools .ignite'),
  toolFirebreak: document.querySelector('#tools .firebreak'),
};

const toolModes = {
  ignite: 0,
  firebreak: 1,
}

let toolMode = toolModes.ignite;
updateTools();
dom.toolIgnite.addEventListener('click', function () {
  toolMode = toolModes.ignite;
  updateTools();
});
dom.toolFirebreak.addEventListener('click', function () {
  toolMode = toolModes.firebreak;
  updateTools();
});
function updateTools () {
  if (toolMode === toolModes.ignite) {
    dom.toolIgnite.classList.add('selected');
    dom.toolFirebreak.classList.remove('selected');
  } else if (toolMode === toolModes.firebreak) {
    dom.toolIgnite.classList.remove('selected');
    dom.toolFirebreak.classList.add('selected');
  }
}

const fireGrid = new FireGrid(width, height);
const fgView = new FireGridView(width, height, dom.grid);
const fgControl = new FireGridControl(fireGrid, fgView);

let lastTime = +new Date();

function handleMouse (event) {
  const rect = dom.grid.getBoundingClientRect();
  const x = event.clientX - rect.left;
  const y = event.clientY - rect.top;

  //const x = event.layerX;
  //const y = event.layerY;  
  const row = Math.floor(y/scale);// scale);
  const col = Math.floor(x/scale);// scale);

  if (toolMode === toolModes.ignite) {
    fgControl.ignite(row, col);
  } else if (toolMode === toolModes.firebreak) {
    fgControl.firebreak(row, col);
  }
}

dom.grid.addEventListener('click', handleMouse);

dom.reset.addEventListener('click', () => {
  fgControl.reset();
});

function step () {
  const now = +new Date();
  const duration = now - lastTime;
  lastTime = now;
  fgControl.step(duration);
  const width = String(Math.round(fgControl.burned * 100)) + '%';
  dom.burnedAmount.style.width = width;
  dom.burned.innerHTML = width;
  window.requestAnimationFrame(step);
}
step();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

js网页模拟野火燃烧蔓延效果 的相关文章

随机推荐

  • 【论文复现】——Patchwork++:基于点云的快速稳健地面分割方法

    目录 一 算法原理 1 Git源码 2 论文概述 3 参考文献 二 代码实现 三 结果展示 四 相关链接 一 算法原理 本文使用PCL进行实现 1 Git源码 这是韩国团队2022年的最新文章 Patchwork Fast and Robu
  • Unity3d场景中出现闪面的解决方法

    当你发现在unity3d场景中 发现有闪面的现象 基本上是由于面之间的距离太近导致的 专业术语Z Fighting 出现这种情况可以调整摄像机的Clipping plane属性中的Near值来解决这个问题
  • 技能树-网络爬虫-BeautifulSoup

    文章目录 前言 一 获取所有p标签 二 获取所有text 三 获取所有图片地址 总结 前言 技能树 网络爬虫 BeautifulSoup Python入门技能树 大家好 我是空空star 本篇给大家分享一下 技能树 网络爬虫 Beautif
  • 数学实验-迭代(二)-分形(Mathematica实现)

    一 实验环境 Mathematica 10 3软件 二 实验目的 以迭代的观点介绍分形的基本特性以及生成分形图形的基本方法 使我们在欣赏美丽的分形图形的同时对分形几何这门学科有一个直观的了解 三 实验内容和步骤以及结果分析 实验2 1 Ko
  • 【DA 01】Domain-Adversarial Training of Neural Networks

    Abstract 本文提出一种适用于domain adaptation的representation learning方法 训练和测试数据来自相似但不同的分布 本文方法受启发于领域自适应的理论 为实现域迁移 预测必须要基于不可分辨的训练 s
  • Unix网络编程第三版源码编译

    环境 cat etc issue Ubuntu 12 04 1 LTS n l cat proc version Linux version 3 2 0 48 generic buildd komainu gcc version 4 6 3
  • 【containerd错误解决系列】uos arm主机 docker及containerd都拉不下来镜像

    操作 yum remove unpigz docker pull xxx crictl pull xxx 删除了这个包就可以了 具体说明参考下面的文档 参考 解决国产系统 Docker 拉取大镜像卡顿之谜
  • 虚函数、纯虚函数、多态

    一 虚函数 在基类的函数前加上virtual关键字 在派生类中重写该函数 运行时将会根据所指对象的实际类型来调用相应的函数 如果对象类型是派生类 就调用派生类的函数 如果对象类型是基类 就调用基类的函数 一 虚表和虚基表指针 虚函数表 Vi
  • CGAL 根据扫描线方向和角度对法向量进行重定向

    目录 一 算法原理 1 主要函数 二 代码实现 一 算法原理 最小生成树对法向量定向的结果在具有许多尖锐特征和遮挡的机载点云数据中结果并不理想 scanline orient normals 是专门用于具有扫描线特性的点云法向量重定向的替代
  • 关于SimpleDataFormat导致日期不对的问题

    点赞再看 养成习惯 大家好 我是辰兮 今天介绍怎么解决SimpleDataFormat导致日期不对的问题 目录 开场白 一 思路 二 如何解决 总结 开场白 项目在下班前的五分钟终于上线了 老王正在悠闲的喝茶 手中正握着即将送给女朋友小花的
  • RV1109 LVGL UI开发

    RV1109 LVGL UI开发 前面在使用RK的RV1109平台用于产品中 使用的是QT做的UI 主要是继承原来海思平台的产品 随着分辨率的提高 UI响应也慢了不少 试着在RV1109上使用LVGL看看效果如何 RV1109使用的是DRM
  • vant UI 轮播组件swiper 滑动时触发click点击事件

    问题描述 如图 我是用轮播图做了一个答题卡分页 但是 出现了 滑动轮播图时自动触发了数字点击的事件 解决办法 1 在van swipe标签添加 lazy render属性 实现图片懒加载 懒加载模式下 只会渲染当前页和下一页 2 在van
  • 计算机专有名词解释

    一 NMAP 二 DAS 三 NAS 四 SAN 五 FC 1 FC AE协议集 2 FC AV ARINC818 3 光纤总线特点 六 MEMERY 七 LVM 八 SCSI 特点 九 SMB 十 stordge 十一 NFS 十二 bl
  • source insight 无法查找与跳转和恢复默认设置

    1 无法搜索到工程里的文件 可能原因 下级目录没有添加 解决方法 Recursively add lower sub directories 勾选上 2 context window 不能跳转 可能原因 没有同步代码 解决方法 同步工程代码
  • Jira入门教程 敏捷开发管理(一)

    https www jianshu com p 145b5c33f7d0 简介 Jira是Atlassian公司出品的一款事务管理软件 无论是 需求 还是 BUG 或是 任务 都是 事务 的一种 所以Jira可以胜任非常多的角色 需求管理
  • https 状态码

    HTTP状态码 类别 原因短语 1 Information 信息性状态码 接受的请求正在处理 2 Success 成功状态码 请求正常处理完毕 3 Redirection 重定向状态码 需要进行附加操作已完成请求 4 Client Erro
  • 基于CentOS7.9安装部署docker(简洁版)

    安装部署 1基于官方脚本安装 不推荐 不能自行选择版本 官方文档 https docs docker com engine install centos 2 使用yum安装 阿里云文档 docker ce镜像 docker ce下载地址 d
  • The 19th Zhejiang Provincial Collegiate Programming Contest(部分题解)

    在完成三道签到之后 分别对图论 前缀 二分 大模拟上面取得突破点 但其他题集没能得到突破 仍需多加练习 A JB热爱数学 题意 给定两个数 a b 求出让a变成b的最少次数 能修改a的值为加上一个奇数 和 减去一个偶数 类型 思维题 分析各
  • vscode ssh远程输入密码之后无反应,一直提示输入密码

    用vscode进行远程服务器连接时 一直要输入密码 不断重复 始终无法链接 参考 https blog csdn net qq 33854260 article details 111255004 方法 点击view下的 command p
  • js网页模拟野火燃烧蔓延效果

    野火通过燃床蔓延是自然界的一个复杂现象 本文综述了为认识这一现象所作的研究工作 包括分析各种理化机制及通过基本物理规律构造数学模型 现有的数学模型可分为统计模型 经验模型和物理模型三类 本文着重以统一的观点评述了近五十年来所建立的各种物理模