1 /*
2  * Authors: kaen, raptor, sam686, watusimoto
3  *
4  * Originally from the bitfighter source code
5  *
6  * The MIT License (MIT)
7  *
8  * Copyright (c) 2014 Bitfighter developers
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining a copy
11  * of this software and associated documentation files (the "Software"), to deal
12  * in the Software without restriction, including without limitation the rights
13  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14  * copies of the Software, and to permit persons to whom the Software is
15  * furnished to do so, subject to the following conditions:
16  *
17  * The above copyright notice and this permission notice shall be included in all
18  * copies or substantial portions of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
21  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
23  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
25  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
26  * SOFTWARE.
27  */
28 
29 #ifndef CLIP2TRI_H_
30 #define CLIP2TRI_H_
31 
32 #include <vector>
33 #include <clipper.h>
34 
35 using namespace std;
36 using namespace QtClipperLib;
37 
38 namespace c2t
39 {
40 
41 typedef signed int       S32;
42 typedef signed long long S64;
43 typedef unsigned int     U32;
44 typedef float            F32;
45 typedef double           F64;
46 
47 
48 struct Point
49 {
50    F32 x;
51    F32 y;
52 
53    Point();
54    Point(const Point &pt);
55 
56    template<class T, class U>
PointPoint57    Point(T in_x, U in_y) { x = static_cast<F32>(in_x); y = static_cast<F32>(in_y); }
58 };
59 
60 class clip2tri
61 {
62 private:
63    //
64    Path upscaleClipperPoints(const vector<Point> &inputPolygon);
65 
66    // These operate on a vector of polygons
67    Paths upscaleClipperPoints(const vector<vector<Point> > &inputPolygons);
68    vector<vector<Point> > downscaleClipperPoints(const Paths &inputPolygons);
69 
70    bool mergePolysToPolyTree(const vector<vector<Point> > &inputPolygons, PolyTree &solution);
71 
72    bool triangulateComplex(vector<Point> &outputTriangles, const Path &outline,
73          const PolyTree &polyTree, bool ignoreFills = true, bool ignoreHoles = false);
74 
75 public:
76    enum Operation { Union, Intersection, Difference, Xor };
77    clip2tri();
78    virtual ~clip2tri();
79 
80    void triangulate(const vector<vector<Point> > &inputPolygons, vector<Point> &outputTriangles,
81          const vector<Point> &boundingPolygon);
82 
83    // Clip polygons are intended as closed, even if the first and last vertex aren't the same.
84    void addClipPolygon(const Path &path);
85    // Closed means the path has to be effectively closed. Meaning path[0] == path[path.size()-1]
86    void addSubjectPath(const Path &path, bool closed);
87 
88    void clearClipper();
89 
90    Paths execute(const Operation op,
91                  const PolyFillType subjFillType = pftNonZero,
92                  const PolyFillType clipFillType = pftNonZero);
93 
94    static int pointInPolygon(const IntPoint &pt, const Path &path);
95 
96    Clipper clipper;
97    bool openSubject;
98 };
99 
100 } /* namespace c2t */
101 
102 #endif /* CLIP2TRI_H_ */
103