From 2d97dc577ff4ae38ad4c4b7d936af231c085ceb5 Mon Sep 17 00:00:00 2001 From: Taksh Date: Mon, 5 Oct 2026 07:09:09 +0530 Subject: [PATCH] Preserve nonempty points and segments when simplifying region unions --- blueprint/src/python/helpers/region_helper.py | 2 +- .../tests/test_thin_union_regression.py | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 blueprint/src/python/tests/test_thin_union_regression.py diff --git a/blueprint/src/python/helpers/region_helper.py b/blueprint/src/python/helpers/region_helper.py index 7189272..c6f4144 100644 --- a/blueprint/src/python/helpers/region_helper.py +++ b/blueprint/src/python/helpers/region_helper.py @@ -16,7 +16,7 @@ def simplify_union_of_polys(polys, union_fn, track_dependencies=False): # Remove all empty polytopes for i in range(len(polys)): - if polys[i].is_empty(include_boundary=False): + if polys[i].is_empty(include_boundary=True): index.remove(i) # Keep track of the tuples (int, int) of indexes which do not form a pairwise diff --git a/blueprint/src/python/tests/test_thin_union_regression.py b/blueprint/src/python/tests/test_thin_union_regression.py new file mode 100644 index 0000000..496e479 --- /dev/null +++ b/blueprint/src/python/tests/test_thin_union_regression.py @@ -0,0 +1,21 @@ +from polytope import Polytope +from region import Region + + +def test_simplification_preserves_isolated_point(): + point = Polytope.rect((2, 2), (3, 3)) + region = Region.union([Region.from_polytope(point)]) + assert region.contains((2, 3)) + region.simplify() + assert region.contains((2, 3)) + assert not region.contains((2, 4)) + + +def test_simplification_preserves_segment_outside_full_dimensional_component(): + rectangle = Polytope.rect((0, 1), (0, 1)) + segment = Polytope.rect((2, 2), (0, 1)) + region = Region.union([Region.from_polytope(rectangle), Region.from_polytope(segment)]) + points = [(0, 0), (0.5, 0.5), (2, 0), (2, 0.5), (2, 1), (1.5, 0.5)] + before = [region.contains(point) for point in points] + region.simplify() + assert [region.contains(point) for point in points] == before