相信很多人都看过《生化危机》,对里面的太阳伞公司应该都不陌生。太阳伞公司的图标如下。 今天我们就用python的turtle模块来画这样一把太阳伞。 思路如下: 1. 太阳伞可以近似的看成是正八边形的衍生品,所以我们只要能画出其中的1/8,基本上就成功一半了。那么我们就先来画这个类似于等腰三角形的东西。我们从三角形的顶点开始,先画左边这条边。初始状态下,小海龟的箭头是水平向右的,要将箭头调整到等边三角形的左边那条边的方向。需要向右转90+1/2*inner_angle, inner_angle是等腰三角形的内角,如果是正八边形,那么应该是360/8。 2. 画左边这条边,就是向前移动圆的半径t.fd(r) 3. 之后需要向右要调整箭头的方向到内凹的圆弧的切线方向,通过计算可以得到, (180-2*bottom_angel+90) = 270-2*bottom_angel 其中bottom_angle是等腰三角形的底角的度数。 4. 调用前面写的arc函数,来画一段圆弧,半径是r,角度是等腰三角形的内角的度数,inner_angle。 5. 再次调整箭头的方向,向左调整到等腰三角形右边那条边的方向,通过计算可以得到 (360-2*bottom_angle-90)=270-2*bottom_angle 6. 画右边这条边,就是向前移动圆的半径t.fd(r)。 7. 接下来就是把箭头的方向向右调整180度,再重复前面的2-6步。因此把2-6步定义成一个函数,叫single,也就是画太阳伞的每一瓣。 8. 关于颜色的设置,由于是循环画出来的,并且只有两种颜色,红色和白色,因此可以根据循环的次数的奇偶来设置颜色。 具体的代码也共享给大家。 import math import turtle
def polyline(t, n, length, angle): for i in range(n): t.fd(length) t.rt(angle)
def arc(t, r, angle): arc_length = 2 * math.pi * r * angle / 360 n = int(arc_length / 1.5) + 1 step_length = arc_length / n step_angle = float(angle) / n polyline(t, n, step_length, step_angle)
def single(t, r=100, n=5): inner_angle = 360 / n # print(inner_angle) bottom_angle = (180 - inner_angle) / 2 # print(bottom_angle) edge = round(math.sin(inner_angle / 2 * 2 * math.pi / 360) * r * 2, 4) # print(edge) t.fd(r) t.lt(270 - 2 * bottom_angle) arc(t, r, inner_angle) t.lt(270 - 2 * bottom_angle) t.fd(r) t.rt(180)
def pies(t, r, n): inner_angle = 360 / n t.rt(90 + inner_angle / 2) for i in range(n): t.begin_fill() if i % 2 == 0: t.fillcolor('red') else: t.fillcolor('white') single(t, r, n) t.end_fill()
bob = turtle.Turtle() pies(bob, r=100, n=8) turtle.mainloop()
绘制过程和最终效果如下: 其实如果把前面的画正多变形和弧线的方法掌握了,只需要稍作修改就像能得到这把《生化危机》定制太阳伞。赶紧操练起来吧! 正多边形和弧线的绘制方法和代码,可以参考: |
|