geopro/src/render/VoxelFromScatters.hpp

41 lines
1.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
#include <vector>
#include <vtkImageData.h>
#include <vtkSmartPointer.h>
#include <vtkVolume.h>
#include "geo/CrsTransform.hpp"
#include "geo/GeoLocalFrame.hpp"
#include "model/ColorScale.hpp"
#include "model/Field.hpp"
namespace geopro::render {
// dd_voxel 体素结果:体绘制 volume + 内部 image(含 origin/spacing供交互切片)。
struct VoxelResult {
vtkSmartPointer<vtkVolume> volume;
vtkSmartPointer<vtkImageData> image;
bool valid() const { return volume != nullptr && image != nullptr; }
};
// 把若干测线散点(GIS projX/projY + 深度 ylist)配准到 GeoLocalFrame 世界系并 IDW 成体素。
// 配准:(projX,projY) --crs(项目CRS→EPSG:4326)--> (lon,lat) --frame--> 局部米(x East,y North);
// 垂向 z = -ylist(深度向下,与帘面 z 取负一致)。
// IDWmaxDist 裁剪约束插值域(两交叉测线→十字片,设计 §10)NaN 留空→体绘制透明。
// crs 须为「项目 CRS(如 EPSG:4547) → EPSG:4326」frame 与帘面/地图共用以保证空间配准。
// zDisplayScale把纵向夸张"烤进"输出 image 的 z 间距与原点(IDW 采样仍用真实 cellZ)
// 使体绘制 + 切片(vtkImagePlaneWidget 作用于此 image) + 帘面(actor SetScale 同倍)三者纵向一致。
// 输入不足(无点)返回 valid()==false 的空结果。
VoxelResult buildVoxelFromScatters(const std::vector<geopro::core::ScatterField>& profiles,
const geopro::core::ColorScale& cs,
const geopro::core::CrsTransform& crs,
const geopro::core::GeoLocalFrame& frame,
double cellXY = 1.0,
double cellZ = 0.5,
double power = 2.0,
double maxDist = 4.0,
double zDisplayScale = 1.0);
} // namespace geopro::render