Branch data Line data Source code
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 : : 21 : 0 : bool 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 : 0 : double total = 0.0; 29 : 0 : int count = lineString->numPoints(); 30 : 0 : const double *xData = lineString->xData(); 31 : 0 : const double *yData = lineString->yData(); 32 : : 33 : 0 : for ( int i = 0; i < count - 1; i++ ) 34 : : { 35 : 0 : 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 : 0 : total += val; 38 : 0 : } 39 : 0 : return total >= 0; 40 : : }