知乎上有一个提问,怎么画奥林匹克烯,具体长下面这样子。

看到这个图的第一印象,就跟苯环差不多,六边形加上几条线就好了。

STEP 1:画一个普通六边形 Hexagon

这个代码比较简单,最简单的是:

for i in range(6):turtle.fd(100)turtle.right(60)

STEP 2:画一个正放六边形Vertical Hexagon

我们从左下角的位置开始画,步骤:

  • 起笔到起始位置

  • 设置方向为正北

  • 开始画fd

  • 设置方向向右60°

  • 重复如上5次

代码:

turtle.penup()
turtle.goto((-100, 0))
turtle.seth(90)
turtle.pendown()
for i in range(6):turtle.fd(100)turtle.right(60)

STEP 3:重构一把

重构原因:

  • 把画图封装到一个函数中

  • 5个六边形实际上是有关系的,我们需要把6个顶点记下来

重构后的代码:

def draw_vertical_hexagon(start_pos, length):all_pos = []turtle.penup()turtle.goto(start_pos)turtle.seth(90)turtle.pendown()for i in range(6):all_pos.append(turtle.pos())turtle.fd(length)turtle.right(60)return all_pos

STEP 4:增加苯环内部的线段

这些线段有如下特性:

  • 与外环的顶点连线与外环的夹角是60°

  • 内环是一个小的正六边形

基于如上两点,我们只要确定内环的起始位置线段长度就可以按照外环的画法把内环画出来。

数学推导见下图:

图上的标注的夹角为60°,假设外环和内环的长度差为2d,

如果外环的起点坐标为(x, y)的话,

那么内环的起点坐标为(x+sqrt(3)*d, y+d)。

好了,已知外环的起始坐标和长度,直接求出了内环的起始坐标和长度。

可以直接上代码(这里的d不太符合我们的定义,但是也可以用,我懒得调了):

def draw_vertical_hexagon_with_ring(start_pos, length, length_ratio, ring):d = length//length_ratioall_pos = []turtle.penup()turtle.goto(start_pos)turtle.seth(90)turtle.pendown()for i in range(6):all_pos.append(turtle.pos())turtle.fd(length)turtle.right(60)turtle.penup()turtle.goto(start_pos[0]+math.sqrt(3)*d, start_pos[1]+d)turtle.seth(90)for i in range(6):if ring[i]:turtle.pendown()turtle.fd(length-d*2)turtle.right(60)turtle.penup()return all_pos

这个代码里面,我们巧妙的用了一个ring的参数,表示对应的外环是否有对应的内环。

  • 如果有对应的内环,那么我们就pendown。

  • 如果没有对应的内环,那么我们就penup。

  • 就这么简单。

STEP 5

万事俱备,只欠五环。

观察整个图形,我们发现每个环的起始绘图点是有规律的。

  • 第二个环的第一个点(起始点)是第一个环的第五个点。

  • 第三个环的第一个点(起始点)是第二个环的第五个点。

  • 第四个环的第一个点(起始点)与第一个环的第六个点差一个外环的边长。

  • 第五个环的第一个点(起始点)是第四个环的第五个点。

代码来了:

length = 100
length_ratio = 10
p0 = (-100,0)
all_pos0 = draw_vertical_hexagon_with_ring(p0, length, length_ratio, [1, 0, 1, 0, 1, 0])p1 = all_pos0[4]
all_pos1 = draw_vertical_hexagon_with_ring(p1, length, length_ratio, [0, 0, 0, 0, 0, 0])p2 = all_pos1[4]
all_pos2 = draw_vertical_hexagon_with_ring(p2, length, length_ratio, [1, 0, 1, 0, 1, 0])p3 = (all_pos0[5][0], all_pos0[5][1]-length)
all_pos3 = draw_vertical_hexagon_with_ring(p3, length, length_ratio, [0, 0, 0, 1, 0, 1])p4 = all_pos3[4]
all_pos4 = draw_vertical_hexagon_with_ring(p4, length, length_ratio, [0, 0, 0, 0, 1, 0])

视频

