File: ClipperTest.cpp

package info (click to toggle)
cura-engine 1%3A5.0.0-6
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 7,860 kB
  • sloc: cpp: 52,613; python: 322; makefile: 10; sh: 2
file content (156 lines) | stat: -rw-r--r-- 4,897 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
//Copyright (c) 2022 Ultimaker B.V.
//CuraEngine is released under the terms of the AGPLv3 or higher.

#include <gtest/gtest.h>

#include <polyclipping/clipper.hpp>
#include <math.h>

// #define TEST_INFILL_SVG_OUTPUT
#ifdef TEST_INFILL_SVG_OUTPUT
#include "../src/utils/polygon.h"
#include <cstdlib>
#include "../src/utils/SVG.h"
#endif //TEST_INFILL_SVG_OUTPUT

namespace cura
{

// This test currently always fails because there is a bug in clipper related to doing an intersection between a polygon and a polyline.
class DISABLED_ClipperTest : public testing::Test
{
public:
    using Paths = ClipperLib::Paths;
    using Path = ClipperLib::Path;
    using coord_t = ClipperLib::cInt;
    using Point = ClipperLib::IntPoint;

    std::vector<Paths> all_outlines;
    std::vector<Paths> all_polylines;

    DISABLED_ClipperTest()
    {
    }

    void SetUp()
    {
        
        {
            all_outlines.emplace_back();
            all_outlines.back().emplace_back();
            Path& outline = all_outlines.back().back();
            outline.emplace_back(1100, 500);
            outline.emplace_back(500, 500);
            outline.emplace_back(500, 400);
            outline.emplace_back(1100, 400);
            
            all_polylines.emplace_back();
            all_polylines.back().emplace_back();
            Path& polyline = all_polylines.back().back();
            polyline.emplace_back(1075, 425);
            polyline.emplace_back(672, 425 );
            polyline.emplace_back(651, 425 );
            polyline.emplace_back(595, 424 );
            polyline.emplace_back(617, 437 );
        }
        {
            all_outlines.emplace_back();
            all_outlines.back().emplace_back();
            Path& outline = all_outlines.back().back();
            outline.emplace_back(1000, 1100);
            outline.emplace_back(300, 1100);
            outline.emplace_back(200, 1000);
            outline.emplace_back(1000, 1000);
            
            all_polylines.emplace_back();
            all_polylines.back().emplace_back();
            Path& polyline = all_polylines.back().back();
            polyline.emplace_back(992, 1050);
            polyline.emplace_back(617, 1049);
            polyline.emplace_back(660, 1074);
            polyline.emplace_back(617, 1049);
            polyline.emplace_back(582, 1049);
            polyline.emplace_back(538, 1074);
        }
    }

    void TearDown()
    {
    }
    
    static Paths intersectPolylines(const Paths& outlines, const Paths& polylines);

    static coord_t sq(coord_t i) { return i*i; };

    static coord_t calculateLength(const Paths& polylines);

    static void outputSVG(const Paths& outlines, const Paths& polylines, const Paths& intersected, const char* filename);
};

DISABLED_ClipperTest::Paths DISABLED_ClipperTest::intersectPolylines(const Paths& outlines, const Paths& polylines)
{
    ClipperLib::PolyTree result_tree;
    ClipperLib::Clipper clipper(0);
    clipper.AddPaths(polylines, ClipperLib::ptSubject, false);
    clipper.AddPaths(outlines, ClipperLib::ptClip, true);
    clipper.Execute(ClipperLib::ctIntersection, result_tree);
    Paths result;
    ClipperLib::PolyTreeToPaths(result_tree, result);
    return result;
}

DISABLED_ClipperTest::coord_t DISABLED_ClipperTest::calculateLength(const Paths& polylines)
{
    coord_t polyline_length = 0;
    for (const Path& path : polylines)
    {
        const Point* last = nullptr;
        for (const Point& p : path)
        {
            if (last)
            {
                polyline_length += std::sqrt(sq(p.X - last->X) + sq(p.Y - last->Y));
            }
            last = &p;
        }
    }
    return polyline_length;
}


TEST_F(DISABLED_ClipperTest, PolylinesTest1)
{
    Paths intersected = intersectPolylines(all_outlines[0], all_polylines[0]);
    outputSVG(all_outlines[0], all_polylines[0], intersected, "/tmp/clipper_test_0");
    ASSERT_EQ(calculateLength(intersected), calculateLength(all_polylines[0]));
}

TEST_F(DISABLED_ClipperTest, PolylinesTest2)
{
    Paths intersected = intersectPolylines(all_outlines[1], all_polylines[1]);
    outputSVG(all_outlines[1], all_polylines[1], intersected, "/tmp/clipper_test_1");
    ASSERT_EQ(calculateLength(intersected), calculateLength(all_polylines[1]));
}

    
    
void DISABLED_ClipperTest::outputSVG(const Paths& outlines, const Paths& polylines, const Paths& intersected, const char* filename)
{
#ifdef TEST_INFILL_SVG_OUTPUT
    Polygons outs;
    outs.set(outlines);
    Polygons lines;
    lines.set(polylines);
    Polygons lines_after;
    lines_after.set(intersected);
    SVG svg(filename, AABB(outs));
    svg.writePolygons(outs, SVG::Color::BLACK);
    svg.nextLayer();
    svg.writePolylines(lines_after, SVG::Color::RED);
    svg.nextLayer();
    svg.writePolylines(lines, SVG::Color::GREEN);
#endif // TEST_INFILL_SVG_OUTPUT
}    


} //namespace cura