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
35using namespace std;
36using namespace QtClipperLib;
37
38namespace c2t
39{
40
41typedef signed int S32;
42typedef signed long long S64;
43typedef unsigned int U32;
44typedef float F32;
45typedef double F64;
46
47
48struct Point
49{
50 F32 x;
51 F32 y;
52
53 Point();
54 Point(const Point &pt);
55
56 template<class T, class U>
57 Point(T in_x, U in_y) { x = static_cast<F32>(in_x); y = static_cast<F32>(in_y); }
58};
59
60class clip2tri
61{
62private:
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
75public:
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

source code of qtlocation/src/3rdparty/clip2tri/clip2tri.h