diff options
author | Sergei Golubchik <serg@mariadb.org> | 2017-08-08 10:18:43 +0200 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2017-08-08 10:18:43 +0200 |
commit | 8e8d42ddf0291b2364fef8e3224e65d596ef4202 (patch) | |
tree | 056e6f1c489477cb7e1c285924e88f8f02e5918b /sql/spatial.cc | |
parent | 2395adfbfd6b4425981053f074865769414b5614 (diff) | |
parent | ef2e51c39637ace64b66fa82b834e31f0e4ef38a (diff) | |
download | mariadb-git-8e8d42ddf0291b2364fef8e3224e65d596ef4202.tar.gz |
Merge branch '10.0' into 10.1
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 9c4fe168fe3..e8d2fb42383 100644 --- a/sql/spatial.cc +++ b/sql/spatial.cc @@ -1149,8 +1149,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; @@ -1164,17 +1164,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) { |