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)21 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   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