首页 > 其他分享 >自定义transform的重塑

自定义transform的重塑

时间:2022-10-23 18:44:16浏览次数:46  
标签:name 自定义 back transform 重塑 str n1 n2 type

    #         cartoon transform
            def ct(names, *args):
                '''
                    names: a list of mobjects
                    args represent lists, such as [0,1,[0,0,1,1,2,2]], the 1st and 2nd numbers represent the index of mobject in the names list
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name + '[' + str(i) + ']'
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = i[0:m]
                        n2 = i[m+1:]
                        back = name + '[' + n1 + ':' + n2 + ']'
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name + '[' + str(i) + ']'
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = i[0:m]
                        n2 = i[m+1:]
                        back = name + '[' + n1 + ':' + n2 + ']'
                    elif type(i) == list:
                        back = 'VGroup('
                        for j in i:
                            item = pretrans0(name, j) + ','
                            back += item
                        back += ')'
                    return back

                ag = 'AnimationGroup('
            #           range(0, n-1)是错的
                itemli = []
                for l in names:
                    itemli.append(list(range(len(l))))
                def countli0(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                
                def countli(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                    elif type(i) == list:
                        for j in i:
                            item = countli0(name, j)
                            
                set1 = set()
                set2 = set()
                '''
                    represent two groups of transforming
                '''
                for m in range(len(args)):
                    n = 0
                    for i in args[m][2]:
                        n += 1
                        if n % 2 != 0:
                            u = pretrans(f'names[args[{str(m)}][0]]', i)
                            countli(itemli[args[m][0]], i)
                            set1.add(args[m][0])
                        else:
                            v = pretrans(f'names[args[{str(m)}][1]]', i)
                            item = f'ReplacementTransform({u}, {v}),'
                            '''
                                bug here: can't use self-defined functions, eval() will throw an exception: NameError: xxx is not defined
                            '''
                            ag += item
                            countli(itemli[args[m][1]], i)
                            set2.add(args[m][1])
                
                for i in set1:
                    for ii in itemli[i]:
#                         reverse GrowFromCenter不可用
                        ag += f'ShrinkToCenter(names[{str(i)}][{str(ii)}]), '
                for j in set2:
                    for jj in itemli[j]:
                        ag += f'GrowFromCenter(names[{str(j)}][{str(jj)}]), '

                ag += ')'
                agg = eval(ag)
                return agg
    #         cartoon transform 2
            def ct2(a, b, c):
                '''
                    a and b represent mobjects
                    c represents the corresponding transform parts
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name + '[' + str(i) + ']'
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = i[0:m]
                        n2 = i[m+1:]
                        back = name + '[' + n1 + ':' + n2 + ']'
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name + '[' + str(i) + ']'
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = i[0:m]
                        n2 = i[m+1:]
                        back = name + '[' + n1 + ':' + n2 + ']'
                    elif type(i) == list:
                        back = 'VGroup('
                        for j in i:
                            item = pretrans0(name, j) + ','
                            back += item
                        back += ')'
                    return back

                n = 0
                ag = 'AnimationGroup('
            #           range(0, n-1)是错的
                for i in c:
                    n += 1
                    if n % 2 != 0:
                        u = pretrans('a', i)
                    else:
                        v = pretrans('b', i)
                        item = f'ReplacementTransform({u}, {v}),'
                        ag += item
                ag += ')'
                agg = eval(ag)
                return agg

 

