geopro/tests/app/test_contour_simplify.cpp

43 lines
1.4 KiB
C++

#include <gtest/gtest.h>
#include "panels/chart/ContourSimplify.hpp"
using geopro::app::douglasPeucker;
using geopro::core::Vec2;
TEST(ContourSimplify, TolZeroReturnsOriginal) {
std::vector<Vec2> pts{{0, 0}, {1, 0.01}, {2, 0}};
auto out = douglasPeucker(pts, 0.0);
EXPECT_EQ(out.size(), 3u);
}
TEST(ContourSimplify, ShortPolylineUnchanged) {
std::vector<Vec2> pts{{0, 0}, {5, 5}};
auto out = douglasPeucker(pts, 1.0);
EXPECT_EQ(out.size(), 2u); // 点数<=2 原样
}
TEST(ContourSimplify, CollinearMiddleDropped) {
// 共线点:中点在容差内 → 被抽掉,只保留首尾。
std::vector<Vec2> pts{{0, 0}, {1, 0}, {2, 0}, {3, 0}};
auto out = douglasPeucker(pts, 0.1);
ASSERT_EQ(out.size(), 2u);
EXPECT_DOUBLE_EQ(out.front().x, 0.0);
EXPECT_DOUBLE_EQ(out.back().x, 3.0);
}
TEST(ContourSimplify, SignificantPointKept) {
// 中间有明显偏移的点(偏 1.0 > tol 0.5)→ 保留。
std::vector<Vec2> pts{{0, 0}, {1, 1.0}, {2, 0}};
auto out = douglasPeucker(pts, 0.5);
EXPECT_EQ(out.size(), 3u);
}
TEST(ContourSimplify, LargerTolDropsMorePoints) {
std::vector<Vec2> pts{{0, 0}, {1, 0.2}, {2, 0}, {3, 0.2}, {4, 0}};
auto coarse = douglasPeucker(pts, 0.5); // 偏移 0.2 < 0.5 → 全抽成首尾
auto fine = douglasPeucker(pts, 0.05); // 0.2 > 0.05 → 保留中间峰
EXPECT_LT(coarse.size(), fine.size());
EXPECT_EQ(coarse.size(), 2u);
}