AngusJohnson / Clipper2

Polygon Clipping and Offsetting - C++, C# and Delphi
Boost Software License 1.0
1.34k stars 247 forks source link

The offset result is inconsistent with the expected result. #822

Closed zhangjiangzhao123 closed 2 months ago

zhangjiangzhao123 commented 2 months ago

In my project, I need to offset the following polygons, and the expected result is to obtain offset polygons, but it is obvious that I got wrong result. And if the offset value is 0, I expect to return the original polygons, but it returns an incorrect result.

I tested using Clipper1-6.2.1 and Clipper2-1.3.0, and the test code is as follows:

48ade8efa8afb2768f719d5b808f5c21

#include "clipper2/clipper.h"
#include "clipper.h"

using namespace std;
const double eps = 1e5;

int main()
{   
    // Clipper1---------------------------------------------------------------
    ClipperLib::Paths paths1;
    ClipperLib::Path path1, path2;
    path1.push_back(ClipperLib::IntPoint(109.803017 * eps, 1043.04907 * eps));
    path1.push_back(ClipperLib::IntPoint(109.802971 * eps, 1043.04919 * eps));
    path1.push_back(ClipperLib::IntPoint(109.820541 * eps, 1043.01685 * eps));
    path1.push_back(ClipperLib::IntPoint(109.820549 * eps, 1043.01685 * eps));

    path2.push_back(ClipperLib::IntPoint(115.443535 * eps, 1038.31628 * eps));
    path2.push_back(ClipperLib::IntPoint(113.526993 * eps, 1039.92419 * eps));
    path2.push_back(ClipperLib::IntPoint(109.959419 * eps, 1024.94946 * eps));
    path2.push_back(ClipperLib::IntPoint(112.135597 * eps, 1024.43091 * eps));

    paths1.push_back(path1);
    paths1.push_back(path2);

    ClipperLib::JoinType jt1 = ClipperLib::jtMiter;
    ClipperLib::EndType et1 = ClipperLib::EndType::etClosedPolygon;
    ClipperLib::ClipperOffset clpOffset;
    clpOffset.AddPaths(paths1, jt1, et1);
    clpOffset.Execute(paths1, 0);

    // Clipper2---------------------------------------------------------------
    Clipper2Lib::Paths64 paths2;
    Clipper2Lib::Path64 path3, path4;
    path3.push_back(Clipper2Lib::Point64(109.803017 * eps, 1043.04907 * eps));
    path3.push_back(Clipper2Lib::Point64(109.802971 * eps, 1043.04919 * eps));
    path3.push_back(Clipper2Lib::Point64(109.820541 * eps, 1043.01685 * eps));
    path3.push_back(Clipper2Lib::Point64(109.820549 * eps, 1043.01685 * eps));

    path4.push_back(Clipper2Lib::Point64(115.443535 * eps, 1038.31628 * eps));
    path4.push_back(Clipper2Lib::Point64(113.526993 * eps, 1039.92419 * eps));
    path4.push_back(Clipper2Lib::Point64(109.959419 * eps, 1024.94946 * eps));
    path4.push_back(Clipper2Lib::Point64(112.135597 * eps, 1024.43091 * eps));

    paths2.push_back(path3);
    paths2.push_back(path4);

    Clipper2Lib::JoinType jt = Clipper2Lib::JoinType::Miter;
    Clipper2Lib::EndType et = Clipper2Lib::EndType::Polygon;
    Clipper2Lib::ClipperOffset clp2Offset(2.0, 0.25);
    clp2Offset.AddPaths(paths2, jt, et);
    clp2Offset.Execute(0, paths2);

    return 0;
}