# 空间场分析
空间场分析可以对三维空间中的一组离散点进行插值分析最终以热力体的方式进行展示,空间场分析需要通过 “空间场分析器”(SpatialFieldAnalyzer)实现。
# 创建分析器
import { ColorGradient, IDWInterpolator3D, PointVisualizer, SpatialFieldAnalyzer } from '@tx3d/core';
// 创建距离反比(IDW)插值器
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 visualizer = new PointVisualizer( engine, gradient );
// 创建空间场分析器
const analyzer = new SpatialFieldAnalyzer( engine, {
    stepSize: 10.0, // 预设采样步长(注:不是最终的采样步长,程序会根据采样范围及最大采样点个数动态调整)
    interpolator: interpolator,
    visualizer: visualizer
} );
 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
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
提示
- 空间场分析器初始化参数,详见SpatialFieldAnalyzerParameters;
 - 构建空间场分析器时可以通过设置插值器实现不同的插值方案,当前程序提供距离反比(IDWInterpolator3D)和克里金 (KrigingInterpolator3D)两种类型的插值器,如果不设置默认使用距离反比插值器,二次开发时也可以根据实际需求自定义插值器;
 - 构建空间场分析器时可以通过设置可视化器实现不同的可视化效果,当前程序提供点(PointVisualizer)、体素(VoxelVisualizer)、体渲染(VolumeVisualizer)三种类型可视化器,如果不设置默认使用点可视化器,二次开发时也可以根据实现需求自定义可视化器。
 
# 执行分析
通过空间场分析器(SpatialFieldAnalyzer)的execute接口执行分析。
import { MathUtils } from 'three';
// 随机生成特征点(注:特征点的属性值需要归一化到[ 0~1 ]区间)
const featurePoints = [];
for ( let i = 0; i < 50; i++ ) {
    const x = MathUtils.randFloat( -1000.0, 1000.0 );
    const y = MathUtils.randFloat( -100.0, 100.0 );
    const z = MathUtils.randFloat( -1000.0, 1000.0 );
    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( { 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
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
提示
如果上次分析未完成,再次调用 execute 会通过 onFailed 返回错误信息。
注意
特征点的属性值需要归一化到[ 0~1 ]区间;
# 结束分析
通过空间场分析器(SpatialFieldAnalyzer)的stop接口终止正在进行的分析或撤销已完成的分析。
// 终止正在进行的分析或撤销已完成的分析
analyzer.stop();
 1
2
2
提示
如果上次分析未完成,调用 stop 会终止正在进行的分析,并通过 onFailed 返回分析被终止的错误信息。
# 销毁分析器
通过空间场分析器(SpatialFieldAnalyzer)的dispose接口销毁分析器。
// 销毁分析器
analyzer.dispose();
analyzer = null;
 1
2
3
2
3