예제 #1
0
    def __init__(self,
                 var,
                 label,
                 var_type=DecimalNumber,
                 num_decimal_places=2,
                 **kwargs):

        self.label = MathTex(label) if isinstance(label, str) else label
        equals = MathTex("=").next_to(self.label, RIGHT)
        self.label.add(equals)

        self.tracker = ValueTracker(var)

        if var_type == DecimalNumber:
            self.value = DecimalNumber(
                self.tracker.get_value(),
                num_decimal_places=num_decimal_places,
            )
        elif var_type == Integer:
            self.value = Integer(self.tracker.get_value())

        self.value.add_updater(
            lambda v: v.set_value(self.tracker.get_value())).next_to(
                self.label,
                RIGHT,
            )

        super().__init__(**kwargs)
        self.add(self.label, self.value)
예제 #2
0
    def __init__(
        self,
        focal_distance=20.0,
        shading_factor=0.2,
        default_distance=5.0,
        light_source_start_point=9 * DOWN + 7 * LEFT + 10 * OUT,
        should_apply_shading=True,
        exponential_projection=False,
        phi=0,
        theta=-90 * DEGREES,
        gamma=0,
        zoom=1,
        **kwargs,
    ):
        """Initializes the ThreeDCamera

        Parameters
        ----------
        *args
            Any argument of Camera
        *kwargs
            Any keyword argument of Camera.
        """
        self._frame_center = Point(kwargs.get("frame_center", ORIGIN),
                                   stroke_width=0)
        super().__init__(**kwargs)
        self.focal_distance = focal_distance
        self.phi = phi
        self.theta = theta
        self.gamma = gamma
        self.zoom = zoom
        self.shading_factor = shading_factor
        self.default_distance = default_distance
        self.light_source_start_point = light_source_start_point
        self.light_source = Point(self.light_source_start_point)
        self.should_apply_shading = should_apply_shading
        self.exponential_projection = exponential_projection
        self.max_allowable_norm = 3 * config["frame_width"]
        self.phi_tracker = ValueTracker(self.phi)
        self.theta_tracker = ValueTracker(self.theta)
        self.focal_distance_tracker = ValueTracker(self.focal_distance)
        self.gamma_tracker = ValueTracker(self.gamma)
        self.zoom_tracker = ValueTracker(self.zoom)
        self.fixed_orientation_mobjects = {}
        self.fixed_in_frame_mobjects = set()
        self.reset_rotation_matrix()
예제 #3
0
    def begin_3dillusion_camera_rotation(
        self,
        rate: float = 1,
        origin_phi: float | None = None,
        origin_theta: float | None = None,
    ):
        """
        This method creates a 3D camera rotation illusion around
        the current camera orientation.

        Parameters
        ----------
        rate
            The rate at which the camera rotation illusion should operate.
        origin_phi
            The polar angle the camera should move around. Defaults
            to the current phi angle.
        origin_theta
            The azimutal angle the camera should move around. Defaults
            to the current theta angle.
        """
        if origin_theta is None:
            origin_theta = self.renderer.camera.theta_tracker.get_value()
        if origin_phi is None:
            origin_phi = self.renderer.camera.phi_tracker.get_value()

        val_tracker_theta = ValueTracker(0)

        def update_theta(m, dt):
            val_tracker_theta.increment_value(dt * rate)
            val_for_left_right = 0.2 * np.sin(val_tracker_theta.get_value())
            return m.set_value(origin_theta + val_for_left_right)

        self.renderer.camera.theta_tracker.add_updater(update_theta)
        self.add(self.renderer.camera.theta_tracker)

        val_tracker_phi = ValueTracker(0)

        def update_phi(m, dt):
            val_tracker_phi.increment_value(dt * rate)
            val_for_up_down = 0.1 * np.cos(val_tracker_phi.get_value()) - 0.1
            return m.set_value(origin_phi + val_for_up_down)

        self.renderer.camera.phi_tracker.add_updater(update_phi)
        self.add(self.renderer.camera.phi_tracker)
