# 巷道分析

# 巷道热力分析

通过 “巷道热力分析器”LanewayThermalAnalyzer)实现巷道热力分析。

# 创建分析器

import { ColorGradient, Entity, IDWInterpolator3D, Laneway, LanewayThermalAnalyzer, defined } from '@tx3d/core';

// 加载巷道
engine.loadLaneways( './assets/jsons/mine/laneways(3.0).json', {

    useLOD: true,
    lodDistance: 2000.0,
    arrowMap: './assets/textures/mine/arrow.png',
    leftMap: './assets/textures/mine/left.jpg',
    rightMap: './assets/textures/mine/right.jpg',
    topMap: './assets/textures/mine/top.jpg',
    bottomMap: './assets/textures/mine/bottom.jpg'

} ).then( ( entities ) => {

    const { bounds, laneways } = entities;

    // 获取所有巷道渲染组件
    const renderables = [];
    for ( let i = 0, il = laneways.length; i < il; i++ ) {

        renderables.push( laneways[ i ].getComponent( Laneway ) );

    }

    // 创建距离反比插值器
    const interpolator = new IDWInterpolator3D();

    // 创建分析渐变色
    const gradient = new ColorGradient( [

        { value: 0.0, color: '#000066' },
        { value: 0.1, color: 'blue' },
        { value: 0.2, color: 'cyan' },
        { value: 0.3, color: 'lime' },
        { value: 0.4, color: 'yellow' },
        { value: 0.5, color: 'orange' },
        { value: 0.6, color: 'red' },
        { value: 0.7, color: 'maroon' },
        { value: 0.8, color: '#660066' },
        { value: 0.9, color: '#990099' },
        { value: 1.0, color: '#ff66ff' }

    ] );

    // 创建巷道热力分析器
    const analyzer = new LanewayThermalAnalyzer( engine, { stepSize: 5, interpolator, gradient } );

} );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

提示

  • 巷道热力分析器初始化参数,详见ThermalAnalyzerParameters
  • 构建渲染对象热力分析器时可以通过设置插值器实现不同的插值方案,当前程序提供距离反比IDWInterpolator3D)和克里金KrigingInterpolator3D)两种类型的插值器,如果不设置默认使用距离反比插值器,二次开发时也可以根据实际需求自定义插值器。

# 执行分析

通过巷道热力分析器(LanewayThermalAnalyzer)的execute接口执行分析。

// 全矿井范围随机生成特征点
const featurePoints = [];
for ( let i = 0; i < 100; i++ ) {

    const x = MathUtils.randFloat( bounds.min.x, bounds.max.x );
    const y = MathUtils.randFloat( bounds.min.y, bounds.max.y );
    const z = MathUtils.randFloat( bounds.min.z, bounds.max.z );
    const v = MathUtils.randFloat( 0.0, 1.0 );

    featurePoints.push( {

        point: [ x, y, z ],
        value: v

    } );

};

// 分析完成回调
const onCompleted = ( result ) => {

    // 解构分析结果
    const {

        points,     // 分析采样结果(坐标 + 属性值)
        bounds,     // 分析采样边界
        stepSize    // 真实分析采样步长

    } = result;

    // TODO:完成回调

};

// 分析失败回调
const onFailed = ( error ) => {

    console.log( error );

}

// 执行热力分析
analyzer.execute( {

    laneways: renderables,
    featurePoints,
    onCompleted,
    onFailed

} );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

提示

如果上次分析未完成,再次调用 execute 会通过 onFailed 返回错误信息。

注意

特征点的属性值需要归一化到[ 0~1 ]区间;

# 结束分析

通过巷道热力分析器(LanewayThermalAnalyzer)的stop接口终止正在进行的分析或撤销已完成的分析。

// 终止正在进行的分析或撤销已完成的分析
analyzer.stop(); 
1
2

提示

如果上次分析未完成,调用 stop 会终止正在进行的分析,并通过 onFailed 返回分析被终止的错误信息。

# 设置分析渐变颜色

通过巷道热力分析器(LanewayThermalAnalyzer)的setGradient接口设置分析渐变颜色。

import { Color } from 'three';
import { ColorGradient } from '@tx3d/core';

// 生成随机颜色
const colorValues = [];
for ( let i = 0; i <= 10; i++ ) {

    const hue = Math.floor( Math.random() * 360 ); // 0-359° 广色域

    colorValues.push( { value: i * 0.1, color: new Color( `hsl(${hue}, 80%, 70%)` ) } );

}

// 设置分析渐变颜色
analyzer.setGradient( new ColorGradient( colorValues ) );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 销毁分析器

通过巷道热力分析器(LanewayThermalAnalyzer)的dispose接口销毁分析器。