python与分形0018 - 【教程】奥林匹克烯相关推荐

  1. python绘制分形图形教程_Python教程之绘制Mandelbrot集合

    原标题:Python教程之绘制Mandelbrot集合 一. 分形与混沌 自然界的很多事物,如树木.云彩.山脉.雪花.海岸线等,都呈现出传统几何学所不能描述的形状,这些形状都有如下的特性: 有着十分精 ...

  2. python绘制分形图形教程_#python绘制分形图形教程#如何用Python绘制Circos图

    用Python实现Circos图的在线绘制的Circos有局限性,如对数据的要求.个性局限理速度等的问题,但如果你是一个Pythoneer或者喜欢用更加Pythonic的方式来个性化地绘制Circos ...

  3. python绘制分形图形教程_python-图形绘制(1)-turtle-递归-分形几何美学-分形树

    分形几何美学:客观事物具有自相似的层级结构,局部与整体在形态.功能.信息.时间.空间等方面具有统计意义上的相似性,称为自相似性.自相似性指局部是整体成比例缩小的性质. 分形树 单根树 所有的分形树是由 ...

  4. Blender中的Python脚本介绍学习教程

    Blender中的Python脚本介绍学习教程 MP4 |视频:h264,1280×720 |音频:AAC,48000 Hz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:1.63 ...

  5. 分享一个python cookbook的在线教程地址

    分享一个python cookbook的在线教程地址: http://python3-cookbook.readthedocs.org/zh_CN/latest/ 翻译者:熊能 转载于:https:/ ...

  6. python商业爬虫教程_廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程...

    廖雪峰老师的Python商业爬虫课程 Python网络爬虫实战教程 体会不一样的Python爬虫课程 1.JPG (53.51 KB, 下载次数: 1) 2019-8-9 08:15 上传 2.JPG ...

  7. scrapy爬虫储存到mysql_详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库

    获取要爬取的URL 爬虫前期工作 用Pycharm打开项目开始写爬虫文件 字段文件items # Define here the models for your scraped items # # S ...

  8. python是什么编程教程-Python 从不懂到入门

    基础知识 什么是编程语言 可以简单的理解为一种计算机和人都能识别的语言 什么是 Python 一种编程语言 安装 Python 开发环境 何为开发环境 简单理解为运行 Python 的平台 去 Pyt ...

  9. python自学平台-Python学习交流平台与教程推荐

    Python学习交流平台与教程推荐 目录 一.有编程问题怎么办? 1 Stack Overflow 2 Github 3 CSDN-专业IT技术社区 二.Python教程 1 跟我读Python文档 ...

最新文章

  1. python3基础教程廖雪峰云-学习廖雪峰Python3教程的pytho
  2. 安装vmware esx4.1
  3. 数据库:redis和MySQL如何做到数据的一致性?
  4. 计算机技术分,计算机技术专业那么多,你分得清吗?
  5. python学习笔记(七)
  6. LeetCode 535. Encode and Decode TinyURL
  7. pytorch —— Batch Normalization
  8. uva 11178(几何)
  9. vscode remote 第三方库_分钟将vscode撸成小霸王
  10. androidwear的主要UI空间有哪些
  11. 召回离线评估指标(二)
  12. [收藏转载]明星软件工程师的十种特质
  13. Categories
  14. 一些Arduino 测试代码
  15. Java之将GB2312编码转化为汉字
  16. Linux三个网络监视器之《三》——vnstat
  17. 每周一计-自己动手做的电源
  18. 2019年特大喜讯,用Python爬出来的数据说话,房价真降了
  19. 王者营地显示主宰进攻服务器是什么意思,王者营地战斗力什么意思?战斗力意思解释[多图]...
  20. 平台云基石-CoreOS之集群篇(无需互联网)

热门文章

  1. Golang big.int类型转int
  2. 牛年贺岁特辑 | 盘点5G产业看趋势,喜迎牛年谋新局
  3. 英文参考文献按照首字母排序使用matlab实现
  4. 芝麻信用网页api php,谈谈php对接芝麻信用踩的坑
  5. 医院信息化成功的关键=本质+方法+工具
  6. 电力电子元器件行业研究:市场规模持续增长
  7. LNMP架构搭建(源码编译)
  8. azdb文件怎么打开_az mysql db
  9. 深度Linux 安装英伟达闭源驱动,deepin20 安装英伟达闭源驱动的步骤详解
  10. 某系统采用基于优先权的非抢占式进程调度策略,完成一次进程调度和进程切换的系统时间开销为 1μs。