def get_eyes(self, mode=None, thing_to_look_at=None): mode = mode or self.mode if thing_to_look_at is None: thing_to_look_at = self.thing_looked_at pi = Randolph(mode=mode) eyes = VGroup(pi.eyes, pi.pupils) pi.scale(self.height / eyes.get_height()) if self.submobjects: eyes.move_to(self, DOWN) else: eyes.move_to(self.mobject.get_top(), DOWN) if thing_to_look_at is not None: pi.look_at(thing_to_look_at) return eyes
def get_secant_slope_group( self, x, graph, dx = None, dx_line_color = None, df_line_color = None, dx_label = None, df_label = None, include_secant_line = True, secant_line_color = None, secant_line_length = 10, ): """ Resulting group is of the form VGroup( dx_line, df_line, dx_label, (if applicable) df_label, (if applicable) secant_line, (if applicable) ) with attributes of those names. """ kwargs = locals() kwargs.pop("self") group = VGroup() group.kwargs = kwargs dx = dx or float(self.x_max - self.x_min)/10 dx_line_color = dx_line_color or self.default_input_color df_line_color = df_line_color or graph.get_color() p1 = self.input_to_graph_point(x, graph) p2 = self.input_to_graph_point(x+dx, graph) interim_point = p2[0]*RIGHT + p1[1]*UP group.dx_line = Line( p1, interim_point, color = dx_line_color ) group.df_line = Line( interim_point, p2, color = df_line_color ) group.add(group.dx_line, group.df_line) labels = VGroup() if dx_label is not None: group.dx_label = TexMobject(dx_label) labels.add(group.dx_label) group.add(group.dx_label) if df_label is not None: group.df_label = TexMobject(df_label) labels.add(group.df_label) group.add(group.df_label) if len(labels) > 0: max_width = 0.8*group.dx_line.get_width() max_height = 0.8*group.df_line.get_height() if labels.get_width() > max_width: labels.scale_to_fit_width(max_width) if labels.get_height() > max_height: labels.scale_to_fit_height(max_height) if dx_label is not None: group.dx_label.next_to( group.dx_line, np.sign(dx)*DOWN, buff = group.dx_label.get_height()/2 ) group.dx_label.highlight(group.dx_line.get_color()) if df_label is not None: group.df_label.next_to( group.df_line, np.sign(dx)*RIGHT, buff = group.df_label.get_height()/2 ) group.df_label.highlight(group.df_line.get_color()) if include_secant_line: secant_line_color = secant_line_color or self.default_derivative_color group.secant_line = Line(p1, p2, color = secant_line_color) group.secant_line.scale_in_place( secant_line_length/group.secant_line.get_length() ) group.add(group.secant_line) return group
def construct(self): morty = Mortimer() morty.next_to(ORIGIN, DOWN) n_patrons = len(self.specific_patrons) special_thanks = TextMobject("Special thanks") special_thanks.highlight(YELLOW) special_thanks.to_edge(UP) patreon_logo = PatreonLogo() patreon_logo.next_to(morty, UP, buff = MED_LARGE_BUFF) left_patrons = VGroup(*map(TextMobject, self.specific_patrons[:n_patrons/2] )) right_patrons = VGroup(*map(TextMobject, self.specific_patrons[n_patrons/2:] )) for patrons in left_patrons, right_patrons: patrons.arrange_submobjects( DOWN, aligned_edge = LEFT, buff = 1.5*MED_SMALL_BUFF ) all_patrons = VGroup(left_patrons, right_patrons) all_patrons.scale(self.patron_scale_val) for patrons, vect in (left_patrons, LEFT), (right_patrons, RIGHT): patrons.to_edge(vect, buff = MED_SMALL_BUFF) if patrons.get_height() > 2*SPACE_HEIGHT - LARGE_BUFF: patrons.to_edge(UP, buff = MED_SMALL_BUFF) shift_distance = max( 0, (all_patrons.get_height() - 2*SPACE_HEIGHT) ) if shift_distance > 0: shift_distance += 1 velocity = shift_distance/9.0 def get_shift_anim(): return ApplyMethod( all_patrons.shift, velocity*UP, rate_func = None ) self.play( morty.change_mode, "gracious", DrawBorderThenFill(patreon_logo), ) self.play(Write(special_thanks, run_time = 1)) self.play( Write(left_patrons), morty.look_at, left_patrons ) self.play( Write(right_patrons), morty.look_at, right_patrons ) self.play(Blink(morty), get_shift_anim()) for patrons in left_patrons, right_patrons: for index in 0, -1: self.play( morty.look_at, patrons[index], get_shift_anim() ) self.play(get_shift_anim())