// 销毁分析器
analyzer.dispose();
analyzer = null;
1
2
3

# 巷道扩散分析

通过 “巷道扩散分析器”LanewaySpreadAnalyzer)实现巷道扩散分析。

# 创建分析器

import { ColorGradient, LanewayGasSpreadSimulator, LanewaySpreadAnalyzer } from '@tx3d/core';

// 加载巷道
engine.loadLaneways( './assets/jsons/mine/laneways(3.0).json', {

    useLOD: true,
    lodDistance: 2000.0,
    arrowVisible: true,
    arrowMap: './assets/textures/mine/arrow.png',
    leftMap: './assets/textures/mine/left.jpg',
    rightMap: './assets/textures/mine/right.jpg',
    topMap: './assets/textures/mine/top.jpg',
    bottomMap: './assets/textures/mine/bottom.jpg'

} ).then( ( entities ) => {

    // 创建扩散渐变颜色
    const gradient = new ColorGradient( [

        { value: 0.0, color: '#000066' },
        { value: 0.1, color: 'blue' },
        { value: 0.2, color: 'cyan' },
        { value: 0.3, color: 'lime' },
        { value: 0.4, color: 'yellow' },
        { value: 0.5, color: 'orange' },
        { value: 0.6, color: 'red' },
        { value: 0.7, color: 'maroon' },
        { value: 0.8, color: '#660066' },
        { value: 0.9, color: '#990099' },
        { value: 1.0, color: '#ff66ff' }

    ] );

    // 创建气体扩散模拟器
    const simulator = new LanewayGasSpreadSimulator( engine, {

        arrowMap: './assets/textures/mine/arrow.png',
        gradient

    } );

    // 创建巷道扩散分析器
    const analyzer = new LanewaySpreadAnalyzer( engine, simulator );

} );
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

Tips

创建巷道扩散分析器时需要设置扩散模拟器,模拟器用于计算扩散路径并模拟扩散效果。当前程序提供气体扩散LanewayGasSpreadSimulator)和流体扩散LanewayFluidSpreadSimulator)两种类型模拟器,二次开发时也可以根据实际需求自定义模拟器。

# 执行分析

通过巷道扩散分析器(LanewaySpreadAnalyzer)的execute接口执行分析。

注意

