Branch data Line data Source code
1 : : /* 2 : : * Poly2Tri Copyright (c) 2009-2018, Poly2Tri Contributors 3 : : * https://github.com/jhasse/poly2tri 4 : : * 5 : : * All rights reserved. 6 : : * 7 : : * Redistribution and use in source and binary forms, with or without modification, 8 : : * are permitted provided that the following conditions are met: 9 : : * 10 : : * * Redistributions of source code must retain the above copyright notice, 11 : : * this list of conditions and the following disclaimer. 12 : : * * Redistributions in binary form must reproduce the above copyright notice, 13 : : * this list of conditions and the following disclaimer in the documentation 14 : : * and/or other materials provided with the distribution. 15 : : * * Neither the name of Poly2Tri nor the names of its contributors may be 16 : : * used to endorse or promote products derived from this software without specific 17 : : * prior written permission. 18 : : * 19 : : * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 : : * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21 : : * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22 : : * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 23 : : * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 : : * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 : : * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26 : : * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27 : : * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28 : : * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29 : : * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 : : */ 31 : : 32 : : #ifndef UTILS_H 33 : : #define UTILS_H 34 : : 35 : : // Otherwise #defines like M_PI are undeclared under Visual Studio 36 : : #ifndef _USE_MATH_DEFINES 37 : : #define _USE_MATH_DEFINES 38 : : #endif 39 : : 40 : : #include "shapes.h" 41 : : 42 : : #include <cmath> 43 : : #include <exception> 44 : : 45 : : // C99 removes M_PI from math.h 46 : : #ifndef M_PI 47 : : #define M_PI 3.14159265358979323846264338327 48 : : #endif 49 : : 50 : : namespace p2t { 51 : : 52 : : const double PI_3div4 = 3 * M_PI / 4; 53 : : const double PI_div2 = 1.57079632679489661923; 54 : : const double EPSILON = 1e-12; 55 : : 56 : : enum Orientation { CW, CCW, COLLINEAR }; 57 : : 58 : : /** 59 : : * Forumla to calculate signed area<br> 60 : : * Positive if CCW<br> 61 : : * Negative if CW<br> 62 : : * 0 if collinear<br> 63 : : * <pre> 64 : : * A[P1,P2,P3] = (x1*y2 - y1*x2) + (x2*y3 - y2*x3) + (x3*y1 - y3*x1) 65 : : * = (x1-x3)*(y2-y3) - (y1-y3)*(x2-x3) 66 : : * </pre> 67 : : */ 68 : 169 : Orientation Orient2d(const Point& pa, const Point& pb, const Point& pc) 69 : : { 70 : 169 : double detleft = (pa.x - pc.x) * (pb.y - pc.y); 71 : 169 : double detright = (pa.y - pc.y) * (pb.x - pc.x); 72 : 169 : double val = detleft - detright; 73 : 169 : if (val > -EPSILON && val < EPSILON) { 74 : 0 : return COLLINEAR; 75 : 169 : } else if (val > 0) { 76 : 13 : return CCW; 77 : : } 78 : 156 : return CW; 79 : 169 : } 80 : : 81 : : /* 82 : : bool InScanArea(Point& pa, Point& pb, Point& pc, Point& pd) 83 : : { 84 : : double pdx = pd.x; 85 : : double pdy = pd.y; 86 : : double adx = pa.x - pdx; 87 : : double ady = pa.y - pdy; 88 : : double bdx = pb.x - pdx; 89 : : double bdy = pb.y - pdy; 90 : : 91 : : double adxbdy = adx * bdy; 92 : : double bdxady = bdx * ady; 93 : : double oabd = adxbdy - bdxady; 94 : : 95 : : if (oabd <= EPSILON) { 96 : : return false; 97 : : } 98 : : 99 : : double cdx = pc.x - pdx; 100 : : double cdy = pc.y - pdy; 101 : : 102 : : double cdxady = cdx * ady; 103 : : double adxcdy = adx * cdy; 104 : : double ocad = cdxady - adxcdy; 105 : : 106 : : if (ocad <= EPSILON) { 107 : : return false; 108 : : } 109 : : 110 : : return true; 111 : : } 112 : : 113 : : */ 114 : : 115 : 0 : bool InScanArea(const Point& pa, const Point& pb, const Point& pc, const Point& pd) 116 : : { 117 : 0 : double oadb = (pa.x - pb.x)*(pd.y - pb.y) - (pd.x - pb.x)*(pa.y - pb.y); 118 : 0 : if (oadb >= -EPSILON) { 119 : 0 : return false; 120 : : } 121 : : 122 : 0 : double oadc = (pa.x - pc.x)*(pd.y - pc.y) - (pd.x - pc.x)*(pa.y - pc.y); 123 : 0 : if (oadc <= EPSILON) { 124 : 0 : return false; 125 : : } 126 : 0 : return true; 127 : 0 : } 128 : : 129 : : } 130 : : 131 : : #endif