mirror of
https://github.com/boostorg/geometry.git
synced 2026-02-09 11:12:21 +00:00
Merge pull request #154 from awulkiew/fix/point_on_surface
Fix/point on surface
This commit is contained in:
@@ -142,6 +142,30 @@ struct min_of_intruder
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
template <typename Point, typename P>
|
||||
inline void calculate_average(Point& point, std::vector<P> const& points)
|
||||
{
|
||||
typedef typename geometry::coordinate_type<Point>::type coordinate_type;
|
||||
typedef typename std::vector<P>::const_iterator iterator_type;
|
||||
typedef typename std::vector<P>::size_type size_type;
|
||||
|
||||
coordinate_type x = 0;
|
||||
coordinate_type y = 0;
|
||||
|
||||
iterator_type end = points.end();
|
||||
for ( iterator_type it = points.begin() ; it != end ; ++it)
|
||||
{
|
||||
x += geometry::get<0>(*it);
|
||||
y += geometry::get<1>(*it);
|
||||
}
|
||||
|
||||
size_type const count = points.size();
|
||||
geometry::set<0>(point, x / count);
|
||||
geometry::set<1>(point, y / count);
|
||||
}
|
||||
|
||||
|
||||
template <typename Point, typename Segments>
|
||||
inline void calculate_centroid(Point& point, Segments const& segments)
|
||||
{
|
||||
@@ -305,7 +329,8 @@ inline bool calculate_point_on_surface(Geometry const& geometry, Point& point)
|
||||
}
|
||||
|
||||
// Now calculate the centroid of the (possibly adapted) extremes
|
||||
calculate_centroid(point, extremes);
|
||||
calculate_average(point, extremes);
|
||||
//calculate_centroid(point, extremes);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -51,15 +51,11 @@
|
||||
#endif
|
||||
|
||||
template <typename Geometry>
|
||||
void test_geometry(std::string const& case_id, std::string const& wkt, double expected_x, double expected_y)
|
||||
void test_geometry(std::string const& case_id, Geometry const& geometry, double /*expected_x*/ = 0, double /*expected_y*/ = 0)
|
||||
{
|
||||
//std::cout << case_id << std::endl;
|
||||
typedef typename bg::point_type<Geometry>::type point_type;
|
||||
|
||||
Geometry geometry;
|
||||
bg::read_wkt(wkt, geometry);
|
||||
bg::correct(geometry);
|
||||
|
||||
point_type point;
|
||||
bg::point_on_surface(geometry, point);
|
||||
|
||||
@@ -125,6 +121,15 @@ void test_geometry(std::string const& case_id, std::string const& wkt, double ex
|
||||
|
||||
}
|
||||
|
||||
template <typename Geometry>
|
||||
void test_geometry(std::string const& case_id, std::string const& wkt, double expected_x = 0, double expected_y = 0)
|
||||
{
|
||||
Geometry geometry;
|
||||
bg::read_wkt(wkt, geometry);
|
||||
bg::correct(geometry);
|
||||
test_geometry(case_id, geometry, expected_x, expected_y);
|
||||
}
|
||||
|
||||
template <typename Point>
|
||||
void test_all()
|
||||
{
|
||||
@@ -152,6 +157,9 @@ void test_all()
|
||||
test_geometry<polygon>("disjoint_simplex0", disjoint_simplex[0], 0, 0);
|
||||
test_geometry<polygon>("disjoint_simplex1", disjoint_simplex[1], 0, 0);
|
||||
|
||||
test_geometry<polygon>("ticket_10643", "POLYGON((1074699.93 703064.65, 1074703.90 703064.58, 1074704.53 703061.40, 1074702.10 703054.62, 1074699.93 703064.65))");
|
||||
test_geometry<polygon>("ticket_10643_2", "POLYGON((699.93 64.65, 703.90 64.58, 704.53 61.40, 702.10 54.62, 699.93 64.65))");
|
||||
|
||||
#if defined(BOOST_GEOMETRY_UNIT_TEST_MULTI)
|
||||
{
|
||||
typedef bg::model::multi_polygon<polygon> multi_polygon;
|
||||
@@ -303,12 +311,29 @@ void test_all()
|
||||
test_geometry<polygon>("ticket_8254", ticket_8254[0], 0, 0);
|
||||
}
|
||||
|
||||
template <typename Point>
|
||||
void test_dense(std::string const& case_id, double size)
|
||||
{
|
||||
typedef bg::model::polygon<Point> polygon;
|
||||
polygon poly;
|
||||
double thres = 3.14158 / 8;
|
||||
for ( double a = thres ; a > -thres ; a -= 0.01 )
|
||||
{
|
||||
bg::append(poly, Point(size * ::cos(a), size * ::sin(a)));
|
||||
}
|
||||
bg::append(poly, Point(-size, 0));
|
||||
|
||||
test_geometry(case_id, poly);
|
||||
}
|
||||
|
||||
|
||||
int test_main(int, char* [])
|
||||
{
|
||||
test_all<bg::model::d2::point_xy<double> >();
|
||||
|
||||
test_dense<bg::model::d2::point_xy<double> >("dense1", 100);
|
||||
test_dense<bg::model::d2::point_xy<double> >("dense2", 1000000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user