diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-08-17 11:32:16 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-08-17 11:38:34 +0200 |
commit | cb1e76e4de120d20064a96be4fcc245c3d22bd78 (patch) | |
tree | 29d130592e3dfea50251771979fbaa6923d44ba9 /sql/spatial.cc | |
parent | a4885dde4ccec68bbb0268796f62e68e08ba4837 (diff) | |
parent | 48fe832650ae2dc0c2eaa957abfa959b0a2670aa (diff) | |
download | mariadb-git-cb1e76e4de120d20064a96be4fcc245c3d22bd78.tar.gz |
Merge branch '10.1' into 10.2
Diffstat (limited to 'sql/spatial.cc')
-rw-r--r-- | sql/spatial.cc | 27 |
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) { |