第4章 案例研究:接口设计
练习 4-3 用函数画雨伞
写一组合适的通用函数,用来画出下图所示的图形(最终代码执行效果图):
【求解】
不得不说,练习 4-3 比 练习 4-2 简单多了!!!
Step.1 确认组件
由 nnn 个等腰三角形组成“雨伞”
Step.2 抽象问题
已知:雨伞边数 nnn、雨伞边长 lll
求:等腰三角形顶角、底角
Step.3 问题求解
nnn 个顶角平分 360°360°360°:2πn=360n\frac{2π}{n}=\frac{360}{n}n2π=n360
已知等腰三角形顶角 360n\frac{360}{n}n360,求底角:180−360n2\frac{180-\frac{360}{n}}{2}2180−n360
已知等腰三角形底边 lll,求腰长:r=l2sinπnr=\frac{l}{2sin\frac{π}{n}}r=2sinnπl
Step.4 完成代码
"""
《Think Python》练习 4-3:通用函数画雨伞
n:雨伞的边数
l:雨伞的边长
"""
#引入数学模块、乌龟模块
import math
import turtle
#调用乌龟画图
bob = turtle.Turtle()
#雨伞
def umbrella(n,l):
#计算雨伞中每个等边三角形的顶角(angle_in)、底角(angle_out)、腰长(r)
angle_in = 360 / n
angle_out = (180 - angle_in) / 2
r = l / 2 / math.sin(angle_in / 2 / 180 * math.pi)
#重复画等腰三角形完成雨伞
for i in range(n):
bob.lt(angle_in/2)
bob.fd(r)
bob.lt(180 - angle_out)
bob.fd(l)
bob.lt(180 - angle_out)
bob.fd(r)
bob.lt(180 - angle_in/2)
#左移240,画出5瓣雨伞
bob.pu()
bob.fd(-240)
bob.pd()
umbrella(5,115)
#右移240,画出6瓣雨伞
bob.pu()
bob.fd(240)
bob.pd()
umbrella(6,98)
#右移240,画出7瓣雨伞
bob.pu()
bob.fd(240)
bob.pd()
umbrella(7,85)
#下移120,让turtle不遮挡雨伞
bob.pu()
bob.rt(90)
bob.fd(120)
turtle.mainloop()