#include #include "panels/chart/ContourSimplify.hpp" using geopro::app::douglasPeucker; using geopro::core::Vec2; TEST(ContourSimplify, TolZeroReturnsOriginal) { std::vector pts{{0, 0}, {1, 0.01}, {2, 0}}; auto out = douglasPeucker(pts, 0.0); EXPECT_EQ(out.size(), 3u); } TEST(ContourSimplify, ShortPolylineUnchanged) { std::vector pts{{0, 0}, {5, 5}}; auto out = douglasPeucker(pts, 1.0); EXPECT_EQ(out.size(), 2u); // 点数<=2 原样 } TEST(ContourSimplify, CollinearMiddleDropped) { // 共线点:中点在容差内 → 被抽掉,只保留首尾。 std::vector 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 pts{{0, 0}, {1, 1.0}, {2, 0}}; auto out = douglasPeucker(pts, 0.5); EXPECT_EQ(out.size(), 3u); } TEST(ContourSimplify, LargerTolDropsMorePoints) { std::vector 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); }