diff --git a/src/core/pal/pointset.cpp b/src/core/pal/pointset.cpp index a1beefd976a6..284e7e1ddc37 100644 --- a/src/core/pal/pointset.cpp +++ b/src/core/pal/pointset.cpp @@ -962,18 +962,28 @@ namespace pal // http://local.wasp.uwa.edu.au/~pbourke/geometry/polyarea/ int i, j; - double cx = 0, cy = 0, A = 0, tmp; + double cx = 0, cy = 0, A = 0, tmp, sumx = 0, sumy = 0; for ( i = 0; i < nbPoints; i++ ) { j = i + 1; if ( j == nbPoints ) j = 0; - tmp = ( x[i] * y[j] - x[j] * y[i] ); - cx += ( x[i] + x[j] ) * tmp; - cy += ( y[i] + y[j] ) * tmp; + tmp = (( x[i] - x[0] ) * ( y[j] - y[0] ) - ( x[j] - x[0] ) * ( y[i] - y[0] ) ); + cx += ( x[i] + x[j] - 2 * x[0] ) * tmp; + cy += ( y[i] + y[j] - 2 * y[0] ) * tmp; A += tmp; + sumx += x[i]; + sumy += y[i]; } - px = cx / ( 3 * A ); - py = cy / ( 3 * A ); + if ( A == 0 ) + { + px = sumx / nbPoints; + py = sumy / nbPoints; + } + else + { + px = cx / ( 3 * A ) + x[0]; + py = cy / ( 3 * A ) + y[0]; + } } } // end namespace