Clean up Sector classes

This commit is contained in:
Grant Sanderson 2019-02-07 10:12:42 -08:00
parent aa3d9e1a49
commit ef7b2919d2

View file

@ -17,6 +17,9 @@ from manimlib.utils.space_ops import get_norm
from manimlib.utils.space_ops import rotate_vector from manimlib.utils.space_ops import rotate_vector
DEFAULT_DOT_RADIUS = 0.08
class Arc(VMobject): class Arc(VMobject):
CONFIG = { CONFIG = {
"radius": 1.0, "radius": 1.0,
@ -193,32 +196,29 @@ class Circle(Arc):
class Dot(Circle): class Dot(Circle):
CONFIG = { CONFIG = {
"radius": 0.08, "radius": DEFAULT_DOT_RADIUS,
"stroke_width": 0, "stroke_width": 0,
"fill_opacity": 1.0, "fill_opacity": 1.0,
"color": WHITE "color": WHITE
} }
def __init__(self, point=ORIGIN, **kwargs): def __init__(self, point=ORIGIN, **kwargs):
Circle.__init__(self, **kwargs) Circle.__init__(self, arc_center=point, **kwargs)
self.shift(point)
self.init_colors()
class Ellipse(VMobject): class Ellipse(Circle):
CONFIG = { CONFIG = {
"width": 2, "width": 2,
"height": 1 "height": 1
} }
def generate_points(self): def __init__(self, **kwargs):
circle = Circle(radius=1) Circle.__init__(self, **kwargs)
circle = circle.stretch_to_fit_width(self.width) self.set_width(width, stretch=True)
circle = circle.stretch_to_fit_height(self.height) self.set_height(width, stretch=True)
self.points = circle.points
class AnnularSector(VMobject): class AnnularSector(Arc):
CONFIG = { CONFIG = {
"inner_radius": 1, "inner_radius": 1,
"outer_radius": 2, "outer_radius": 2,
@ -227,45 +227,23 @@ class AnnularSector(VMobject):
"fill_opacity": 1, "fill_opacity": 1,
"stroke_width": 0, "stroke_width": 0,
"color": WHITE, "color": WHITE,
"mark_paths_closed": True,
} }
def generate_points(self): def generate_points(self):
arc1 = Arc( inner_arc, outer_arc = [
angle=self.angle, Arc(
start_angle=self.start_angle, start_angle=self.start_angle,
radius=self.inner_radius, angle=self.angle,
radius=radius,
arc_center=self.arc_center,
) )
arc2 = Arc( for radius in (self.inner_radius, self.outer_radius)
angle=-1 * self.angle, ]
start_angle=self.start_angle + self.angle, outer_arc.reverse_points()
radius=self.outer_radius, self.append_points(inner_arc.points)
) self.add_line_to(outer_arc.points[0])
a1_to_a2_points = np.array([ self.append_points(outer_arc.points)
interpolate(arc1.points[-1], arc2.points[0], alpha) self.add_line_to(inner_arc.points[0])
for alpha in np.linspace(0, 1, 4)
])
a2_to_a1_points = np.array([
interpolate(arc2.points[-1], arc1.points[0], alpha)
for alpha in np.linspace(0, 1, 4)
])
self.points = np.array(arc1.points)
self.add_cubic_bezier_curve(*a1_to_a2_points[1:])
self.add_cubic_bezier_curve(*arc2.points[1:])
self.add_cubic_bezier_curve(*a2_to_a1_points[1:])
def get_arc_center(self):
first_point = self.points[0]
last_point = self.points[-2]
v = last_point - first_point
radial_unit_vector = v / get_norm(v)
arc_center = first_point - self.inner_radius * radial_unit_vector
return arc_center
def move_arc_center_to(self, point):
v = point - self.get_arc_center()
self.shift(v)
return self
class Sector(AnnularSector): class Sector(AnnularSector):
@ -274,14 +252,6 @@ class Sector(AnnularSector):
"inner_radius": 0 "inner_radius": 0
} }
@property
def radius(self):
return self.outer_radius
@radius.setter
def radius(self, new_radius):
self.outer_radius = new_radius
class Annulus(Circle): class Annulus(Circle):
CONFIG = { CONFIG = {
@ -294,13 +264,13 @@ class Annulus(Circle):
} }
def generate_points(self): def generate_points(self):
self.points = []
self.radius = self.outer_radius self.radius = self.outer_radius
outer_circle = Circle(radius=self.outer_radius) outer_circle = Circle(radius=self.outer_radius)
inner_circle = Circle(radius=self.inner_radius) inner_circle = Circle(radius=self.inner_radius)
inner_circle.flip() inner_circle.reverse_points()
self.points = outer_circle.points self.append_points(outer_circle.points)
self.add_subpath(inner_circle.points) self.append_points(inner_circle.points)
self.shift(self.arc_center)
class Line(VMobject): class Line(VMobject):