1 /*************************************************************************** 2 qgsvectortilemvtutils.cpp 3 -------------------------------------- 4 Date : April 2020 5 Copyright : (C) 2020 by Martin Dobias 6 Email : wonder dot sk at gmail dot com 7 *************************************************************************** 8 * * 9 * This program is free software; you can redistribute it and/or modify * 10 * it under the terms of the GNU General Public License as published by * 11 * the Free Software Foundation; either version 2 of the License, or * 12 * (at your option) any later version. * 13 * * 14 ***************************************************************************/ 15 16 #include "qgsvectortilemvtutils.h" 17 18 #include "qgslinestring.h" 19 20 isExteriorRing(const QgsLineString * lineString)21bool QgsVectorTileMVTUtils::isExteriorRing( const QgsLineString *lineString ) 22 { 23 // Exterior rings have POSITIVE area while interior rings have NEGATIVE area 24 // when calculated with https://en.wikipedia.org/wiki/Shoelace_formula 25 // The orientation of axes is that X grows to the right and Y grows to the bottom. 26 // the input data are expected to form a closed ring, i.e. first pt == last pt. 27 28 double total = 0.0; 29 const int count = lineString->numPoints(); 30 const double *xData = lineString->xData(); 31 const double *yData = lineString->yData(); 32 33 for ( int i = 0; i < count - 1; i++ ) 34 { 35 const double val = ( xData[i + 1] - xData[i] ) * ( yData[i + 1] + yData[i] ); 36 //double val = xData[i] * (-yData[i+1]) - xData[i+1] * (-yData[i]); // gives the same result 37 total += val; 38 } 39 return total >= 0; 40 } 41