学计算机的男生发这个给我看是什么意思?www.zhihu.com
原理其实挺简单的. 代码网上也有. 最难的部分前人都告诉我们了, 心形可画. 要自己推导通过泰勒各种扭也可以. 通过肉眼扭我感觉也不是不可..
我们理一下思路.怎么画心形曲线
怎么填满心形曲线
怎么用 python 画
怎么画心形曲线
这个 google 一下就行了. heart curve equation
我们选用中上那个.
怎么填满心形曲线
naive 的想法, 函数=0 是一根线, 那线的两侧就是大于 0 跟小于 0.
取x, y = 0 , 发现 函数 <=0 是成立的. 先试试
怎么用 python 画
我们先测试一下公式, 把公式放到 python 里去. 借助 sympy 这个库,确认这个公式长的可靠.
from sympy import var, plot_implicit
var('x y ')
plot_implicit((x**2+(-y)**2-1)**3+x**2*(-y)**3)
我们把一行画心的代码解析一下长这样
l2=[]
# 将纵向每个字符当作 y 坐标的刻度
for y in range(15,-15,-1):
l3 = []
# 将横向每个字符当作 x 坐标的刻度
for x in range(-30,30):
# 如果 x,y 点在心形内,则将一个字符加入到行,否则加入空字符
l3.append((' I love U'[(x-y)%9]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' '))
l2.append(''.join(l3))
l1 ='\n'.join(l2)
for i in l1:
print("\033[91m"+i,end="",flush=True)
下面这段代码是不是跟我们找的公式很像, 只不过做了 x y 轴的缩放,
((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0
下面这段的意思是, 从 ' I love U' 里挑字符出来拼行. 为毛 x-y ? 只为了斜一点, 但要求是保证它的增速为 1 . 你用 x 也行 但画出来就是耿直的 I love U了.
' I love U'[(x-y)%9]
我们只需要将字符当作坐标刻度.去填满
就行.
最后就是 print 控制颜色
\033[91m
基本就这样. 有兴趣的同学可以将画心的函数都试一下.理论上都可以画出来. 只不过有一些是极坐标,要做一些转换才行.
PS: 有些朋友想要用中文. 那就要确认几件事你 python 里中文"我爱你"的编码字节宽度.
你在 terminal 里的中文"我爱你"的编码字节宽度.
import time
[(time.sleep(0.0009), print("\033[91m"+i,end="",flush=True)) for i in ('\n'.join([''.join([(u'我爱你'[(x-y)%3]if((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3<=0 else' ')for x in range(-30,30,2)])for y in range(15,-15,-1)]))]