最近有一部关于程序员的电视剧,里边有一段关于期中考试要用程序画一个爱心的桥段。仔细看了一下,发现槽点还不少。

今天就给大家分析下剧中出现的“爱心”代码,并且来复刻一下最后男主完成的酷炫跳动爱心。

剧中代码赏析

1. 首先是路人同学的代码:

虽然剧中说是“C 语言期中考试”,但这位同学的代码名叫 draw2.py,一个典型的 Python 文件,再结合截图中的 pen.forward、pen.setpos 等方法来看,应该是用 turtle 海龟作图库来画爱心。那效果通常是这样的:


import turtle as t
t.color('red')
t.setheading(50)
t.begin_fill()
t.circle(-100, 170)
t.circle(-300, 40)
t.right(38)
t.circle(-300, 40)
t.circle(-100, 170)
t.end_fill()
t.done()

而不是剧中那个命令行下用 1 组成的不规则的图形。

2. 然后是课代表向路人同学展示的优秀代码:

及所谓的效果:

这确实是C语言代码了,但文件依然是以 .py 为后缀,并且 include 前面没有加上 #,这显然是没法运行的。

里面的内容是可以画出爱心的,用的是这个爱心曲线公式:

然后遍历一个 15*17 的方阵,计算每个坐标是在曲线内还是曲线外,在内部就输出 # 或 *,外部就是 -。用 python 改写一下是这样的:


for y in range(9, -6, -1):for x in range(-8, 9):print('*##*'[(x+10)%4] if (x*x+y*y-25)**3 < 25*x*x*y*y*y else '-', end=' ')print()

效果:

稍微改一下输出,还能做出前面那个全是 1 的效果:

for y in range(9, -6, -1):for x in range(-8, 9):print('1' if (x*x+y*y-25)**3 < 25*x*x*y*y*y else ' ', end=' ')print()

但跟剧中所谓的效果相去甚远。

3. 最后是主角狂拽酷炫 D 炸天的跳动爱心:

代码有两个片段:

但这两个片段也不 C 语言,而是 C++,且两段并不是同一个程序,用的方法也完全不一样。

第一段代码跟前面一种思路差不多,只不过没有直接用一条曲线,而是上半部用两个圆形,下半部用两条直线,围出一个爱心。

改写成 Python 代码:


size = 10
for x in range(size):for y in range(4*size+1):dist1 = ((x-size)**2 + (y-size)**2) ** 0.5dist2 = ((x-size)**2 + (y-3*size)**2) ** 0.5if dist1 < size + 0.5 or dist2 < size + 0.5:print('V', end=' ')else:print(' ', end=' ')print()for x in range(1, 2*size):for y in range(x):print(' ', end=' ')for y in range(4*size+1-2*x):print('V', end=' ')print()

运行效果:

第二段代码用的是基于极坐标的爱心曲线,是遍历角度来计算点的位置。公式是:

计算出不同角度对应的点坐标,然后把它们连起来,就是一个爱心。


from math import pi, sin, cos
import matplotlib.pyplot as plt
no_pieces = 100
dt = 2*pi/no_pieces
t = 0
vx = []
vy = []
while t <= 2*pi:vx.append(16*sin(t)**3)vy.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))t += dt
plt.plot(vx, vy)
plt.show()

效果:

代码中循环时用到的 2π 是为了保证曲线长度足够绕一个圈,但其实长一点也无所谓,即使 π=100 也不影响显示效果,只是相当于同一条曲线画了很多遍。所以剧中代码里写下 35 位小数的 π,还被女主用纸笔一字不落地抄写下来,实在是让程序员无法理解的迷惑行为。

但不管写再多位的 π,上述两段代码都和最终那个跳动的效果差了五百只羊了个羊。

跳动爱心实现

下面就来挑战一下用 Python 实现最终的那个跳动爱心的效果。

1. 想要绘制动态的效果,必定要借助一些库的帮助,不然代码量肯定会让你感动得想哭。这里我们将使用 pgzero 库。然后结合最后那个极坐标爱心曲线代码,先绘制出曲线上离散的点。


