Source code for samuroi.masks.circle
from .mask import Mask
from ..util.event import Event
[docs]class CircleMask(Mask):
def __init__(self, center, radius, name=None):
super(CircleMask, self).__init__(name=name)
import numpy
# use private variables and properties because masks should be either immutable or use changed signal.
self.__center = numpy.array([center[0], center[1]])
self.__radius = radius
angle = numpy.linspace(0, 2 * numpy.pi, 100)
x = self.radius * numpy.cos(angle) + self.center[0]
y = self.radius * numpy.sin(angle) + self.center[1]
corners = numpy.column_stack((x, y))
from .polygon import PolygonMask
self.__polygon = PolygonMask(outline=corners)
self.changed = Event()
@property
def center(self):
return self.__center
@property
def radius(self):
return self.__radius
[docs] def move(self, offset):
"""
Move the circle mask in the direction defined by offset. Will trigger the changed event.
:param offset: list with two elements denoting x (positive right, negative left) and y (positive up, negative down).
"""
self.__center[0]+=offset[0]
self.__center[1]+=offset[1]
import numpy
angle = numpy.linspace(0, 2 * numpy.pi, 100)
x = self.radius * numpy.cos(angle) + self.center[0]
y = self.radius * numpy.sin(angle) + self.center[1]
corners = numpy.column_stack((x, y))
from .polygon import PolygonMask
self.__polygon = PolygonMask(outline=corners)
self.changed(self)
[docs] def to_hdf5(self, f):
if 'circles' not in f:
f.create_group('circles')
data = [self.center[0], self.center[1], self.radius]
f.create_dataset('circles/' + self.name, data=data)
@staticmethod
[docs] def from_hdf5(f):
if 'circles' in f:
for name, dataset in f['circles'].iteritems():
center = dataset.value[0:2]
radius = dataset.value[2]
yield CircleMask(name=name, center=center, radius=radius)
def __call__(self, data, mask):
return self.__polygon(data, mask)