summaryrefslogtreecommitdiff
path: root/sql/spatial.cc
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2017-08-17 11:32:16 +0200
committerSergei Golubchik <serg@mariadb.org>2017-08-17 11:38:34 +0200
commitcb1e76e4de120d20064a96be4fcc245c3d22bd78 (patch)
tree29d130592e3dfea50251771979fbaa6923d44ba9 /sql/spatial.cc
parenta4885dde4ccec68bbb0268796f62e68e08ba4837 (diff)
parent48fe832650ae2dc0c2eaa957abfa959b0a2670aa (diff)
downloadmariadb-git-cb1e76e4de120d20064a96be4fcc245c3d22bd78.tar.gz
Merge branch '10.1' into 10.2
Diffstat (limited to 'sql/spatial.cc')
-rw-r--r--sql/spatial.cc27
1 files changed, 21 insertions, 6 deletions
diff --git a/sql/spatial.cc b/sql/spatial.cc
index 1ba754b6b13..8817e82d6c4 100644
--- a/sql/spatial.cc
+++ b/sql/spatial.cc
@@ -1663,8 +1663,8 @@ int Gis_polygon::centroid_xy(double *x, double *y) const
uint32 n_points, org_n_points;
double prev_x, prev_y;
double cur_area= 0;
- double cur_cx= 0;
- double cur_cy= 0;
+ double cur_cx= 0, cur_cy= 0;
+ double sum_cx= 0, sum_cy= 0;
if (no_data(data, 4))
return 1;
@@ -1678,17 +1678,32 @@ int Gis_polygon::centroid_xy(double *x, double *y) const
while (--n_points) // One point is already read
{
double tmp_x, tmp_y;
+ double loc_area;
get_point(&tmp_x, &tmp_y, data);
data+= POINT_DATA_SIZE;
- cur_area+= (prev_x + tmp_x) * (prev_y - tmp_y);
+ loc_area= prev_x * tmp_y - tmp_x * prev_y;
+ cur_area+= loc_area;
cur_cx+= tmp_x;
cur_cy+= tmp_y;
+ sum_cx+= (prev_x + tmp_x) * loc_area;
+ sum_cy+= (prev_y + tmp_y) * loc_area;
+
prev_x= tmp_x;
prev_y= tmp_y;
}
- cur_area= fabs(cur_area) / 2;
- cur_cx= cur_cx / (org_n_points - 1);
- cur_cy= cur_cy / (org_n_points - 1);
+
+ if (fabs(cur_area) > 1e-10)
+ {
+ cur_cx= sum_cx / cur_area / 3.0;
+ cur_cy= sum_cy / cur_area / 3.0;
+ }
+ else
+ {
+ cur_cx= cur_cx / (org_n_points - 1);
+ cur_cy= cur_cy / (org_n_points - 1);
+ }
+
+ cur_area= fabs(cur_area);
if (!first_loop)
{