64 lines
1.6 KiB
C++
64 lines
1.6 KiB
C++
#include "core/algo/GprVolumeBuilder.hpp"
|
||
#include "core/algo/IInterpolator.hpp" // GridSpec
|
||
#include <gtest/gtest.h>
|
||
|
||
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
|
||
}
|