예제 #4
0
def test_value_tracker_itruediv():
    """Test ValueTracker.__itruediv__()"""
    tracker = ValueTracker(5.0)
    tracker /= 2.0
    assert tracker.get_value() == 2.5
예제 #5
0
def test_value_tracker_ipow():
    """Test ValueTracker.__ipow__()"""
    tracker = ValueTracker(3.0)
    tracker **= 3.0
    assert tracker.get_value() == 27.0
예제 #6
0
def test_value_tracker_imul():
    """Test ValueTracker.__imul__()"""
    tracker = ValueTracker(3.0)
    tracker *= 4.0
    assert tracker.get_value() == 12.0
예제 #7
0
def test_value_tracker_imod():
    """Test ValueTracker.__imod__()"""
    tracker = ValueTracker(20.0)
    tracker %= 3.0
    assert tracker.get_value() == 2.0
예제 #8
0
def test_value_tracker_bool():
    """Test ValueTracker.__bool__()"""
    tracker = ValueTracker(0.0)
    assert not tracker
    tracker.increment_value(1.0)
    assert tracker
예제 #9
0
def test_value_tracker_interpolate():
    """Test ValueTracker.interpolate()"""
    tracker1 = ValueTracker(1.0)
    tracker2 = ValueTracker(2.5)
    tracker3 = ValueTracker().interpolate(tracker1, tracker2, 0.7)
    assert tracker3.get_value() == 2.05
def test_value_tracker_imod(using_opengl_renderer):
    """Test ValueTracker.__imod__()"""
    tracker = ValueTracker(20.0)
    tracker %= 3.0
    assert tracker.get_value() == 2.0
예제 #11
0
def test_value_tracker_set_value():
    """Test ValueTracker.set_value()"""
    tracker = ValueTracker()
    tracker.set_value(10.0)
    assert tracker.get_value() == 10.0
def test_value_tracker_itruediv(using_opengl_renderer):
    """Test ValueTracker.__itruediv__()"""
    tracker = ValueTracker(5.0)
    tracker /= 2.0
    assert tracker.get_value() == 2.5
def test_value_tracker_isub(using_opengl_renderer):
    """Test ValueTracker.__isub__()"""
    tracker = ValueTracker(20.0)
    tracker -= 10.0
    assert tracker.get_value() == 10.0
def test_value_tracker_ipow(using_opengl_renderer):
    """Test ValueTracker.__ipow__()"""
    tracker = ValueTracker(3.0)
    tracker **= 3.0
    assert tracker.get_value() == 27.0
def test_value_tracker_imul(using_opengl_renderer):
    """Test ValueTracker.__imul__()"""
    tracker = ValueTracker(3.0)
    tracker *= 4.0
    assert tracker.get_value() == 12.0
예제 #16
0
def test_value_tracker_increment_value():
    """Test ValueTracker.increment_value()"""
    tracker = ValueTracker(0.0)
    tracker.increment_value(10.0)
    assert tracker.get_value() == 10.0
def test_value_tracker_iadd(using_opengl_renderer):
    """Test ValueTracker.__iadd__()"""
    tracker = ValueTracker(0.0)
    tracker += 10.0
    assert tracker.get_value() == 10.0
예제 #18
0
def test_value_tracker_iadd():
    """Test ValueTracker.__iadd__()"""
    tracker = ValueTracker(0.0)
    tracker += 10.0
    assert tracker.get_value() == 10.0
def test_value_tracker_set_value(using_opengl_renderer):
    """Test ValueTracker.set_value()"""
    tracker = ValueTracker()
    tracker.set_value(10.0)
    assert tracker.get_value() == 10.0
예제 #20
0
def test_value_tracker_isub():
    """Test ValueTracker.__isub__()"""
    tracker = ValueTracker(20.0)
    tracker -= 10.0
    assert tracker.get_value() == 10.0
def test_value_tracker_bool(using_opengl_renderer):
    """Test ValueTracker.__bool__()"""
    tracker = ValueTracker(0.0)
    assert not tracker
    tracker.increment_value(1.0)
    assert tracker