旋转形状时,顶点略微偏离

When rotating shapes, vertices are just slightly off

我正在处理来自此视频的 manim 挑战:https://youtu.be/HKPm8FZYaqI?t=700。挑战在于编写从 11:40 开始并在 11:49 结束的动画。

我开始旋转三角形并将其复制到第二个正方形,但出于某种原因,它们只是我必须旋转的那些稍微偏离一点,而我没有旋转的那些不得不旋转似乎是完美的。

看这张图:

三角形完全适合右边的正方形。但是在右边的正方形中,旋转的那些(1 和 4)没有。下面是三角形数字 1 的特写:

当然,这就是我想要的样子: 形状的尺寸和颜色可能有点不同,但那是因为这是视频作者的解决方案,而之前的是我的尝试。我不关心那个,我只关心为什么三角形不适合我的尝试,就像他们在这里所做的那样。 放大这张图片,我们看到三角形确实完美契合:

如果能深入了解发生这种情况的原因,我们将不胜感激!

我的动画源代码是这样的:

class Pythagoras(Scene):
    def construct(self):
        title = TextMobject("Pythagorean Theorem")
        title.to_edge(UL)

        pre_square = Polygon(
            [-2, 2, 0],
            [2, 2, 0],
            [2, -2, 0],
            [-2, -2, 0],
            color=WHITE
        )

        self.wait()


        square2 = Polygon(
            [-1.41, 1.41, 0],
            [1.41, 1.41, 0],
            [1.41, -1.41, 0],
            [-1.41, -1.41, 0]

        )
        square2.rotate(PI/6)

        triangle1 = Polygon(
            [-2, 2, 0],
            [-2 + math.sqrt(6), 2, 0],
            [-2, 2 - math.sqrt(2), 0],
            color=YELLOW
        )

        triangle2 = Polygon(
            [2, 2, 0],
            [-2 + math.sqrt(6), 2, 0],
            [2, 2 - math.sqrt(6), 0],
            color=YELLOW
        )

        triangle3 = Polygon(
            [2, 2 - math.sqrt(6), 0],
            [2, -2, 0],
            [2 - math.sqrt(6), -2, 0],
            color=YELLOW
        )

        triangle4 = Polygon(
            [-2, 2 - math.sqrt(2), 0],
            [-2, -2, 0],
            [2 - math.sqrt(6), -2, 0],
            color=YELLOW
        )

        triangles = [triangle1, triangle2, triangle3, triangle4]
        for triangle in triangles:
            triangle.set_fill(YELLOW, 0.6)

        self.play(Write(title), ShowCreation(pre_square), ShowCreation(triangle1), ShowCreation(triangle2), ShowCreation(triangle3), ShowCreation(triangle4))

        self.wait()

        group = VGroup(pre_square, triangle1, triangle2, triangle3, triangle4)

        self.play(ApplyMethod(group.to_edge, LEFT, {"buff": 1.6}))
        self.wait()

        square3 = pre_square.copy()

        self.play(ApplyMethod(square3.shift, RIGHT * 7))

        triangle2.generate_target()
        triangle2.target.shift(RIGHT * (7- math.sqrt(6)))

        triangle1.generate_target()
        triangle1.target = triangle2.target.copy().rotate(PI) 

        triangle3.generate_target()
        triangle3.target.shift(RIGHT * 7)

        triangle4.generate_target()
        triangle4.target = triangle3.target.copy().rotate(PI)


        self.play(MoveToTarget(triangle1.copy()), MoveToTarget(triangle2.copy()), MoveToTarget(triangle3.copy()), MoveToTarget(triangle4.copy()))

        self.wait()

代码实际上并没有错,只是这些三角形的绘制方式。三角形周围的边框具有导致伪影的宽度。如果您删除边框或将边框视为三角形的范围,问题就会消失。

问题是VMobjects的粗细,默认是4,如果你把它改成2或者1(我给出的解是1)那些角就被去掉了。将此添加到您的 for:

        for triangle in triangles:
            triangle.set_fill(YELLOW, 0.6)
            triangle.set_stroke(None,1.5)
            #or
            #triangle.set_stroke(width=1.5)
            #it is the same