首页 > 解决方案 > 多边形 set_width 和 set_height 不起作用

问题描述

场景中有右侧部分反比例函数(1/x),一开始我画了一个矩形(使用多边形),左下角是(0,0,0),右上角是函数x=3。

我重写了update_mobjects,并用函数上的某个点更新了矩形右上角的位置,但不起作用,宽度增加而不是减少,请帮助,谢谢!

我的代码如下:

class Chess(GraphScene):
    CONFIG = {
        "x_min": -5,
        "x_max": 5,
        "y_min": -5,
        "y_max": 6,
        "y_axis_height": 10,
        "graph_origin": ORIGIN,
        "x_labeled_nums": range(-5, 5, 1),
        "y_labeled_nums": range(-5, 6, 1)
    }

    def construct(self):
        self.setup_axes(animate=True)
        if1r = self.get_graph(lambda x: 1 / x, color=YELLOW_D, x_min=1 / self.y_max, x_max=self.x_max)
        self.play(FadeIn(if1r))
        spt1 = self.input_to_graph_point(3, if1r)
        sg = Polygon(np.array([0, 0, 0]), np.array([spt1[0], 0, 0]), spt1, np.array([0, spt1[1], 0]), fill_color=RED_D,
                     fill_opacity=1.0)
        self.add(sg)
        self.sg = sg
        self.sva1 = 3
        self.if1r = if1r
        self.moving3()

    def moving3(self):
        self.always_update_mobjects = True
        self.wait(10)

    def update_mobjects(self, dt):
        if (hasattr(self, "sva1") and self.sva1 > 1):
            self.sva1 = self.sva1 - 0.01
            spt2 = self.input_to_graph_point(self.sva1, self.if1r)
            self.sg.set
            self.sg.set_width(spt2[0], stretch=False, about_point=self.sg.get_corner(DOWN + LEFT))
            self.sg.set_height(spt2[1], stretch=False, about_point=self.sg.get_corner(DOWN+LEFT))

标签: manim

解决方案


是的,它有效,但是您忘记stretch=True在最后两行进行更改。

此外,self.sg.set还剩一行。

如果您允许我发表评论,我认为您可以通过这种方式更好地控制: 这里有更多示例

class NewChess(GraphScene):
    CONFIG = {
        "x_min": -5,
        "x_max": 5,
        "y_min": -5,
        "y_max": 6,
        "y_axis_height": 10,
        "graph_origin": ORIGIN,
        "x_labeled_nums": range(-5, 5, 1),
        "y_labeled_nums": range(-5, 6, 1),
        "x_start":3,
        "x_end":1
    }

    def get_rectangle_from_point(self,point):
        return Polygon(
            [0, 0, 0],          #(0,0)
            [point[0], 0, 0],   #(x,0)
            point,              #(x,y)
            [0, point[1], 0],   #(0,y)
            fill_color=RED_D,
            fill_opacity=1.0
        )

    def construct(self):
        self.setup_axes()
        x_coord_tracker=ValueTracker(self.x_start)
        if1r = self.get_graph(lambda x: 1 / x, color=YELLOW_D, x_min=1 / self.y_max, x_max=self.x_max)
        spt1 = self.input_to_graph_point(x_coord_tracker.get_value(), if1r)
        sg = self.get_rectangle_from_point(spt1)
        self.play(FadeIn(if1r))
        self.play(FadeIn(sg))

        def update_rectangle(rectangle):
            new_coord=self.input_to_graph_point(x_coord_tracker.get_value(), if1r)
            rectangle.become(self.get_rectangle_from_point(new_coord))
            return rectangle

        sg.add_updater(update_rectangle)
        self.add(sg) # Add object again

        self.play(
            x_coord_tracker.set_value,self.x_end,
            rate_func=linear,
            run_time=2
            )
        self.wait()

推荐阅读