代碼:
turtle.circle(30)
圖略。
效果圖:
這裡面需要一點數學知識。
這三個圓的相對位置構成了一個等邊三角形,假設第一個圓的起始位置為(x0, y0),那麼,第二個圓的起始位置為(x0-r, y0+sqrt(3)r),第三個圓的起始位置為(x0-r+2r,y0+sqrt(3)r)。
知道了相對位置畫法就簡單了。
先畫第一個圓,代碼為:
r = 30
x0 = 0
y0 = 300
turtle.penup()
turtle.goto(x0, y0)
turtle.pendown()
turtle.circle(r)
再找第二個圓的起始位置:
x0 -= r
y0 -= math.sqrt(3)*r
再畫第二個圓:
turtle.penup()
turtle.goto(x0, y0)
turtle.pendown()
turtle.circle(r)
再畫第三個圓:
turtle.penup()
turtle.goto(x0+2*r, y0)
turtle.pendown()
turtle.circle(r)
搞定,眼尖的同學一定看出來了可以重構,我們再等等。
效果圖:
已經由1層衍生到了2層,那麼,由2層衍生到3層就比較簡單了,直接再增加代碼。
x0 -= r
y0 -= math.sqrt(3)*r
turtle.penup()
turtle.goto(x0, y0)
turtle.pendown()
turtle.circle(r)
turtle.penup()
turtle.goto(x0+2*r, y0)
turtle.pendown()
turtle.circle(r)
turtle.penup()
turtle.goto(x0+4*r, y0)
turtle.pendown()
turtle.circle(r)
我們發現,1->2,2->3的邏輯是一樣的,代碼也基本上差不多,重構一把。
def stack_circles(x0, y0, r, stacks):
turtle.penup()
turtle.goto(x0, y0)
turtle.pendown()
turtle.circle(r)
if stacks > 1:
for s in range(1, stacks):
x0 -= r
y0 -= math.sqrt(3)*r
for _ in range(s+1):
turtle.penup()
turtle.goto(x0 + 2*_*r, y0)
turtle.pendown()
turtle.circle(r)
turtle.update()
pefect。