import pgzrun
from math import pi, sin, cosno_p = 100
dt = 2*3/no_p
t = 0
x = []
y = []
while t <= 2*3:x.append(16*sin(t)**3)y.append(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t))t += dtdef draw():screen.clear()for i in range(len(x)):screen.draw.filled_rect(Rect((x[i]*10+400, -y[i]*10+300), (4, 4)), 'pink')pgzrun.go()

2. 把点的数量增加,同时沿着原点到每个点的径向加一个随机数,并且这个随机数是按照正态分布来的(半个正态分布),大概率分布在曲线上,向曲线内部递减。这样,就得到这样一个随机分布的爱心效果。


...
no_p = 20000
...
while t <= 2*pi:l = 10 - abs(random.gauss(10, 2) - 10)x.append(l*16*sin(t)**3)y.append(l*(13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)))t += dt
...

3. 下面就是让点动起来,这步是关键,也有一点点复杂。为了方便对于每个点进行控制,这里将每个点自定义成了一个 Particle 类的实例。从原理上来说,就是给每个点加一个缩放系数,这个系数是根据时间变化的正弦函数,看起来就会像呼吸的节律一样。


class Particle():def __init__(self, pos, size, f):self.pos = posself.pos0 = posself.size = sizeself.f = fdef draw(self):screen.draw.filled_rect(Rect((10*self.f*self.pos[0] + 400, -10*self.f*self.pos[1] + 300), self.size), 'hot pink')def update(self, t):df = 1 + (2 - 1.5) * sin(t * 3) / 8self.pos = self.pos0[0] * df, self.pos0[1] * df...t = 0
def draw():screen.clear()for p in particles:p.draw()def update(dt):global tt += dtfor p in particles:p.update(t)

4. 剧中爱心跳动时,靠中间的点波动的幅度更大,有一种扩张的效果。所以再根据每个点距离原点的远近,再加上一个系数,离得越近,系数越大。


class Particle():...def update(self, t):df = 1 + (2 - 1.5 * self.f) * sin(t * 3) / 8self.pos = self.pos0[0] * df, self.pos0[1] * df

5. 最后再用同样的方法画一个更大一点的爱心,这个爱心不需要跳动,只要每一帧随机绘制就可以了。


def draw():...t = 0while t < 2*pi:f = random.gauss(1.1, 0.1)x = 16*sin(t)**3y = 13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t)size = (random.uniform(0.5,2.5), random.uniform(0.5,2.5))screen.draw.filled_rect(Rect((10*f*x + 400, -10*f*y + 300), size), 'hot pink')t += dt * 3

合在一起,搞定!

总结一下,就是在原本的基础爱心曲线上加上一个正态分布的随机量、一个随时间变化的正弦函数和一个跟距离成反比的系数,外面再套一层更大的随机爱心,就得到类似剧中的跳动爱心效果。

但话说回来,真有人会在考场上这么干吗?

点击下方下卡片领取完整代码哦

除非真的是超级大学霸,不然就是食堂伙食太好,吃太饱撑的……

