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