mirror of
				https://github.com/3b1b/manim.git
				synced 2025-11-01 15:08:59 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			3.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from big_ol_pile_of_manim_imports import *
 | 
						|
 | 
						|
class NumberLineScene(Scene):
 | 
						|
    def construct(self, **number_line_config):
 | 
						|
        self.number_line = NumberLine(**number_line_config)
 | 
						|
        self.displayed_numbers = self.number_line.default_numbers_to_display()
 | 
						|
        self.number_mobs = self.number_line.get_number_mobjects(*self.displayed_numbers)
 | 
						|
        self.add(self.number_line, *self.number_mobs)
 | 
						|
 | 
						|
    def zoom_in_on(self, number, zoom_factor, run_time = 2.0):
 | 
						|
        unit_length_to_spatial_width = self.number_line.unit_length_to_spatial_width*zoom_factor
 | 
						|
        radius = FRAME_X_RADIUS/unit_length_to_spatial_width
 | 
						|
        tick_frequency = 10**(np.floor(np.log10(radius)))
 | 
						|
        left_tick = tick_frequency*(np.ceil((number-radius)/tick_frequency))
 | 
						|
        new_number_line = NumberLine(
 | 
						|
            numerical_radius = radius,
 | 
						|
            unit_length_to_spatial_width = unit_length_to_spatial_width,
 | 
						|
            tick_frequency = tick_frequency,
 | 
						|
            leftmost_tick = left_tick,
 | 
						|
            number_at_center = number
 | 
						|
        )
 | 
						|
        new_displayed_numbers = new_number_line.default_numbers_to_display()
 | 
						|
        new_number_mobs = new_number_line.get_number_mobjects(*new_displayed_numbers)
 | 
						|
 | 
						|
        transforms = []
 | 
						|
        additional_mobjects = []
 | 
						|
        squished_new_line = new_number_line.copy()
 | 
						|
        squished_new_line.scale(1.0/zoom_factor)
 | 
						|
        squished_new_line.shift(self.number_line.number_to_point(number))
 | 
						|
        squished_new_line.points[:,1] = self.number_line.number_to_point(0)[1]
 | 
						|
        transforms.append(Transform(squished_new_line, new_number_line))
 | 
						|
        for mob, num in zip(new_number_mobs, new_displayed_numbers):
 | 
						|
            point = Point(self.number_line.number_to_point(num))
 | 
						|
            point.shift(new_number_line.get_vertical_number_offset())
 | 
						|
            transforms.append(Transform(point, mob))
 | 
						|
        for mob in self.mobjects:
 | 
						|
            if mob == self.number_line:
 | 
						|
                new_mob = mob.copy()
 | 
						|
                new_mob.shift(-self.number_line.number_to_point(number))
 | 
						|
                new_mob.stretch(zoom_factor, 0)
 | 
						|
                transforms.append(Transform(mob, new_mob))
 | 
						|
                continue
 | 
						|
            mob_center = mob.get_center()
 | 
						|
            number_under_center = self.number_line.point_to_number(mob_center)
 | 
						|
            new_point = new_number_line.number_to_point(number_under_center)
 | 
						|
            new_point += mob_center[1]*UP
 | 
						|
            if mob in self.number_mobs:
 | 
						|
                transforms.append(Transform(mob, Point(new_point)))
 | 
						|
            else:
 | 
						|
                transforms.append(ApplyMethod(mob.shift, new_point - mob_center))
 | 
						|
                additional_mobjects.append(mob)
 | 
						|
        line_to_hide_pixelation = Line(
 | 
						|
            self.number_line.get_left(),
 | 
						|
            self.number_line.get_right(),
 | 
						|
            color = self.number_line.get_color()
 | 
						|
        )
 | 
						|
        self.add(line_to_hide_pixelation)
 | 
						|
        self.play(*transforms, run_time = run_time)
 | 
						|
        self.clear()
 | 
						|
        self.number_line = new_number_line
 | 
						|
        self.displayed_numbers = new_displayed_numbers
 | 
						|
        self.number_mobs = new_number_mobs
 | 
						|
        self.add(self.number_line, *self.number_mobs)
 | 
						|
        self.add(*additional_mobjects)
 | 
						|
 | 
						|
    def show_multiplication(self, num, **kwargs):
 | 
						|
        if "path_func" not in kwargs:
 | 
						|
            if num > 0:
 | 
						|
                kwargs["path_func"] = straight_path
 | 
						|
            else:
 | 
						|
                kwargs["path_func"] = counterclockwise_path()
 | 
						|
        self.play(*[
 | 
						|
            ApplyMethod(self.number_line.stretch, num, 0, **kwargs)
 | 
						|
        ]+[
 | 
						|
            ApplyMethod(mob.shift, (num-1)*mob.get_center()[0]*RIGHT, **kwargs)
 | 
						|
            for mob in self.number_mobs
 | 
						|
        ])
 |