前言
初学python,需要一点有趣的案例。同时,细节功能足够,且不难明了。
这里提供一个模拟产生万花尺螺环线的程序。
如果您对万花尺不了解,科普内容可见:https://www.bilibili.com/video/BV1w7411q7xH/
您可以将以下代码全文拷贝过去,运行一下。然后再具体看注解。
鉴于我在代码中,已经注解的很详细了。所以就不在正文中多说了。
代码全文
'''
名称:spiroAnimator.py
功能:模拟产生万花尺螺旋线。 科普内容可见:https://www.bilibili.com/video/BV1w7411q7xH/
使用方法:
1:可以不用输入任何参数,直接运行此程序。将展示随机万花尺螺环图形。
2:可以使用parser解析器输入参数,生成指定图形。具体方法举例如下:
1)将本程序复制到pycharm。
2)在pycharm的 Run菜单下,找到Edit Configurations菜单。选择对应程序(此时是spiro.py),在Parmmeters栏中输入 --sparams 300 88 0.44 。
From:@小小脚色008
Date:2021-11-4
'''
# 导入库函数
import random, argparse, math, turtle
from PIL import Image
from datetime import datetime
# Spiro类:绘制一个图形
class Spiro:
# constructor init初始化部分,在创建实例对象时会自动执行。
def __init__(self, xc, yc, col, R, r, l):
# 创建turtle对象。turtle光标。
self.t = turtle.Turtle()
self.t.shape('turtle')
self.step = 5 # 步长5度。
self.drawingComplete = False # 完成绘制标识
self.setparams(xc, yc, col, R, r, l)
self.restart()
# 类中的self是对其实例化的意思,平时照用即可。https://blog.csdn.net/weixin_50123771/article/details/108960333
def setparams(self, xc, yc, col, R, r, l):
self.xc = xc
self.yc = yc
self.col = col
self.R = int(R) # 像素点为整数。
self.r = int(r)
self.l = l
# 确定循环截止条件。r/R约分后的分子,就是 圈数,再多就重复了。
# 比如,若R=100,r=50,则只1圈即可。
gcdVal = math.gcd(self.r, self.R)
self.nRot = self.r // gcdVal
self.k = r / float(R)
self.a = 0
# 设置颜色
self.t.color(*col)
def restart(self):
self.drawingComplete = False
self.t.showturtle()
self.t.penup()
R, k, l = self.R, self.k, self.l # R,k,l本函数自用。
a = 0.00 # 弧度值
x = R * ((1 - k) * math.cos(a) + l * k * math.cos((1 - k) * a / k))
y = R * ((1 - k) * math.sin(a) - l * k * math.sin((1 - k) * a / k))
self.t.setpos(self.xc + x, self.yc + y)
self.xl = self.xc + x
self.yl = self.yc + y # 使用xl,yl保存当前循环上一个的光标位置。用于计算光标方向。
self.t.pendown()
def draw(self):
# 连续绘制。
R, k, l = self.R, self.k, self.l
for i in range(0, 360 * self.nRot + 1, self.step):
a = math.radians(i) # 弧度值
x = R * ((1 - k) * math.cos(a) + l * k * math.cos((1 - k) * a / k))
y = R * ((1 - k) * math.sin(a) - l * k * math.sin((1 - k) * a / k))
self.t.setpos(self.xc + x, self.yc + y)
# 确定绘制完成之后,才能隐藏光标。
self.t.hideturtle()
def update(self):
# 单步执行绘制,非连续。
if self.drawingComplete:
return # 若绘制完成标识为真,则不再执行此函数,直接跳出。
self.a += self.step
R, k, l = self.R, self.k, self.l
a = math.radians(self.a) # 弧度值
x = R * ((1 - k) * math.cos(a) + l * k * math.cos((1 - k) * a / k))
y = R * ((1 - k) * math.sin(a