用Python中的turtle库实现无序点变成椭圆

        最近在刷视频的时候,看见了一个有趣的数学现象,那就是在平面上任意取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()

        本篇文章到此结束了,主要写了一个实现刷视频时看到的数学现象的程序,没有什么实用价值,但是能证明这个数学现象是真的,相信如果你运行程序看到这个数学现象也会感慨数学的神奇吧,如果觉得有趣的话,可以点个赞再走哦。

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值