带内弧的颜色 MObject

Color MObject with inner arc

我正在使用 manim 社区,我在其中使用 Line 和 ArcBetweenPoints 创建了一个 MObject。 当我尝试填充 MObject 时,对象在较大圆弧的起点和终点之间着色。有没有办法正确地给这个 MObject 上色?

请查看下面的代码以直观地了解问题。通过取消注释带有 'set_fill' 的行,您会看到对象是如何被错误填充的。

%%manim -qm -v WARNING MobjectExample
    g1 = [-1.5, 0, 0]
    g2 = [0, -1.5, 0]
    g3 = [1.5, 0, 0]
    g7 = [0.5, 0, 0]
    g8 = [0, -0.5, 0]
    g9 = [-0.5, 0, 0]
    
    class MobjectExample(Scene):
        def construct(self):
            g = ArcBetweenPoints(start=g1, end=g2, stroke_color=BLUE) \
                .append_points(ArcBetweenPoints(start=g2, end=g3).points) \
                .append_points(ArcBetweenPoints(start=g8, end=g7).points) \
                .append_points(ArcBetweenPoints(start=g9, end=g8).points)\
                .append_points(Line(g1, g9).points)\
                .append_points(Line(g3, g7).points)
            # Please uncomment the next line to color the object
            # g.set_fill(BLUE, opacity=1)
            self.play(Create(g))
            self.wait(2)
     

您使用 append_points 的方式对 mobject 有一种奇怪的影响,因为不是绘制了一条连续的路径,而是绘制了多条形成某种组的路径。您可以改用 append_vectorized_mobject 来解决此问题,它负责将不同的路径正确合并在一起。并且:当你像这样连接mobject点时,你必须确保这些点实际上描述了一条连续的路径; n-th 子路径的终点必须是第 (n+1) 个子路径的起点。

试试这个:

class MobjectExample(Scene):
    def construct(self):
        g = ArcBetweenPoints(start=g1, end=g2, stroke_color=BLUE)
        g.append_vectorized_mobject(ArcBetweenPoints(start=g2, end=g3))
        g.append_vectorized_mobject(Line(g3, g7))
        g.append_vectorized_mobject(ArcBetweenPoints(start=g7, end=g8, angle=-TAU/4))
        g.append_vectorized_mobject(ArcBetweenPoints(start=g8, end=g9, angle=-TAU/4))
        g.append_vectorized_mobject(Line(g9, g1))
        g.set_fill(BLUE, opacity=1)
        self.play(Create(g))
        self.wait(2)