如何在manim中制作一个具有足够间距的虚线矩形?

时间:2019-05-23 17:57:22

标签: python algorithm-animation manim

如何在manim的两个边缘上创建一个等距分布的虚线矩形?我尝试从Rectangle继承并添加破折号,与对DashedLine实施的破折号相同,但是它在较长和较短的边缘上产生非常不同的密度。这是我的尝试(代码来自MIT许可的manim存储库):

%%manim HighLevelIntuition -l -q
from manimlib_imports import *

class DashedRectangle(Rectangle):
    CONFIG = {
        "dash_length": DEFAULT_DASH_LENGTH,
        "dash_spacing": None,
        "positive_space_ratio": 0.5,
    }

    def __init__(self, *args, **kwargs):
        Rectangle.__init__(self, *args, **kwargs)
        ps_ratio = self.positive_space_ratio
        num_dashes = self.calculate_num_dashes(ps_ratio)
        dashes = DashedVMobject(
            self,
            num_dashes=num_dashes,
            positive_space_ratio=ps_ratio
        )
        self.clear_points()
        self.add(*dashes)

    def calculate_num_dashes(self, positive_space_ratio):
        try:
            full_length = self.dash_length / positive_space_ratio
            return int(np.ceil(
                self.get_arc_length() / full_length
            ))
        except ZeroDivisionError:
            return 1

class HighLevelIntuition(Scene):

    def construct(self):
        self.play(ShowCreation(DashedRectangle(width=10, height=2)))

这就是当前的样子:

enter image description here

1 个答案:

答案 0 :(得分:1)

检查:

class DashedRectangle(VGroup):
    CONFIG={
        "num_dashes": 30,
        "positive_space_ratio": 0.5,
        "width":5,
        "height":4
    }
    def __init__(self, *args, **kwargs):
        VGroup.__init__(self, *args,**kwargs)
        h1=[ORIGIN,UP*self.height]
        w1=[UP*self.height,UP*self.height+RIGHT*self.width]
        h2=[UP*self.height+RIGHT*self.width,RIGHT*self.width]
        w2=[RIGHT*self.width,ORIGIN]
        alpha=self.width/self.height
        divs=self.num_dashes

        n_h=int(divs/(2*(alpha+1)))
        n_w=int(alpha*n_h)
        dashedrectangle=VGroup()
        for n,l in zip([n_w,n_h],[[w1,w2],[h1,h2]]):
            for side in l:
                line=VMobject()
                line.set_points_as_corners(side)
                dashedrectangle.add(DashedVMobject(line,num_dashes=n,positive_space_ratio=self.positive_space_ratio))
        self.add(dashedrectangle[0],dashedrectangle[3],dashedrectangle[1],dashedrectangle[2])



class DashedRectangleScene(Scene):
    def construct(self):
        rec=DashedRectangle()
        rec.move_to(ORIGIN)
        self.play(ShowCreation(rec))
        self.wait()

DashedSquare