#At file:///home/hf/work/mysql_common/38959/
2746 Alexey Botchkov 2008-12-16
Bug#38959 archive_gis fails due to rounding difference
Multi_polygon::centroid() has an error in the implementation
per-file messages:
sql/spatial.cc
Bug#38959 archive_gis fails due to rounding difference
multi_polygon::centroid() implementation fixed
modified:
sql/spatial.cc
=== modified file 'sql/spatial.cc'
--- a/sql/spatial.cc 2007-07-05 15:24:48 +0000
+++ b/sql/spatial.cc 2008-12-16 14:11:10 +0000
@@ -1632,9 +1632,8 @@ int Gis_multi_polygon::area(double *ar,
int Gis_multi_polygon::centroid(String *result) const
{
uint32 n_polygons;
- bool first_loop= 1;
Gis_polygon p;
- double res_area, res_cx, res_cy;
+ double res_area= 0.0, res_cx= 0.0, res_cy= 0.0;
double cur_area, cur_cx, cur_cy;
const char *data= m_data;
@@ -1655,21 +1654,14 @@ int Gis_multi_polygon::centroid(String *
p.centroid_xy(&cur_cx, &cur_cy))
return 1;
- if (!first_loop)
- {
- double sum_area= res_area + cur_area;
- res_cx= (res_area * res_cx + cur_area * cur_cx) / sum_area;
- res_cy= (res_area * res_cy + cur_area * cur_cy) / sum_area;
- }
- else
- {
- first_loop= 0;
- res_area= cur_area;
- res_cx= cur_cx;
- res_cy= cur_cy;
- }
+ res_area+= cur_area;
+ res_cx+= cur_area * cur_cx;
+ res_cy+= cur_area * cur_cy;
}
+ res_cx/= res_area;
+ res_cy/= res_area;
+
return create_point(result, res_cx, res_cy);
}
| Thread |
|---|
| • bzr commit into mysql-5.0-bugteam branch (holyfoot:2746) Bug#38959 | Alexey Botchkov | 16 Dec |