You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何随机化二维像素扩散函数以模拟火势蔓延?

嘿,这个问题我之前做类似火灾模拟的时候也折腾过!要让火势蔓延更贴近真实,核心就是给原本规整的扩散逻辑加入随机性权重,结合火势强度、物体属性来灵活调整,下面给你几个实用的落地方向:

1. 给相邻格子的引燃概率加随机波动

原本的规则可能是只要相邻是可燃烧区域就必然着火,现在改成带概率的随机判定,更符合真实火势的不确定性:

  • 先计算基础引燃概率:比如当前着火格子的强度越高(比如接近40),基础概率越高——可以用公式 (current_strength - 10) / 30,这样10的时候概率为0,40的时候概率为1(100%)
  • 给基础概率加随机波动值:比如用random.uniform(-0.15, 0.15)生成±15%的波动,同时限制概率在5%-95%之间,避免出现极端情况
  • 结合物体易燃性:如果相邻格子是1-9的物体,给不同数值设置不同的易燃系数——比如数值1是干草(易燃,乘1.2),数值9是石头(难燃,乘0.1),让不同物体的引燃概率有差异

2. 火势强度增长的随机延迟与跳变

原本线性固定的强度增长太规整,加入随机延迟能模拟火势的不均匀燃烧:

  • 分阶段设置随机增长步长:
    • 10-20阶段(火势增强期):每帧随机增长1-3,模拟火势快速蔓延的不确定性
    • 20-30阶段(火势停滞期):每帧有30%的概率不增长,剩下70%增长1,模拟局部火势的僵持
    • 30-40阶段(火势衰减/爆燃期):每帧随机增长0-2,同时加入10%的概率直接跳到40,模拟局部爆燃的情况
  • 随机初始强度:火源中心初始强度设为25,而边缘引燃的格子初始强度随机在10-15之间,模拟火势从中心向外减弱的不均性

3. 随机风向与地形触发的特殊效果(进阶优化)

如果想让模拟更真实,可以加入随机环境因素:

  • 随机风向:每20帧随机生成一个风向(上/下/左/右),给对应方向的相邻格子引燃概率乘1.5,相反方向乘0.7,模拟风助火势的效果
  • 地形随机爆燃:比如数值为5的木板堆这类易燃物体,当它的强度达到25时,有20%的概率直接引燃周围3x3范围内的所有易燃格子,模拟堆积物的爆燃现象

4. 随机熄灭的可能性

真实火势不会一直持续,加入随机熄灭能让模拟更完整:

  • 当着火格子强度到40后,每帧有5%-20%的随机概率变成熄灭状态(比如标记为50)
  • 对于潮湿物体(比如数值7的湿木头),着火后每帧有10%的概率强度下降1,直到降到10后自动熄灭

简单代码示例(Python)

这里给你一个简化版的实现片段,你可以根据自己的二维数组结构调整:

import random

def spread_fire(grid, x, y):
    current_strength = grid[x][y]
    # 定义上下左右四个相邻格子
    neighbors = [(x-1,y), (x+1,y), (x,y-1), (x,y+1)]
    
    for nx, ny in neighbors:
        # 确保在数组范围内
        if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]):
            target_val = grid[nx][ny]
            if target_val == 0:  # 未被访问的可燃烧区域
                # 计算基础引燃概率
                base_prob = (current_strength - 10) / 30
                # 加入随机波动,限制在0.05-0.95之间
                random_fluct = random.uniform(-0.15, 0.15)
                final_prob = max(0.05, min(0.95, base_prob + random_fluct))
                
                # 如果是1-9的物体,加入易燃系数
                if 1 <= target_val <= 9:
                    # 数值越小越易燃,系数从1到0.1
                    flammability = (10 - target_val) / 9
                    final_prob *= flammability
                
                # 随机判定是否引燃
                if random.random() < final_prob:
                    # 随机设置初始燃烧强度
                    grid[nx][ny] = random.randint(10, 18)
    
    # 处理当前格子的强度增长/熄灭
    if 10 <= current_strength < 20:
        grid[x][y] += random.randint(1, 3)
    elif 20 <= current_strength < 30:
        # 30%概率不增长
        if random.random() > 0.3:
            grid[x][y] += 1
    elif 30 <= current_strength < 40:
        grid[x][y] += random.randint(0, 2)
        # 10%概率直接爆燃到40
        if random.random() < 0.1:
            grid[x][y] = 40
    elif current_strength == 40:
        # 5%-20%的概率熄灭
        if random.random() < random.uniform(0.05, 0.2):
            grid[x][y] = 50  # 标记为熄灭状态

这些参数(比如波动范围、概率阈值)都可以根据你的模拟需求调整——想要更猛烈的火势就调高引燃概率,想要慢燃效果就调低。

内容的提问来源于stack exchange,提问作者Emmanuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:22:47