最近在刷视频的时候,看见了一个有趣的数学现象,那就是在平面上任意取30个点,连接,再取两个点中间的一半,重复很多次之后,就会近似变成一个椭圆,于是我就联想到了turtle库应该可以实现这一效果,所以我就想自己做一个。
下面是效果。
那么,首先,我们先把turtle库的框架写出来。
import turtle
turtle.setup(1500,800)
p=turtle.Pen()
turtle.done()
由于不想一个个地把点的坐标输进去,所以我采用random库来随机30个坐标。
import random
x=[]
y=[]
for i in range(30):
x.append(random.randint(-750,750))
y.append(random.randint(-350,350))
为了美观,隐藏画笔,之后再抬笔,移动到相应坐标后,落笔,用for循环将30个坐标连接起来。下面用%取余,使得最后一次循环时画笔移动到第一个点,形成闭环。
p.penup()
for i in range(31):#循环次数要比点数多1,才能连起来
p.goto(x[i%30],y[i%30])
p.dot(10)
p.pendown()
为了速度快,使用了动画三件套tracer,update,clear。这样,就能实现瞬间完成绘画了。
import turtle
import random
p=turtle.Pen()
turtle.setup(1500,700)
turtle.tracer(0)
x=[]
y=[]
p.hideturtle()
for i in range(30):
x.append(random.randint(-750,750))
y.append(random.randint(-350,350))
p.penup()
for i in range(31):#循环次数要比点数多1,才能连起来
p.goto(x[i%30],y[i%30])
p.dot(10)
p.pendown()
turtle.update()
p.clear()
接下来,就是清除画板,取两个点之间的坐标,再依次连接,重复循环。
x1=[]
y1=[]
while 1:
for j in range(30):#将x,y坐标除以2
x[j]/=2
y[j]/=2
for n in range(30):#将x,y坐标和列表的下一位相加,得到中间的新坐标。
x1.append(x[n]+x[(n+1)%30])
y1.append(y[n]+y[(n+1)%30])
for m in range(30):#将旧坐标替换成新坐标
x[m]=x1[m]
y[m]=y1[m]
x1=[]
y1=[]
for q in range(31):#依次连接点
p.goto(x[q%30],y[q%30])
p.dot(5)
turtle.update()
p.clear()
turtle.done()
总体算是完成了,之后便是完善代码了,比如说点的个数,动画刷新速度等,以下是完整代码。
import turtle
import random
import time
p=turtle.Pen()
turtle.setup(1500,700)
turtle.tracer(0)
x=[]
y=[]
x1=[]
y1=[]
z=int(input('点数:'))
v=int(input('循环次数(防止你卡死):'))
a=int(input('x的范围:'))
s=int(input('y的范围:'))
p.hideturtle()
for i in range(z):
x.append(random.randint(-a,a))
y.append(random.randint(-s,s))
p.penup()
for i in range(z+1):#列表长度+1
p.goto(x[i%z],y[i%z])
p.dot(10)
p.pendown()
turtle.update()
time.sleep(2)
p.clear()
for o in range(v):
for j in range(z):
x[j]/=2
y[j]/=2
for n in range(z):
x1.append(x[n]+x[(n+1)%z])
y1.append(y[n]+y[(n+1)%z])
for m in range(z):
x[m]=x1[m]
y[m]=y1[m]
x1=[]
y1=[]
for q in range(z+1):
p.goto(x[q%z],y[q%z])
p.dot(5)
turtle.update()
time.sleep(0.1)
p.clear()
turtle.done()
本篇文章到此结束了,主要写了一个实现刷视频时看到的数学现象的程序,没有什么实用价值,但是能证明这个数学现象是真的,相信如果你运行程序看到这个数学现象也会感慨数学的神奇吧,如果觉得有趣的话,可以点个赞再走哦。