class Arrow(Line): CONFIG = { "color" : YELLOW_C, "tip_length" : 0.25, "tip_angle" : np.pi/6, "buff" : MED_SMALL_BUFF, "propogate_style_to_family" : False, "preserve_tip_size_when_scaling" : True, } def __init__(self, *args, **kwargs): points = map(self.pointify, args) if len(args) == 1: args = (points[0]+UP+LEFT, points[0]) Line.__init__(self, *args, **kwargs) self.add_tip() def add_tip(self, add_at_end = True): vect = self.tip_length*RIGHT vect = rotate_vector(vect, self.get_angle()+np.pi) start, end = self.get_start_and_end() if not add_at_end: start, end = end, start vect = -vect tip_points = [ end+rotate_vector(vect, u*self.tip_angle) for u in 1, -1 ] self.tip = VMobject( close_new_points = True, mark_paths_closed = True, fill_color = self.color, fill_opacity = 1, stroke_color = self.color, ) self.tip.set_anchor_points( [tip_points[0], end, tip_points[1]], mode = "corners" ) self.set_points_as_corners( [start, center_of_mass(tip_points)] ) self.add(self.tip) self.init_colors() def get_end(self): if hasattr(self, "tip"): return self.tip.get_anchors()[1] else: return Line.get_end(self) def get_tip(self): return self.tip def scale(self, scale_factor, **kwargs): Line.scale(self, scale_factor, **kwargs) if self.preserve_tip_size_when_scaling: self.remove(self.tip) self.add_tip() return self
class Arrow(Line): CONFIG = { "color" : YELLOW_C, "tip_length" : 0.25, "tip_angle" : np.pi/6, "buff" : MED_SMALL_BUFF, "propogate_style_to_family" : False, "preserve_tip_size_when_scaling" : True, } def __init__(self, *args, **kwargs): points = map(self.pointify, args) if len(args) == 1: args = (points[0]+UP+LEFT, points[0]) Line.__init__(self, *args, **kwargs) self.add_tip() def add_tip(self, add_at_end = True): start, end = self.get_start_and_end() anchors = self.get_anchors() vect = anchors[-1] - anchors[-2] vect *= -self.tip_length / np.linalg.norm(vect) if not add_at_end: start, end = end, start vect = -vect tip_points = [ end+rotate_vector(vect, u*self.tip_angle) for u in 1, -1 ] self.tip = VMobject( close_new_points = True, mark_paths_closed = True, fill_color = self.color, fill_opacity = 1, stroke_color = self.color, ) self.tip.set_anchor_points( [tip_points[0], end, tip_points[1]], mode = "corners" ) self.add(self.tip) self.init_colors() def get_end(self): if hasattr(self, "tip"): return self.tip.get_anchors()[1] else: return Line.get_end(self) def get_tip(self): return self.tip def scale(self, scale_factor, **kwargs): Line.scale(self, scale_factor, **kwargs) if self.preserve_tip_size_when_scaling: self.remove(self.tip) self.add_tip() return self
class Arrow(Line): CONFIG = { "color" : YELLOW_C, "tip_length" : 0.25, "tip_angle" : np.pi/6, "buff" : 0.3, "propogate_style_to_family" : False, "preserve_tip_size_when_scaling" : True, } def __init__(self, *args, **kwargs): if len(args) == 1: point = self.pointify(args[0]) args = (point+UP+LEFT, target) Line.__init__(self, *args, **kwargs) self.add_tip() def add_tip(self, add_at_end = True): vect = self.tip_length*RIGHT vect = rotate_vector(vect, self.get_angle()+np.pi) start, end = self.get_start_and_end() if not add_at_end: start, end = end, start vect = -vect tip_points = [ end+rotate_vector(vect, u*self.tip_angle) for u in 1, -1 ] self.tip = VMobject( close_new_points = True, mark_paths_closed = True, fill_color = self.color, fill_opacity = 1, stroke_color = self.color, ) self.tip.set_anchor_points( [tip_points[0], end, tip_points[1]], mode = "corners" ) self.add(self.tip) self.init_colors() def get_tip(self): return self.tip def scale(self, scale_factor): Line.scale(self, scale_factor) if self.preserve_tip_size_when_scaling: self.remove(self.tip) self.add_tip() return self
class Arrow(Line): CONFIG = { "color" : YELLOW_C, "tip_length" : 0.25, "buff" : 0.3, "propogate_style_to_family" : True, "preserve_tip_size_when_scaling" : True, } def __init__(self, *args, **kwargs): if len(args) == 1: point = self.pointify(args[0]) args = (point+UP+LEFT, target) Line.__init__(self, *args, **kwargs) self.add_tip() def add_tip(self): vect = self.tip_length*RIGHT vect = rotate_vector(vect, self.get_angle()+np.pi) start, end = self.get_start_and_end() tip_points = [ end+rotate_vector(vect, u*np.pi/5) for u in 1, -1 ] self.tip = VMobject(close_new_points = False) self.tip.set_anchor_points( [tip_points[0], end, tip_points[1]], mode = "corners" ) self.add(self.tip) self.init_colors() def scale(self, scale_factor): Line.scale(self, scale_factor) if self.preserve_tip_size_when_scaling: self.remove(self.tip) self.add_tip()