mapbox/geojson-vt-cpp

When clip a non-convex polygon, expect to return multiple linear_ring, but got a degenerated version...

chenzx opened this issue · 1 comments

TEST(Clip, MyDynamicPolygon) {
    detail::vt_linear_ring ring;
    {
        ring.push_back({ 0, 0 });
        ring.push_back({ 1, 6 });
        ring.push_back({ 2, 0 });
        ring.push_back({ 3, 6 });
        ring.push_back({ 4, 0 });
        ring.push_back({ 4, 10 });
        ring.push_back({ 0, 10 });
        ring.push_back({ 0, 0 });
    }
    const detail::vt_polygon polygon{ ring };
    const auto clipY = detail::clipper<1>{ 2, 4 };
    const auto clipped = clipY(polygon); //由于原始输入polygon非凸,裁剪的结果可能是多个polygon。。。
    //根据这里的输入数据,clip的结果应该是3个polygon(linear_ring), 对应3个小梯形
    std::cout << "clipped.size()=" << clipped.size() << std::endl;
    {
        int ringIndex = 0;
        for (auto&& ring : clipped) {
            std::cout << "ring#" << ringIndex << ": ";
            for (auto&& point : ring){
                std::cout << "(" << point.x << "," << point.y << ") ";
            }
            std::cout << std::endl;
            ++ringIndex;
        }
    }
    //这里结果应该是3个polygon(梯形),但结果得到一个linear_ring,退化的版本?
    const auto clipX = detail::clipper<0>{ 1, 3 };
    const auto clipped2 = clipX(clipped);
    std::cout << "clipped2.size()=" << clipped2.size() << std::endl;
    {
        int ringIndex = 0;
        for (auto&& ring : clipped2) {
            std::cout << "ring#" << ringIndex << ": ";
            for (auto&& point : ring){
                std::cout << "(" << point.x << "," << point.y << ") ";
            }
            std::cout << std::endl;
            ++ringIndex;
        }
    }
    std::cout << "ok" << std::endl;
}

Output:

clipped.size()=1
ring#0: (0.333333,2) (0.666667,4) (1.33333,4) (1.66667,2) (2.33333,2) (2.66667,4) (3.33333,4) (3.66667,2) (4,2) (4,4) (0,4) (0,2) (0.333333,2)
clipped2.size()=1
ring#0: (1,4) (1.33333,4) (1.66667,2) (2.33333,2) (2.66667,4) (3,4) (3,4) (1,4)

I expect clipped.size()=3 here, but it doesn't

Unfortunately that's expected — GeoJSON-VT uses a variation of Sutherland-Hodgeman polygon clipping algorithm, which has this drawback.