由于这两个函数很不规范,使用eval()实现,这导致后期的优化很困难,做如下更改:

    #         cartoon transform
            def ct(names, *args):
                '''
                    names: a list of mobjects
                    args represent lists, such as [0,1,[0,0,1,1,2,2]], the 1st and 2nd numbers represent the index of mobject in the names list
                '''
                
                '''
                    get the transforming part
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = num(i[0:m])
                        n2 = num(i[m+1:])
                        back = name[n1:n2]
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = num(i[0:m])
                        n2 = num(i[m+1:])
                        back = name[n1:n2]
                    elif type(i) == list:
                        back = VGroup()
                        for j in i:
                            item = pretrans0(name, j)
                            back.add(item)
                    return back

                ag = []
            #           range(0, n-1)是错的
                itemli = []
                for l in names:
                    itemli.append(list(range(len(l))))
                '''
                    delete the tranformed part
                '''
                def countli0(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                
                def countli(name, i):
                    if type(i) == int:
                        name.remove(i)
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = int(i[0:m])
                        n2 = int(i[m+1:])-1
                        p1 = name.index(n1)
                        p2 = name.index(n2)
                        del name[p1:p2+1]
                    elif type(i) == list:
                        for j in i:
                            item = countli0(name, j)
                            
                set1 = set()
                set2 = set()
                '''
                    two groups of transforming
                '''
                for m in range(len(args)):
                    n = 0
                    for i in args[m][2]:
                        n += 1
                        if n % 2 != 0:
                            u = pretrans(names[args[m][0]], i)
                            countli(itemli[args[m][0]], i)
                            set1.add(args[m][0])
                        else:
                            v = pretrans(names[args[m][1]], i)
                            item = at(u,v)
                            ag.append(item)
                            countli(itemli[args[m][1]], i)
                            set2.add(args[m][1])
                
                for i in set1:
                    for ii in itemli[i]:
#                         reverse GrowFromCenter不可用
                        ag.append(ast(names[i][ii]))
                for j in set2:
                    for jj in itemli[j]:
                        ag.append(agf(names[j][jj]))

                return AnimationGroup(*ag)
    #         cartoon transform 2
            def ct2(a, b, c):
                '''
                    a and b represent mobjects
                    c represents the corresponding transform parts
                '''
                def pretrans0(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = num(i[0:m])
                        n2 = num(i[m+1:])
                        back = name[n1:n2]
                    return back

                def pretrans(name, i):
                    if type(i) == int:
                        back = name[i]
                    elif type(i) == str:
                        m = i.find('.')
                        n1 = num(i[0:m])
                        n2 = num(i[m+1:])
                        back = name[n1:n2]
                    elif type(i) == list:
                        back = VGroup()
                        for j in i:
                            item = pretrans0(name, j)
                            back.add(item)
                    return back

                n = 0
                ag = []
            #           range(0, n-1)是错的
                for i in c:
                    n += 1
                    if n % 2 != 0:
                        u = pretrans(a, i)
                    else:
                        v = pretrans(b, i)
                        item = at(u,v)
                        ag.append(item)
                return AnimationGroup(ag)

并将ct2淘汰

标签:name,自定义,back,transform,重塑,str,n1,n2,type
From: https://www.cnblogs.com/daxiangcai/p/16819118.html

相关文章

  • 7.Python自定义排序详解
    如果以创建的对象作为列表中的元素,那么对列表进行排序时可使用sort()函数或sorted()函数,但要注意的是:①当排序对象为列表的时候两者适合的场景不同②sorted()函数会返......
  • 配置docker 容器自定义ip 网段
    1.打开cat/etc/docker/daemon.json添加 "bip":"192.168.0.1/16",配置如下{"bip":"192.168.0.1/16","data-root":"/data/bkce/public/paas_agent/docker",......
  • 基于vite3+tauri模拟QQ登录切换窗体|Tauri自定义拖拽|最小/大/关闭
    前两天有给大家分享tauri+vue3快速搭建项目、封装桌面端多开窗口。今天继续来分享tauri创建启动窗口、登录窗口切换到主窗口及自定义拖拽区域的一些知识。希望对想要学习或......
  • 【C语言】自定义函数
    ......
  • 【C语言】自定义函数
    ......
  • React基础篇——十、自定义DOM属性
    十、自定义DOM属性React16之前会忽略不是把的HTML和SVG属性,现在React会把不识别的属性传递给DOM。React16之前:<divcust-attr="someting"></div>会被渲染成:......
  • 自定义校验
    1)编写一个指定要的校验注解@Documented@Constraint(validatedBy={ListValueConstraintValidator.class})@Target({METHOD,FIELD,ANNOTATION_TYPE,CONSTRUCTOR,PAR......
  • Python Flet 打包后窗口及任务栏图标自定义方法
    最近用Flet写一个应用,写好窗口图标及任务栏中图标默认如下:现在需要将这两个图标改成自定义图标,如下面这样: 经过摸索,方法如下:1、先将应用打包(pyinstaller)2、在打包......
  • 自定义网络
    查看所有的docker网络网络模式网络模式bridge:桥接docker(默认,自己创建也使用bridge模式)none:不配置网络host:和宿主机共享网络container:容器网络连通!(用的少!局限很......
  • Angular2 通过自定义指令限制输入框输入类型
    **温馨提示:如需转载本文,请注明内容出处。**本文链接:https://www.cnblogs.com/grom/p/16814577.html在input控件中,使用type="number"是无法控制科学计数"e"的输入的,并且......