63 lines
2.5 KiB
C++
63 lines
2.5 KiB
C++
#include "data/GprVolumeRepository.hpp"
|
||
|
||
#include <cmath>
|
||
#include <limits>
|
||
|
||
#include "core/model/ScalarVolumeI16.hpp"
|
||
#include "io/gpr/Gpr3dvVolumeBridge.hpp"
|
||
#include "io/gpr/NormalizedRadarVolumeBridge.hpp"
|
||
|
||
namespace geopro::data {
|
||
|
||
VolumeGrid builtI16ToVolumeGrid(const geopro::core::BuiltI16& built) {
|
||
const int nx = built.vol.nx();
|
||
const int ny = built.vol.ny();
|
||
const int nz = built.vol.nz();
|
||
|
||
VolumeGrid out;
|
||
out.vol = geopro::core::ScalarVolume(nx, ny, nz);
|
||
out.origin = built.origin;
|
||
out.spacing = built.spacing;
|
||
out.vmin = built.vminPhys;
|
||
out.vmax = built.vmaxPhys;
|
||
|
||
// 逐体素反量化(布局一致:i 最快、k 最慢)。
|
||
// kBlank → NaN:下游 render::buildVoxel 把 NaN 映射到 [vmin,vmax] 外的哨兵 →
|
||
// 传递函数置全透明(与 float 路径空值语义一致)。
|
||
const std::vector<std::int16_t>& src = built.vol.data();
|
||
std::vector<double>& dst = out.vol.data();
|
||
const double nan = std::numeric_limits<double>::quiet_NaN();
|
||
for (std::size_t idx = 0; idx < src.size(); ++idx) {
|
||
const std::int16_t q = src[idx];
|
||
dst[idx] = (q == geopro::core::ScalarVolumeI16::kBlank)
|
||
? nan
|
||
: built.quant.toPhys(q);
|
||
}
|
||
return out;
|
||
}
|
||
|
||
VolumeGrid createGprVolumeGrid(const std::string& lineDir,
|
||
const std::string& linePrefix, int coarse,
|
||
double targetDy) {
|
||
// 走 P1/P2 链(io::gpr)得处理后 int16 量化体 → 反量化为 app 的 float 体。
|
||
// metricsOut 传 nullptr:repository 只产数据,度量留给 gpr_poc CLI。
|
||
// targetDy 透传 → 默认走线内通道插值(2.5cm 网格),app 渲染链即得密 Y 体。
|
||
const geopro::core::BuiltI16 built =
|
||
geopro::io::gpr::buildLineVolumeFromGpr3dv(
|
||
lineDir, linePrefix, /*metricsOut=*/nullptr, coarse, targetDy);
|
||
return builtI16ToVolumeGrid(built);
|
||
}
|
||
|
||
VolumeGrid createRadarVolumeGrid(const std::string& lineDir,
|
||
const std::string& linePrefix, int coarse,
|
||
double targetDy) {
|
||
// 走规范化测线链(io::gpr) 读 .head/.data → int16 量化体 → 反量化为 app 的 float 体。
|
||
// 与 createGprVolumeGrid 同适配器(builtI16ToVolumeGrid),仅上游数据源不同。
|
||
const geopro::core::BuiltI16 built =
|
||
geopro::io::gpr::buildLineVolumeFromNormalized(lineDir, linePrefix, coarse,
|
||
targetDy);
|
||
return builtI16ToVolumeGrid(built);
|
||
}
|
||
|
||
} // namespace geopro::data
|