自定义transform的重塑

        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淘汰

Original: https://www.cnblogs.com/daxiangcai/p/16819118.html
Author: 大湘菜
Title: 自定义transform的重塑

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/715343/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 2022.16 数字水印2

    安全技术包含3类:信息隐藏、访问控制和密码学。 典型的安全应用示例: 信息隐藏主要可分为隐写术和水印技术等两大类。隐写术的保护对象是隐秘消息,水印技术的保护对象是载体本身。 数字水…

    技术杂谈 2023年5月30日
    083
  • Java复习,Java知识点以及Java面试题(六)

    File类 文件和目录(文件夹)路径名的抽象表示形式 构造方法 File(String pathname):根据一个路径得到File对象 File(String parent, S…

    技术杂谈 2023年6月21日
    095
  • 编写CentOS的System V init启动脚本

    所有System V init脚本都命名为/etc/rc.d/init.d/必须没有”.init”后缀。 示例脚本: 注意:重启和重载功能可以(通常)组合成…

    技术杂谈 2023年5月31日
    071
  • Docker-网络模式

    Docker-网络模式 1.Docker网络模式概述 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Doc…

    技术杂谈 2023年7月10日
    073
  • kettle插入更新

    kettle实现若主键存在则更新,若主键不存在则插入 Original: https://www.cnblogs.com/cheng9999/p/14085922.htmlAuth…

    技术杂谈 2023年7月24日
    072
  • 尝试理解Linux容器进程与宿主机共享内核的具体含义

    背景 近期接触容器技术时,经常看到各类比较容器与虚拟机区别的文章中会提到:容器是共享宿主机的内核,而虚拟机则是拥有自己独立的内核,所以不可能在Linux上用容器运行windows,…

    技术杂谈 2023年6月21日
    095
  • 抽象类和接口

    Loading Tips: 除非必须使用,否则不要用接口 和 抽象类(大多时候,常规类就可以解决问题) 在合理的范围内尽可能抽象,相比于抽象类,我们 更倾向于接口的使用 poste…

    技术杂谈 2023年7月25日
    073
  • TraceId 和 SpanId 生成规则

    TraceId 生成规则 SOFATracer 通过 TraceId 来将一个请求在各个服务器上的调用日志串联起来,TraceId 一般由接收请求经过的第一个服务器产生,产生规则是…

    技术杂谈 2023年5月31日
    087
  • Jenkins中插件 pipeline 中声明式流水线的语法

    声明性Pipeline 声明性Pipeline是Jenkins Pipeline 的一个相对较新的补充, 它在Pipeline子系统之上提出了一种更为简化和有意义的语法。 所有有效…

    技术杂谈 2023年5月31日
    064
  • WIN10平板 如何关闭自动更新

    找到Windows Update,设置启动类型为禁用即可 本文为博主原创文章,未经博主允许不得转载。 Original: https://www.cnblogs.com/aceta…

    技术杂谈 2023年5月31日
    0116
  • centos磁盘满

    1、使用命令:df -lk 找到已满磁盘 2、使用命令:du –max-depth=1 -h 查找大文件,删除 Original: https://www.cnblog…

    技术杂谈 2023年7月24日
    050
  • 彩食鲜架构团队风采

    2020-4-15 架构组支援福州做冷热数据拆分 4-24 听说最近测试环境不稳定,首席掏腰包请大家喝个茶吧~~ ps: 服务器资源不足,咋办? :) 4-25 诸事不顺,上天台聊…

    技术杂谈 2023年7月23日
    056
  • 监控浏览器tab切换或最小化事件

    背景:最近遇到1个项目,业务方调用了后端1个开销较大的接口,用于页面实时监控一些关键指标,页面是自动定时请求接口刷新数据,随着用户的增加,后端压力比较大,分析发现,很多用户日常使用…

    技术杂谈 2023年5月31日
    099
  • python 调用c语言函数

    虽然python是万能的,但是对于某些特殊功能,需要c语言才能完成。这样,就需要用python来调用c的代码了具体流程:c编写相关函数 ,编译成库然后在python中加载这些库,指…

    技术杂谈 2023年6月21日
    091
  • Android Jetpack Navigation基本使用

    Android Jetpack Navigation基本使用 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navig…

    技术杂谈 2023年7月10日
    089
  • 机器学习(6)K近邻算法

    k-近邻,通过离你最近的来判断你的类别 例子: 定义:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近的样本中大多数属于某一类别),则该样本属于这个类别 K近邻需要做标准化…

    技术杂谈 2023年7月23日
    057
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球