cxroots.contours.Circle — cxroots 1.1.0 documentation

# Source code for cxroots.contours.Circle

    import numpy as np
    from scipy import pi

    from ..Contour import Contour
    from ..Paths import ComplexLine, ComplexArc
    from .Annulus import Annulus

    class Circle(Contour):
    	"""
    	A positively oriented circle in the complex plane.

    	Parameters
    	----------
    	center : complex
    		The center of the circle.
    	radius : float
    		The radius of the circle.

    	Examples
    	--------
    	.. plot::
    		:include-source:

    		from cxroots import Circle
    		circle = Circle(center=1, radius=0.5)
    		circle.show()
    	"""
    	def __init__(self, center, radius):
    		self.center = center
    		self.radius = radius
    		self.axisName = ('r')

    		segments = [ComplexArc(center, radius, 0, 2*pi)]
    		super(Circle, self).__init__(segments)

    	def __str__(self):
    		return 'Circle: center={center.real:.3f}{center.imag:+.3f}i, radius={radius:.3f}'.format(center=self.center, radius=self.radius)

    	def contains(self, z):
    		""" Returns True if the point z lies within the contour, False if otherwise """
    		return abs(z - self.center) < self.radius

    	@property
    	def centralPoint(self):
    		return self.center

    	@property
    	def area(self):
    		return pi*self.radius**2

    	def subdivide(self, axis='r', divisionFactor=0.5):
    		"""
    		Subdivide the contour

    		Parameters
    		----------
    		axis : str, can only be 'r' (argument kept for consistency with 'subdivisions' method in parent Contour class)
    			The axis along which the line subdividing the contour is a constant.
    		divisionFactor : float in range (0,1), optional
    			Determines the point along 'axis' at which the line dividing the box is placed

    		Returns
    		-------
    		box1 : Annulus
    			With inner radius determined by the divisionFactor and outer radius equal to that of the original circle
    		box2 : Circle
    			With radius equal to the inner radius of box1
    		"""
    		if axis == 'r' or self.axisName[axis] == 'r':
    			box1 = Annulus(self.center, [self.radius*divisionFactor, self.radius])
    			box2 = Circle(self.center, self.radius*divisionFactor)
    			box1.segments[0] = self.segments[0]
    			box1.segments[1]._reversePath = box2.segments[0]
    			box2.segments[0]._reversePath = box1.segments[1]

    		for box in [box1, box2]:
    			box._createdBySubdivisionAxis = axis
    			box._parentBox = self
    			self._childBoxes = [box1, box2]

    		return box1, box2

    	def randomPoint(self):
    		""" Returns a random point inside the Circle """
    		r   = np.random.uniform(0,self.radius)
    		phi = np.random.uniform(0,2*pi)
    		return r*exp(1j*phi) + self.center