自定义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)

大家都在看

  • python练习题:接收一个或多个数并计算乘积

    以下函数允许计算两个数的乘积,请稍加改造,变成可接收一个或多个数并计算乘积 def product(x, y): return x * y python;gutter:true; …

    技术杂谈 2023年7月24日
    076
  • 博主-橄榄山软件创始人-其人其事

    在Autodesk工作了7年4个月,那是一段激情。开心的工作经历。14年前当我还是在读研时。从事AutoCAD上的二次开发(硕士课题是搭建一个有限元程序的前处理建模软件), 增加A…

    技术杂谈 2023年5月31日
    087
  • 从“蚁族”现象看高等教育公平

    一、蚁族的出现背景 2003年初,首批扩招大学生进入社会,与下岗再就业职工和民工潮汇聚成为就业洪峰,就业压力空前增大。 2014年,教育部公告显示,全国普通高校毕业生规模达到727…

    技术杂谈 2023年5月31日
    0102
  • maven项目集成findbugs详解

    文章目录0、概述一、接入方式二、如何使用方式一、在控制台中执行打包命令方式二、使用IntelliJ IDEA的maven工具(其他IDE用户忽略)三、bug详情查看四、忽略指定的包…

    技术杂谈 2023年5月30日
    074
  • CentOS7 安装高版本gcc, g++, gfortran等工具

    SCL(Software Collections)是一个CentOS/RHEL Linux平台的软件多版本共存解决方案,为用户提供一种方便、安全地安装和使用应用程序和运行时环境的多…

    技术杂谈 2023年7月10日
    082
  • 高性能RPC框架gRPC竟恐怖如斯~

    大家好,我是不才陈某~ RPC、gRPC、Thrift、HTTP,大家知道它们之间的联系和区别么?这些都是面试常考的问题,今天带大家先搞懂 RPC 和 gRPC。 在讲述 gRPC…

    技术杂谈 2023年7月23日
    079
  • SOLR查询匹配关键词的方式

    如果在字段后直接写关键词,solr对条件关键词分词后,各分词之间按照OR的关系进行匹配 如果查询条件关键词用半角双引号括叫起来,则分词间用AND关系进行匹配 尽管使用双引号括起来,…

    技术杂谈 2023年5月31日
    0104
  • q命令-用SQL分析文本文件

    原创:打码日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处。 在Linux上分析文本文件时,一般会使用到grep、sed、awk、sort、uniq等命令,但这些…

    技术杂谈 2023年7月25日
    074
  • 神经网络那些事儿(二)

    在上一篇中,我们看到了神经网络是怎样使用梯度下降算法来学习它们的权值和偏置。然而,我们还有一些没有解释:我们没有讨论怎样计算损失函数的梯度。本篇中将解释著名的BP算法,它是一个快速…

    技术杂谈 2023年5月31日
    0111
  • [学习笔记]Java继承

    继承是面向对象编程的基石,它允许创建不同等级层次的类; 继承使得子类拥有父类的特征和行为,但是子类又可以拥有自身的特性; 通过使用继承也可以提高代码的复用性从而不用多次编写同样的代…

    技术杂谈 2023年7月24日
    062
  • Xperf Analysis Basics(转)

    FQ不易,转载 I started writing a description of how to examine CPU Sampling data in xperf and r…

    技术杂谈 2023年5月31日
    083
  • quartz框架(三)-调度器创建之实例化

    调度器创建之实例化 博主的前一篇博文主要介绍了schedule创建时的配置文件加载,下面博主将介绍一下scheduler的instantiate方法。 代码回顾 public Sc…

    技术杂谈 2023年7月24日
    084
  • java IO流、集合类部分小知识点总结

    在Java中,以下三个类经常用于处理数据流,下面介绍一下三个类的不同之处以及各自的用法。 InputStream : 是所有字节输入流的超类,一般使用它的子类:FileInputS…

    技术杂谈 2023年7月24日
    065
  • 千古前端图文教程-HTML009- HTML5详解2

    HTML5详解2 HTML5详解2 本文主要内容 #拖拽 #1、拖拽元素 2、目标元素 历史 #地理定位 #获取地理信息的方式 #1、IP地址 #2、三维坐标: #3、用户自定义数…

    技术杂谈 2023年7月11日
    093
  • Makfile总结

    Makefile基础以及小技巧 当我们在命令行当中输入 make的时候他的执行流程如下: make命令首先会在当前目录下面寻找makefile或者Makefile文件。 寻找到ma…

    技术杂谈 2023年7月24日
    087
  • 技术管理进阶——你遇到过耍小聪明的同学吗?

    原创不易,求分享、求一键三连 我们常常说贪小便宜吃大亏,这种案例容易伴随一个名词: 小聪明,那么到底什么是小聪明呢,先看一个案例: 在B站时期,有个比较机灵的学弟问我有没有工作推荐…

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