绘制奥林匹克标志——利用python turtle画奥运五环
绘制奥林匹克标志——利用python turtle画奥运五环
奥运五环
先看实际例子。
北京奥运会会徽
北京冬奥会会徽
禁止访问国际奥委会官方网站上的奥运五环标志页面。
皮埃尔·德·顾拜旦先生在1913年提出了奥林匹克标志的构想奥运五环吉祥物图片绘制奥林匹克标志——利用python turtle画奥运五环,并完成了其设计工作。这一标志在《奥林匹克宪章》中得到了明文规定奥运五环吉祥物图片绘制奥林匹克标志——利用python turtle画奥运五环,人们通常称之为奥运五环标志。它在全球范围内享有极高的知名度,是奥林匹克运动会的代表性标志之一。这个标志由五个奥林匹克环紧密相连构成,色彩包括蓝色、黄色、黑色、绿色和红色共五种。这些环从左至右依次相套,上方排列着蓝色、黑色和红色环,下方则是黄色和绿色环。整体形状呈现为一个底端较窄的规则梯形。
五环的两个版本
在北京举办的奥运会中展出的五环标志源自国际奥委会于1986年发布的版本奥运五环吉祥物图片,其设计特点在于环环相扣处故意留有缝隙。本图展示了本文所展示的程序绘制成果。
自2010年起,五环标志的视觉呈现转变为“无缝交错”样式,这种设计在今年(2021年)的东京2020奥运会上得以展现,也将在明年(2022年)初的北京2022冬奥会上亮相。下方的图像展示了本程序的绘制效果。
程序说明 源代码
# -* encoding: utf-8 *
龟类示例:奥林匹克五环标志
# Author: wanghuiict
导入Turtle和Screen模块,分别用于创建海龟对象和屏幕界面。
U=28 # unit
R=2.75
class OlympicRings(Turtle):
def __init__(self, speed=0):
Turtle.__init__(self)
self.hideturtle()
self.speed(speed)
将宽度乘以步数,再将结果与高度乘以步数的积相乘。
定义一个名为draw_recflag的方法,该方法接受三个参数:step、color默认值为红色、宽度w默认为30、高度h默认为20。
self.pensize(1)
self.penup()
self.home()
self.left(180)
self.forward(w/2 * step)
self.right(90)
执行前向传播操作,参数为h的一半乘以步长减去R乘以步长。
self.pendown()
self.fill(True)
self.color(color)
self.begin_fill()
for _ in range(2):
self.right(90)
self.forward(w * step)
self.right(90)
self.forward(h * step)
self.end_fill()
self.penup()
定义函数,实现移动功能,参数包括移动距离和角度,角度默认值为90度,另外还可以指定第二个距离参数,其默认值为0。
self.penup()
self.home()
self.fd(distance)
self.lt(angle)
if distance2 != 0:
self.fd(distance2)
定义函数,名为circle_part,该函数接收三个参数:半径radius、范围extent默认值为360、显示与否show默认为True。
if radius == 0:
return
if not show:
self.penup()
else:
self.pendown()
self.circle(radius, extent)
实现跳转圆形功能,参数包括半径和范围。
执行返回操作,调用自身中的私有方法__circle_part,传入半径、范围和布尔值False作为参数。
定义函数_draw_ring,参数包括半径、范围、颜色,以及一个可选的布尔值showspace,默认为False。
if showspace == True:
self.color('white')
self.pensize(0.7 * U)
执行绘制圆部分操作,半径为radius,范围为extent。
self.color(color)
self.pensize(0.5 * U)
if showspace == True:
ex = 5 if extent > 0 else -5
执行绘制半径为radius、扩展值为ex的圆形部分操作。
执行绘制圆形部分操作,半径为radius,范围从负的延伸量减去额外的延伸量开始。
else:
self.__circle_part(radius, extent)
定义一个名为draw_5rings的方法,该方法接受一个名为showspace的参数,其默认值为True。
p = [(R乘以U,角度为90度,偏移量为0),(6.4加上R再乘以U,角度为90度,偏移量为0),(负的6.4加上R再乘以U,角度为270度,偏移量为0),]
(-3.2加R的乘积乘以U,270度,3乘以U),(3.2减R的乘积乘以U,270度,3乘以U),(-6.4加R的乘积乘以U,270度,0)。
(R*U, 90度, 0度), ((3.2减去R)乘以U, 270度, 3倍U), ((6.4加上R)乘以U, 90度, 0度)]
c = (R乘以U,45),(0,0),(0,0),
坐标原点为(0, 0),旋转角度分别为135度的R*U,135度的R*U,以及135度的R*U。
(R*U, 225)与(R*U, 315)以及(R*U, 225)均被限制使用。
r包含四个元组,分别为(180,'#232223'),(225,'#EE324E'),(135,'#0081BC'),以及()。
将360度对应的颜色值设为#FCB131,180度对应的颜色值设定为#009D57,225度对应的颜色值指定为#0081BC。
(180, 颜色代码#232223), (180, 颜色代码#009D57), (135, 颜色代码#EE324E)。
for i in range(9):
执行移动操作至坐标点,具体为(p[i][0], p[i][1], p[i][2])。
执行跳转操作,针对坐标点(c[i][0],c[i][1])调用self._jump_circle方法。
执行绘制环形操作,参数分别为R乘以U、数组r的第i个元素的第一个和第二个值,以及显示空间的标志。
若当前模块作为主程序运行:
W=60
H=40
wn = Screen()
wn.bgcolor("lightgreen")
wn.title("The Olympic rings")
wn.screensize(W*10, H*10)
a = OlympicRings(speed=0)
绘制标志函数,参数为12,颜色设置为白色,宽度为W,高度为H。
a.draw_5rings(False)
wn.exitonclick()