#include "core/algo/GprVolumeBuilder.hpp" #include "core/algo/IInterpolator.hpp" // GridSpec #include using namespace geopro::core; // GprSurvey 放 core/model(geopro::core 命名空间),保持 core 自洽,避免 core->io 反向依赖。 TEST(GprVolumeBuilder, InterpolatesAcrossChannelsOnly) { geopro::core::GprSurvey s; s.ntraces = 1; s.samples = 1; s.x0 = 0; s.dx = 1; s.z0 = 0; s.dz = 1; s.channelY = {0.0, 1.0}; // 两通道:Y=0 值0、Y=1 值100 s.values = {0.0, 100.0}; // [(c*1+0)*1+0] => c=0->0, c=1->100 GridSpec spec{}; spec.nx = 1; spec.ny = 3; spec.nz = 1; spec.ox = 0; spec.oy = 0; spec.oz = 0; spec.dx = 1; spec.dy = 0.5; spec.dz = 1; spec.power = 2; spec.maxDist = 9.9; auto b = buildGprVolume(s, spec); EXPECT_EQ(b.vol.nx(), 1); EXPECT_EQ(b.vol.ny(), 3); EXPECT_EQ(b.vol.nz(), 1); EXPECT_NEAR(b.quant.toPhys(b.vol.at(0, 0, 0)), 0.0, 1.0); // Y=0 -> ch0 EXPECT_NEAR(b.quant.toPhys(b.vol.at(0, 1, 0)), 50.0, 1.5); // Y=0.5 -> 中点≈50 EXPECT_NEAR(b.quant.toPhys(b.vol.at(0, 2, 0)), 100.0, 1.0); // Y=1.0 -> ch1 } TEST(GprVolumeBuilder, OutOfRangeBecomesBlank) { geopro::core::GprSurvey s; s.ntraces = 1; s.samples = 1; s.x0 = 0; s.dx = 1; s.z0 = 0; s.dz = 1; s.channelY = {0.0}; s.values = {5.0}; GridSpec spec{}; spec.nx = 3; spec.ny = 1; spec.nz = 1; // X 超出仅 1 道的范围 spec.ox = 0; spec.oy = 0; spec.oz = 0; spec.dx = 10; spec.dy = 1; spec.dz = 1; spec.power = 2; spec.maxDist = 0.5; auto b = buildGprVolume(s, spec); EXPECT_EQ(b.vol.at(2, 0, 0), ScalarVolumeI16::kBlank); // 远端无覆盖->blank }