笑喷了,电视剧里的代码真能运行吗?
最近有一部关于程序员的电视剧,里边有一段关于期中考试要用程序画一个爱心的桥段。仔细看了一下,发现槽点还不少。
今天就给大家分析下剧中出现的“爱心”代码,并且来复刻一下最后男主完成的酷炫跳动爱心。
剧中代码赏析
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
合在一起,搞定!
总结一下,就是在原本的基础爱心曲线上加上一个正态分布的随机量、一个随时间变化的正弦函数和一个跟距离成反比的系数,外面再套一层更大的随机爱心,就得到类似剧中的跳动爱心效果。
但话说回来,真有人会在考场上这么干吗?
点击下方下卡片领取完整代码哦
除非真的是超级大学霸,不然就是食堂伙食太好,吃太饱撑的……
笑喷了,电视剧里的代码真能运行吗?相关推荐
- 电视剧里的代码真能运行吗?
大家好,欢迎来到 Crossin的编程教室 ! 前几天,后台老有小伙伴留言"爱心代码".这不是Crossin很早之前发过的内容嘛,怎么最近突然又被人翻出来了?后来才知道,原来是一部 ...
- 网吧里的计算机课,S8总决赛网吧在干什么?一个画面让人笑喷,在上电脑课把?...
原标题:S8总决赛网吧在干什么?一个画面让人笑喷,在上电脑课把? 英雄联盟S8总决赛一直都是最近的一个热门话题,关注比赛的小伙伴们应该都知道,今年的总决赛冠军是IG,IG在最后的比赛中以3比0的成绩战 ...
- 转载(爆笑)国产电视剧的电脑高手
转载(爆笑)国产电视剧的电脑高手 有一集那个白痴女主角叫刘滋来帮她打开她男友设计的游戏(因为据说游戏形象是以她为原形的),过程如下 : 1. 刘滋走到电脑前按了一下显示器开关(键盘鼠标都没碰)电脑传出 ...
- 《蜗居》里唯一的真男人只有宋思明
<蜗居>的书早就看完了,处于对结局的恐惧一直不敢看电视,这几天实在经不住诱惑,看了电视剧.一个想法在脑海里渐渐清晰,那就是--只有宋思明才是<蜗居>里唯一的真男人. 我是80后 ...
- 2010年11月编程语言排行榜:手机里的代码
[51CTO独家特稿]Tiobe今天发布了最新一期的编程语言排行榜.本期榜单的前五名与10月份没有明显变化,依然是Java.C.C++.PHP和Python:Objective-C的增长势头强劲.本期 ...
- shell替换程序里的代码
需求: 扩展名类型: .php .html .shtml .inc 将http://market.pk.com/files/union/ad_union_5.js替换为http://market.pk ...
- Eclipse里编辑代码,进度条出现“Remote System Explorer Operation”解决方法
Eclipse里编辑代码,进度条出现"Remote System Explorer Operation"解决方法 参考文章: (1)Eclipse里编辑代码,进度条出现" ...
- iphone6安装android,在iPhone里装了真 Android系统 这事情已经很神奇了
原标题:在iPhone里装了真 Android系统 这事情已经很神奇了 现在,在 Windows 系统中安装 macOS 已经不是什么稀奇的事情,在 Mac 中安装 Windows 虽然有点掉格,但也 ...
- 电视剧里最肉麻恶心的俗套对白
电视剧里最肉麻恶心的俗套对白 <还珠格格> 尔康的名言--感谢上苍-- "尔康,上海大金空调维修一个破碎的我怎么去拯救一个破碎的你"(恶心的经典之作) 尔康对紫薇说:你 ...
最新文章
- 【直播】黎佳佳:音频数据分析以及特征提取
- maven3常用命令、java项目搭建、web项目搭建
- 为什么要使用页面缓存技术
- 210221阶段三线程、信号量、互斥锁
- 如何在Ubuntu 18.04上创建多节点MySQL集群
- 大数据平台网站日志分析系统
- React中那些纠结你的地方(一)
- RedisTemplate 切换 Jedis 实现 以及 Jedis 常用 API
- 拼多多API接口调用方法(内附上多个可用API)
- OriginLab学生版激活码续期
- 计算机需要那些高中数学知识点,高中数学复习知识点有哪些
- 在MVC项目中设置启动页
- 苹果手机上的计算机恢复出厂设置在哪里,苹果手机怎么还原出厂设置【详解】...
- 2022CVPR云分享 | 清华大学刘烨斌老师实验室四位讲者带你走进计算机视觉领域顶会...
- 米的换算单位和公式_米的单位换算公式大全二年级(简便易记的单位米换算方法)...
- Mysql数据库的引擎介绍
- Python实现手机号码归属地查询功能
- 汇编语言--jmp指令
- 普通的朋友,淡淡的生活
- vue中获取获取当前城市地址_Vue中获取当前定位城市名
热门文章
- 《C++ Primer》第14章 14.3节习题答案
- 普通话测试app怎么样可以不交钱_如何说普通话才算标准?
- 题目内容: 你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。 如输入1234,则输出: yi er san si 注意,每个字的拼音之间有一
- UIView相对坐标转换
- (二)随处可见的LED广告屏是怎么工作的呢?代码实现
- 手机html5翻页效果代码,jquery html5手机端翻书效果_手指滑动书本翻页效果代码
- Vmware搭建软路由教程(Openwrt)
- 微信小程序 自动换行
- acwing 206 石头游戏 矩阵快速幂
- 图片转excel怎么弄?简单实用的方法