用python画爱心,多种方法任你选~

在网页闲逛时,看到AI对话中有一个用python画爱心的选项。
之前在学习编程时,接触过这个问题,于是今天尝试解决此问题。

I - 解决方案一 - 直接用print()输出

这里我们只需要手动打出爱心即可,代码示例如下:

#用python画爱心
#解决方案一 - 直接用print()输出

print("""  
   *****         *****
  *******       *******
 *********     *********
*************************
 ***********************
  *********************
    *****************
       ***********
         *******
           ***
""")

stop = input()

结尾部分使用了输入函数stop = input()原因:
当使用命令提示符直接运行此程序时,不添加结尾的代码段可能会在程序输出完毕后直接“闪退”而让你看不到结果。添加此行后,等待程序执行完毕,再按一下回车键即可退出

(看完解决方案一不要着急走,后面又关于这个方案的拓展): D
这是最基础的方案,接下来看几个复杂的

II - 解决方案二 - 利用函数和turtle画出图像

查阅资料得知,爱心函数的解析式为:

y = x ( 2 3 ) + 0.9 3.3 − x 2 sin ⁡ ( a π x ) y = x^{(\frac{2}{3}\quad)}+0.9\sqrt{3.3-x^2}\sin{(a\pi{}x)} y=x(32)+0.93.3x2 sin(x)
x ∈ [ − 3.3 , 3.3 ] , a 为某一常数 x∈[-\sqrt{3.3},\sqrt{3.3}],a为某一常数 x[3.3 3.3 ],a为某一常数

值得注意的是,这里对a有限制,具体请看下面的函数图像(取a=-21):
函数图像,a=-21
随着a的绝对值的增大,此函数的变化率越快。当a趋近于某个临界值时,函数图像中的曲线越密集。
但是,由于正弦函数[sin()]具有周期性,由求导可知,当a等于这个临界值时,图中的曲线就恢复了当a=0时的状态。因此a的绝对值即不能过大,也不能过小,否则会导致画出来的图象不精美。
在turtle模块中,绘制出的图像的单位为像素,在某个范围为内,a越大,函数变化得越快,横坐标的稍微改变都可能导致纵坐标产生巨大的变化。由于电脑不能无限精确地画出图像,最后得出的图像就会显示为一个实心的心形。类似于线动成面的原理。
按照以下流程编写代码:

设置画笔颜色
计算x对应函数值
引用turtle
让画笔回到原点
绘制图像

代码示例如下:

#用python画爱心
#解决方案二 - 利用函数和turtle画出图像

import turtle
import math
t = turtle.Turtle()

#建立函数,a取50
def f(x):
    y = math.pow(x,(2/3))+0.9*math.sqrt(3.3-math.pow(x,2))*math.sin(50*math.pi*x)
    return y

#开始绘画,先到原点,再画x轴正半轴部分,最后画负半轴部分
#由于x取值范围过小,在画布上体现不明显,因此这里把x,y坐标放大50倍
#给定数据 math.sqrt(3.3)≈1.817
t.color("red")
t.pensize(5)
t.speed(0)
t.up()
t.goto(0,0)
t.down()

for x1 in range(1,182):
    t.goto(x1/2,math.floor(f(x1/100)*50))
   
t.up()
t.goto(0,0)
t.down()


for x2 in range(1,182):
    t.goto((-1)*x2/2,math.floor(f(x2/100)*50))
   
#隐藏画笔,让你的作品更加完美
t.hideturtle()

stop = input()

其中有一个参数可以根据你的喜好调整。在代码段:t.pensize(5)
这一段的意思为:调整画笔粗细。根据测试结果,本人认为此数值在4~10之间最好,数值越大,画出来的心形越圆滑;反之,可能会有一些锯齿。另外,这个参数必须是整数
结尾输入函数的作用同上

此图片为上述代码示例运行的结果:
解决方案二运行结果

=== The End ===

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值