笑喷了,电视剧里的代码真能运行吗?相关推荐

  1. 电视剧里的代码真能运行吗?

    大家好,欢迎来到 Crossin的编程教室 ! 前几天,后台老有小伙伴留言"爱心代码".这不是Crossin很早之前发过的内容嘛,怎么最近突然又被人翻出来了?后来才知道,原来是一部 ...

  2. 网吧里的计算机课,S8总决赛网吧在干什么?一个画面让人笑喷,在上电脑课把?...

    原标题:S8总决赛网吧在干什么?一个画面让人笑喷,在上电脑课把? 英雄联盟S8总决赛一直都是最近的一个热门话题,关注比赛的小伙伴们应该都知道,今年的总决赛冠军是IG,IG在最后的比赛中以3比0的成绩战 ...

  3. 转载(爆笑)国产电视剧的电脑高手

    转载(爆笑)国产电视剧的电脑高手 有一集那个白痴女主角叫刘滋来帮她打开她男友设计的游戏(因为据说游戏形象是以她为原形的),过程如下 : 1. 刘滋走到电脑前按了一下显示器开关(键盘鼠标都没碰)电脑传出 ...

  4. 《蜗居》里唯一的真男人只有宋思明

    <蜗居>的书早就看完了,处于对结局的恐惧一直不敢看电视,这几天实在经不住诱惑,看了电视剧.一个想法在脑海里渐渐清晰,那就是--只有宋思明才是<蜗居>里唯一的真男人. 我是80后 ...

  5. 2010年11月编程语言排行榜:手机里的代码

    [51CTO独家特稿]Tiobe今天发布了最新一期的编程语言排行榜.本期榜单的前五名与10月份没有明显变化,依然是Java.C.C++.PHP和Python:Objective-C的增长势头强劲.本期 ...

  6. shell替换程序里的代码

    需求: 扩展名类型: .php .html .shtml .inc 将http://market.pk.com/files/union/ad_union_5.js替换为http://market.pk ...

  7. Eclipse里编辑代码,进度条出现“Remote System Explorer Operation”解决方法

    Eclipse里编辑代码,进度条出现"Remote System Explorer Operation"解决方法 参考文章: (1)Eclipse里编辑代码,进度条出现" ...

  8. iphone6安装android,在iPhone里装了真 Android系统 这事情已经很神奇了

    原标题:在iPhone里装了真 Android系统 这事情已经很神奇了 现在,在 Windows 系统中安装 macOS 已经不是什么稀奇的事情,在 Mac 中安装 Windows 虽然有点掉格,但也 ...

  9. 电视剧里最肉麻恶心的俗套对白

    电视剧里最肉麻恶心的俗套对白 <还珠格格> 尔康的名言--感谢上苍-- "尔康,上海大金空调维修一个破碎的我怎么去拯救一个破碎的你"(恶心的经典之作) 尔康对紫薇说:你 ...

最新文章

  1. 【直播】黎佳佳:音频数据分析以及特征提取
  2. maven3常用命令、java项目搭建、web项目搭建
  3. 为什么要使用页面缓存技术
  4. 210221阶段三线程、信号量、互斥锁
  5. 如何在Ubuntu 18.04上创建多节点MySQL集群
  6. 大数据平台网站日志分析系统
  7. React中那些纠结你的地方(一)
  8. RedisTemplate 切换 Jedis 实现 以及 Jedis 常用 API
  9. 拼多多API接口调用方法(内附上多个可用API)
  10. OriginLab学生版激活码续期
  11. 计算机需要那些高中数学知识点,高中数学复习知识点有哪些
  12. 在MVC项目中设置启动页
  13. 苹果手机上的计算机恢复出厂设置在哪里,苹果手机怎么还原出厂设置【详解】...
  14. 2022CVPR云分享 | 清华大学刘烨斌老师实验室四位讲者带你走进计算机视觉领域顶会...
  15. 米的换算单位和公式_米的单位换算公式大全二年级(简便易记的单位米换算方法)...
  16. Mysql数据库的引擎介绍
  17. Python实现手机号码归属地查询功能
  18. 汇编语言--jmp指令
  19. 普通的朋友,淡淡的生活
  20. vue中获取获取当前城市地址_Vue中获取当前定位城市名

热门文章

  1. 《C++ Primer》第14章 14.3节习题答案
  2. 普通话测试app怎么样可以不交钱_如何说普通话才算标准?
  3. 题目内容: 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si 注意,每个字的拼音之间有一
  4. UIView相对坐标转换
  5. (二)随处可见的LED广告屏是怎么工作的呢?代码实现
  6. 手机html5翻页效果代码,jquery html5手机端翻书效果_手指滑动书本翻页效果代码
  7. Vmware搭建软路由教程(Openwrt)
  8. 微信小程序 自动换行
  9. acwing 206 石头游戏 矩阵快速幂
  10. 图片转excel怎么弄?简单实用的方法