关键词:Python/ target=_blank class=infotextkey>Python 、 万花尺 、 turtle 、 fractions 模块 、 math 模块
开发环境:PyCharm
版本:python 3.9.5
前言
小时候我们使用设计工具,以落点为原点,沿外层工具大小画出不规则的图案,即为万花尺
万花尺
原理
大小齿轮的齿数之比,约为最简分数时,其分母就是小齿轮沿大齿轮的公转数,分子就是花瓣数,分子和分母的差就是小齿轮的自转数
公式
效果图
效果1
效果2
效果3
关键代码
# 初始化光标参数
def setparams(self, xc,yc,col,R,r,l):
# 设置相关轴线、角度、步长、颜色等
self.xc = xc
self.yc = yc
self.R = int(R)
self.r = int(r)
self.l = l
self.col = col
# 计算最小公约数
gcdVal = math.gcd(self.r, self.R)
self.nRot = self.r
# 得到半径比例
self.k = r / float(R)
# 设置颜色
self.t.color(*col)
# 初始化角度
self.a = 0
# 绘画线条
def draw(self):
# 循环画出其余线条
R,k,l = self.R,self.k, self.l
for i in range(0, int(360 * self.nRot + l), self.step):
a = math.radians(i)
x = R * ((l-k) * math.cos(a) + l * k * math.cos((l-k) * a / k))
y = R * ((l-k) * math.sin(a) - l * k * math.sin((l-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 = self.R * ((l - k) * math.cos(a) + l * k * math.cos((l - k) * a / k))
y = self.R * ((l - k) * math.sin(a) - l * k * math.sin((l - k) * a / k))
self.t.setpos(self.xc + x, self.yc + y)
# 如果绘画完成,则标记
if self.a >= 360 * self.nRot:
self.drawingComplete = True
# 绘画完成后隐藏光标
self.t.hideturtle()
https://pan.baidu.com/s/1ly15zaPWr-L2guKJGk6VmQ