關(guān)鍵詞:Python/ target=_blank class=infotextkey>Python 、 萬花尺 、 turtle 、 fractions 模塊 、 math 模塊
開發(fā)環(huán)境:PyCharm
版本:python 3.9.5
前言
小時(shí)候我們使用設(shè)計(jì)工具,以落點(diǎn)為原點(diǎn),沿外層工具大小畫出不規(guī)則的圖案,即為萬花尺
萬花尺
原理
大小齒輪的齒數(shù)之比,約為最簡分?jǐn)?shù)時(shí),其分母就是小齒輪沿大齒輪的公轉(zhuǎn)數(shù),分子就是花瓣數(shù),分子和分母的差就是小齒輪的自轉(zhuǎn)數(shù)
公式
效果圖
效果1
效果2
效果3
關(guān)鍵代碼
# 初始化光標(biāo)參數(shù)
def setparams(self, xc,yc,col,R,r,l):
# 設(shè)置相關(guān)軸線、角度、步長、顏色等
self.xc = xc
self.yc = yc
self.R = int(R)
self.r = int(r)
self.l = l
self.col = col
# 計(jì)算最小公約數(shù)
gcdVal = math.gcd(self.r, self.R)
self.nRot = self.r
# 得到半徑比例
self.k = r / float(R)
# 設(shè)置顏色
self.t.color(*col)
# 初始化角度
self.a = 0
# 繪畫線條
def draw(self):
# 循環(huán)畫出其余線條
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)
# 繪畫完成后隱藏光標(biāo)
self.t.hideturtle()
# 根據(jù)步長進(jìn)行更新坐標(biāo)
def update(self):
# 判斷繪畫是否完成,是則跳過
if self.drawingComplete:
return
# 增加描繪角度
self.a += self.step
# 根據(jù)步長繪制
R,k,l = self.R, self.k, self.l
# 設(shè)置角度
a = math.radians(self.a)
# 根據(jù)如上公式進(jìn)行計(jì)算
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)
# 如果繪畫完成,則標(biāo)記
if self.a >= 360 * self.nRot:
self.drawingComplete = True
# 繪畫完成后隱藏光標(biāo)
self.t.hideturtle()
https://pan.baidu.com/s/1ly15zaPWr-L2guKJGk6VmQ
提取碼: 62wj 復(fù)制這段內(nèi)容后打開百度網(wǎng)盤手機(jī)App,操作更方便哦