巷道扩散分析器的 execute 接口主要用于扩散路径的预计算并通过 onPrepared 回调返回预计算结果,之后需要通过调用模拟接口实现扩散状态模拟。

  • 执行气体扩散分析

    import { ColorGradient, LanewayGasSpreadSimulator, LanewaySpreadAnalyzer } from '@tx3d/core';
    
    // 加载巷道
    engine.loadLaneways( './assets/jsons/mine/laneways(3.0).json', {
    
        useLOD: true,
        lodDistance: 2000.0,
        arrowVisible: true,
        arrowMap: './assets/textures/mine/arrow.png',
        leftMap: './assets/textures/mine/left.jpg',
        rightMap: './assets/textures/mine/right.jpg',
        topMap: './assets/textures/mine/top.jpg',
        bottomMap: './assets/textures/mine/bottom.jpg'  
    
    } ).then( ( entities ) => {
    
        // 创建扩散渐变颜色
        const gradient = new ColorGradient( [
    
            { value: 0.0, color: '#000066' },
            { value: 0.1, color: 'blue' },
            { value: 0.2, color: 'cyan' },
            { value: 0.3, color: 'lime' },
            { value: 0.4, color: 'yellow' },
            { value: 0.5, color: 'orange' },
            { value: 0.6, color: 'red' },
            { value: 0.7, color: 'maroon' },
            { value: 0.8, color: '#660066' },
            { value: 0.9, color: '#990099' },
            { value: 1.0, color: '#ff66ff' }
    
        ] );
    
        // 创建气体扩散模拟器
        const simulator = new LanewayGasSpreadSimulator( engine, {
    
            arrowMap: './assets/textures/mine/arrow.png',
            gradient
    
        } );
    
        // 创建巷道扩散分析器
        const analyzer = new LanewaySpreadAnalyzer( engine, simulator );
    
        // 获取扩散源头巷道实体
        const sourceEntity = Entity.findByGUID( engine.sceneRenderer.activeScene, 'hd_57-4' );
        // 获取扩散源头巷道渲染组件
        const sourceLaneway = sourceEntity.getComponent( Laneway );
        // 扩散源头坐标(必须可以投影到巷道底板)
        const sourcePosition = [ -50.90714723679264, 59.836668684427686, -333.5843992689219 ];
    
        // 执行分析
        analyzer.execute( {
    
            sourcePosition,
            sourceLaneway,
            autoSimulate: true,                                     // 是否自动开启扩散模拟
            speed: 5,                                               // 扩散速度
            sourceDensity: 100,                                     // 扩散原始浓度
            minDensity: 0.0,                                        // 最小扩散浓度
            maxDensity: 100,                                        // 最大扩散浓度
            halfLifeDistance: 1000.0,                               // 扩散浓度衰减到50%所需的距离(米)
            onPrepared: ( totalTime, sortedSpreadSegments ) => {    // 扩散数据准备完成回调
    
                // 扩散总时长(单位:秒)
                console.log( `扩散总时长:${totalTime}` );
    
                // 扩散路径段是按照每一段扩散结束时间从小到大排序
                console.log( `扩散路径段个数: ${sortedSpreadSegments.length}` );
    
            }
    
        } );
    
    } );
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75

    提示

    执行气体扩散分析时输入参数,详见LanewayGasSpreadAnalyzeParameters

  • 执行流体扩散分析

    import { LanewayFluidSpreadSimulator, LanewaySpreadAnalyzer } from '@tx3d/core';
    
    // 加载巷道
    engine.loadLaneways( './assets/jsons/mine/laneways(3.0).json', {
    
        useLOD: true,
        lodDistance: 2000.0,
        arrowVisible: true,
        arrowMap: './assets/textures/mine/arrow.png',
        leftMap: './assets/textures/mine/left.jpg',
        rightMap: './assets/textures/mine/right.jpg',
        topMap: './assets/textures/mine/top.jpg',
        bottomMap: './assets/textures/mine/bottom.jpg'  
    
    } ).then( ( entities ) => {
    
        // 创建流体扩散模拟器
        const simulator = new LanewayFluidSpreadSimulator( engine, {
    
            arrowMap: './assets/textures/mine/arrow.png',
            color: '#55B4D9'
    
        } );
    
        // 创建巷道扩散分析器
        const analyzer = new LanewaySpreadAnalyzer( engine, simulator );
    
        // 获取扩散源头巷道实体
        const sourceEntity = Entity.findByGUID( engine.sceneRenderer.activeScene, 'hd_57-4' );
        // 获取扩散源头巷道渲染组件
        const sourceLaneway = sourceEntity.getComponent( Laneway );
        // 扩散源头坐标(必须可以投影到巷道底板)
        const sourcePosition = [ -50.90714723679264, 59.836668684427686, -333.5843992689219 ];
    
        // 执行分析
        analyzer.execute( {
    
            sourcePosition,
            sourceLaneway,
            autoSimulate: true,                                     // 是否自动开启扩散模拟
            speed: 5,                                               // 扩散速度
            heightError: 0.001,                                     // 流体流向判断高度误差(单位:米)
            onPrepared: ( totalTime, sortedSpreadSegments ) => {    // 扩散数据准备完成回调
    
                // 扩散总时长(单位:秒)
                console.log( `扩散总时长:${totalTime}` );
    
                // 扩散路径段是按照每一段扩散结束时间从小到大排序
                console.log( `扩散路径段个数: ${sortedSpreadSegments.length}` );
    
            }
    
        } );
    
    } );
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55

    提示

    执行流体扩散分析时输入参数,详见LanewayFluidSpreadAnalyzeParameters

# 模拟扩散

  • 模拟全周期扩散状态

通过巷道扩散分析器(LanewaySpreadAnalyzer)的simulate接口模拟全周期扩散状态。

// 开启全周期扩散模拟
analyzer.simulate();
1
2

提示

  • 执行分析时,如果将 autoSimulate 设置为 true 则当扩散数据准备完成后,程序会自动调用 simulate 接口,否则需要手动调用 simulate 接口开启全周期扩散模拟;
  • 全周期扩散模拟开启后,程序会逐帧模拟扩散状态直到扩散结束。
  • 模拟固定时刻扩散状态

通过巷道扩散分析器(LanewaySpreadAnalyzer)的simulateAtTime接口模拟固定时刻扩散状态。

// 模拟距模拟开始15秒时的扩散状态
analyzer.simulateAtTime( 15.0 );
1
2

# 暂停模拟

通过巷道扩散分析器(LanewaySpreadAnalyzer)的pause接口暂停正在进行的模拟。

// 暂停模拟
analyzer.pause();
1
2

提示

可以通过调用 simulatesimulateAtTime 恢复模拟。

# 结束分析

通过巷道扩散分析器(LanewaySpreadAnalyzer)的stop接口终止正在进行的分析或撤销已完成的分析。

// 终止正在进行的分析或撤销已完成的分析
analyzer.stop();
1
2

# 销毁分析器

通过巷道扩散分析器(LanewaySpreadAnalyzer)的dispose接口销毁分析器。

Last Updated: 9/19/2025, 11:06:59 AM