当前位置:   article > 正文

绘制奥林匹克标志——利用python turtle画奥运五环_python绘制体育图标

python绘制体育图标

奥运五环

先看实际例子。

北京奥运会会徽
北京奥运会会徽

  

北京冬奥会会徽
北京冬奥会会徽

https://olympics.com/ioc/olympic-rings

奥林匹克标志 (Olympic Logo /Symbole Olympique/Olympic Rings)是由皮埃尔·德·顾拜旦先生于1913年构思设计的,是由《奥林匹克宪章》确定的,也被称为奥运五环标志,它是世界范围内最为人们广泛认知的奥林匹克运动会标志。它由5个奥林匹克环套接组成,有蓝、黄、黑、绿、红5种颜色。环从左到右互相套接,上面是蓝、黑、红环,下面是是黄、绿环。整个造型为一个底部小的规则梯形。(from baidu百科)

五环的两个版本

在北京奥运会上看到的五环标志是国际奥委会1986年公布的版本,在环与环套接之处留有间隙。下图是本文程序的绘制效果。

2010年之后,五环标志的视觉样式变为“无缝交错”版本,也就是在今年(2021)东京2020奥运会看到的、以及将要在明年年初北京2022冬奥会上看到的五环。下图是本文程序的绘制效果。

程序说明

  • 利用pensize(),color(),circle()画出圆环。
  • 正确处理圆环之间的遮挡关系。采用分段法,除黄色环一次画出,其他四个环都分两次画出。在两环的交叠区域,后绘制的部分遮盖较早绘制的部分。
  • 每一段圆环的绘制分为三步:_move_to()移到起始位置,_jump_circle()根据需要跳过一段圆弧,_draw_ring()落笔绘制。在draw_5rings()中定义了p,c,r三个List,实际是查表,每一次循环从List读取需要的参数。数据之间是有关联的。例如c[0]跳过45度,r[0]落笔画出180度即半圆环,所以在后面的c[6]跳过45+180=225度之后,再画出r[6]的180度,即另一半,从而完成整个圆环。OlympicRings实例化时指定speed等于1到10 之间的数,可以观察动画过程。
  • draw_5rings(True)将输出带有套接间隙的奥运五环。_draw_ring()函数中的ex变量设置为5,这是为了多出一点余量,确保圆环完整。

源代码

  1. # -* encoding: utf-8 *
  2. # Turtle example: The Olympic rings
  3. # Author: wanghuiict
  4. from turtle import Turtle,Screen
  5. U=28 # unit
  6. R=2.75
  7. class OlympicRings(Turtle):
  8. def __init__(self, speed=0):
  9. Turtle.__init__(self)
  10. self.hideturtle()
  11. self.speed(speed)
  12. ''' (w * steps) * (h * steps) '''
  13. def draw_recflag(self, step, color='red', w=30, h=20):
  14. self.pensize(1)
  15. self.penup()
  16. self.home()
  17. self.left(180)
  18. self.forward(w/2 * step)
  19. self.right(90)
  20. self.forward(h/2 * step - R * step)
  21. self.pendown()
  22. self.fill(True)
  23. self.color(color)
  24. self.begin_fill()
  25. for _ in range(2):
  26. self.right(90)
  27. self.forward(w * step)
  28. self.right(90)
  29. self.forward(h * step)
  30. self.end_fill()
  31. self.penup()
  32. def _move_to(self, distance, angle=90, distance2=0):
  33. self.penup()
  34. self.home()
  35. self.fd(distance)
  36. self.lt(angle)
  37. if distance2 != 0:
  38. self.fd(distance2)
  39. def __circle_part(self, radius, extent=360, show=True):
  40. if radius == 0:
  41. return
  42. if not show:
  43. self.penup()
  44. else:
  45. self.pendown()
  46. self.circle(radius, extent)
  47. def _jump_circle(self, radius, extent):
  48. return self.__circle_part(radius, extent, False)
  49. def _draw_ring(self, radius, extent, color, showspace=False):
  50. if showspace == True:
  51. self.color('white')
  52. self.pensize(0.7 * U)
  53. self.__circle_part(radius, extent)
  54. self.color(color)
  55. self.pensize(0.5 * U)
  56. if showspace == True:
  57. ex = 5 if extent > 0 else -5
  58. self.__circle_part(radius, ex)
  59. self.__circle_part(radius, -extent-ex-ex)
  60. else:
  61. self.__circle_part(radius, extent)
  62. def draw_5rings(self, showspace=True):
  63. p = [(R*U, 90, 0), ((6.4+R)*U, 90, 0), (-(6.4+R)*U, 270, 0),
  64. (-(3.2+R)*U, 270, 3*U), ((3.2-R)*U, 270, 3*U), (-(6.4+R)*U, 270, 0),
  65. (R*U, 90, 0), ((3.2-R)*U, 270, 3*U), ((6.4+R)*U, 90, 0)]
  66. c = [(R*U, 45), (0, 0), (0, 0),
  67. (0, 0), (R*U, 135), (R*U, 135),
  68. (R*U, 225), (R*U, 315), (R*U, 225)]
  69. r = [(180, '#232223'), (225, '#EE324E'), (135, '#0081BC'),
  70. (360, '#FCB131'), (180, '#009D57'), (225, '#0081BC'),
  71. (180, '#232223'), (180, '#009D57'), (135, '#EE324E')]
  72. for i in range(9):
  73. self._move_to(p[i][0], p[i][1], p[i][2])
  74. self._jump_circle(c[i][0], c[i][1])
  75. self._draw_ring(R*U, r[i][0], r[i][1], showspace)
  76. if __name__ == '__main__':
  77. W=60
  78. H=40
  79. wn = Screen()
  80. wn.bgcolor("lightgreen")
  81. wn.title("The Olympic rings")
  82. wn.screensize(W*10, H*10)
  83. a = OlympicRings(speed=0)
  84. a.draw_recflag(12, color='white', w=W, h=H)
  85. a.draw_5rings(False)
  86. wn.exitonclick()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/179822?site
推荐阅读
相关标签
  

闽ICP备14008679号