1

如何创建一个虚线矩形,在 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)))

这就是它目前的样子:

在此处输入图像描述

4

1 回答 1

2

检查这个:

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()

虚线广场

于 2019-05-24T01:26:27.987 回答