Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvng <viktor.govako@gmail.com>2011-10-06 00:34:08 +0400
committerAlex Zolotarev <alex@maps.me>2015-09-23 01:25:12 +0300
commit0b2fc2f1429f294d47446e4feb35e9f9951a8047 (patch)
tree5fc109a494751e02b5f923ecbaa81fc691ce6e38 /geometry
parentbf2bc5626345b91725c82f12796d8576f4c39841 (diff)
Fix region results accumulation in binary region operators.
Diffstat (limited to 'geometry')
-rw-r--r--geometry/geometry_tests/region2d_binary_op_test.cpp20
-rw-r--r--geometry/region2d/binary_operators.cpp17
2 files changed, 33 insertions, 4 deletions
diff --git a/geometry/geometry_tests/region2d_binary_op_test.cpp b/geometry/geometry_tests/region2d_binary_op_test.cpp
index 0c29b13aa5..b5c0232001 100644
--- a/geometry/geometry_tests/region2d_binary_op_test.cpp
+++ b/geometry/geometry_tests/region2d_binary_op_test.cpp
@@ -45,6 +45,22 @@ UNIT_TEST(RegionIntersect_Smoke)
TEST_EQUAL(res.size(), 0, ());
}
+
+ {
+ P arr1[] = { P(-10, -10), P(10, -10), P(10, 10), P(-10, 10) };
+ P arr2[] = { P(-5, -5), P(5, -5), P(5, 5), P(-5, 5) };
+
+ R r1, r2;
+ r1.Assign(arr1, arr1 + ARRAY_SIZE(arr1));
+ r2.Assign(arr2, arr2 + ARRAY_SIZE(arr2));
+
+ vector<R> res;
+ res.push_back(r1); // do some smoke
+ m2::IntersectRegions(r1, r2, res);
+
+ TEST_EQUAL(res.size(), 2, ());
+ TEST_EQUAL(res[1].GetRect(), m2::RectI(-5, -5, 5, 5), ());
+ }
}
UNIT_TEST(RegionDifference_Smoke)
@@ -65,8 +81,6 @@ UNIT_TEST(RegionDifference_Smoke)
TEST_EQUAL(res.size(), 1, ());
TEST_EQUAL(res[0].GetRect(), r2.GetRect(), ());
-
- // LOG(LINFO, (res[0]));
}
{
@@ -85,6 +99,7 @@ UNIT_TEST(RegionDifference_Smoke)
}
}
+/*
UNIT_TEST(RegionDifference_Data1)
{
using namespace geom_test;
@@ -150,3 +165,4 @@ UNIT_TEST(RegionDifference_Data1)
local.swap(res);
}
}
+*/
diff --git a/geometry/region2d/binary_operators.cpp b/geometry/region2d/binary_operators.cpp
index bea613f23c..24a512f14e 100644
--- a/geometry/region2d/binary_operators.cpp
+++ b/geometry/region2d/binary_operators.cpp
@@ -9,13 +9,26 @@ namespace m2
using namespace boost::polygon;
using namespace boost::polygon::operators;
+ void SpliceRegions(vector<RegionI> & src, vector<RegionI> & res)
+ {
+ for (size_t i = 0; i < src.size(); ++i)
+ {
+ res.push_back(RegionI());
+ res.back().Swap(src[i]);
+ }
+ }
+
void IntersectRegions(RegionI const & r1, RegionI const & r2, vector<RegionI> & res)
{
- res += r1 * r2;
+ vector<RegionI> local;
+ local += (r1 * r2);
+ SpliceRegions(local, res);
}
void DiffRegions(RegionI const & r1, RegionI const & r2, vector<RegionI> & res)
{
- res += boost::polygon::operators::operator-(r1, r2);
+ vector<RegionI> local;
+ local += boost::polygon::operators::operator-(r1, r2);
+ SpliceRegions(local, res);
}
}