Skip to content

Commit 605fe44

Browse files
committed
Experimental rotation.setter for PolygonPixelRegion
1 parent e74ec80 commit 605fe44

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

regions/shapes/polygon.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ def __init__(self, vertices, meta=None, visual=None,
7070
self.visual = visual or RegionVisual()
7171
self.origin = origin
7272
self.vertices = vertices + origin
73+
self._rotation = 0.0 * u.degree
7374

7475
@property
7576
def area(self):
@@ -301,6 +302,24 @@ def rotate(self, center, angle):
301302
vertices = self.vertices.rotate(center, angle)
302303
return self.copy(vertices=vertices)
303304

305+
@property
306+
def rotation(self):
307+
"""
308+
Rotation angle to apply in-place rotations (operating on this instance).
309+
Since `.setter` will apply the rotation directly on the vertices, this
310+
value will always be reset to 0.
311+
"""
312+
return self._rotation
313+
314+
@rotation.setter
315+
def rotation(self, angle):
316+
self.vertices = self.vertices.rotate(self.centroid, angle - self._rotation)
317+
self._rotation = 0.0 * u.degree
318+
if hasattr(self, '_mpl_selector'):
319+
self._mpl_selector.verts = list(zip(self.vertices.x, self.vertices.y))
320+
if getattr(self, '_mpl_selector_callback', None) is not None:
321+
self._mpl_selector_callback(self)
322+
304323

305324
class RegularPolygonPixelRegion(PolygonPixelRegion):
306325
"""

regions/shapes/tests/test_polygon.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,22 @@ def test_origin(self):
115115
reg2 = PolygonPixelRegion(relverts, origin=origin)
116116
assert_equal(reg1.vertices, reg2.vertices)
117117

118+
def test_rotation(self):
119+
"""Test 'in-place' rotation of polygon instance, including full rotation"""
120+
self.reg.rotation = 90 * u.deg
121+
assert_allclose(self.reg.vertices.x, [8/3., 8/3., -1/3.], rtol=1e-9)
122+
assert_allclose(self.reg.vertices.y, [4/3., 10/3., 4/3.], rtol=1e-9)
123+
assert_allclose(self.reg.rotation, 0 * u.deg, rtol=1e-9)
124+
125+
self.reg.rotation = 90 * u.deg
126+
assert_allclose(self.reg.vertices.x, [7/3., 1/3., 7/3.], rtol=1e-9)
127+
assert_allclose(self.reg.vertices.y, [3, 3, 0], rtol=1e-9)
128+
129+
self.reg.rotation = 180 * u.deg
130+
assert_allclose(self.reg.vertices.x, [1, 3, 1], rtol=1e-9)
131+
assert_allclose(self.reg.vertices.y, [1, 1, 4], rtol=1e-9)
132+
assert_allclose(self.reg.rotation, 0 * u.deg, rtol=1e-9)
133+
118134

119135
class TestPolygonSkyRegion(BaseTestSkyRegion):
120136

0 commit comments

Comments
 (0)