python与分形0015 - 【教程】绘制national flag

2023-11-10 01:40

本文主要是介绍python与分形0015 - 【教程】绘制national flag,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

不知不觉,今天又周五,513330都快破6了,倒金字塔加仓都加到地下室了,真是服气了。

在前几节的教程中,我们玩了一些奇怪的事情,今天我们来玩个正经的事情,画一面五星红旗,也就是我们的国旗。

闲话不说,先上成品图。

<国旗图片>

绘制视频如下:

<国旗视频>

话不多说,还是上教程。

国旗和数学

在画国旗之前,我们需要弄清楚国旗的图形结构。

根据1949年9月28日中国人民政治协商会议第一届全体会议主席团公布的《国旗制法说明》,中华人民共和国国旗旗面为红色,长方形,其长与高为三与二之比,旗面左上方缀黄色五角星五颗。一星较大,其外接圆直径为旗高十分之三,居左;四星较小,其外接圆直径为旗高十分之一,环拱于大星之右。旗杆套为白色。

中华人民共和国国旗的红色象征革命。旗上的五颗五角星及其相互关系象征共产党领导下的革命人民大团结。五角星用黄色是为了在红地上显出光明,黄色较白色明亮美丽,四颗小五角星各有一尖正对着大星的中心点,这是表示围绕着一个中心而团结,在形式上也显得紧凑美观。

如下图所示:

<CSDN提示国旗图片违规,大家可以去查下百度百科>

我们把它转化为数学关系(假设国旗中心点为坐标系原点(0,0),每个格子长宽为L):

  1. 国旗的四个顶点为(-15L,10L),(15L,10L),(15L,-10L),(-15L,-10L)

  2. 大五角星中心点为(-10L,5L),半径为3L,水平放置

  3. 小五角星A中心点为(-5L,8L),半径为L,tan(A)=3/5

  4. 小五角星B中心点为(-3L,6L),半径为L,tan(B)=1/7

  5. 小五角星C中心点为(-3L,3L),半径为L,tan(C)=2/7

  6. 小五角星D中心点为(-5L,1L),半径为L,tan(A)=4/5

这个是我们后面绘图的基础,先放这里了。

f5ac51cd0214b67505ddad131784b73c.png

开始画图

先来画旗面,是一个简单的矩形,其思路很简单:

  1. 从左上顶点开始,往东,seth(0),走30L的长度。

  2. 再往南,seth(-90),走20L的长度。

  3. 再往西,seth(180),走30L的长度。

  4. 最后往北,seth(90),走20L的长度。

  5. fill为红色。

代码如下:

def rectangle(center, length_x, length_y, penc, fillc):turtle.pensize(1)turtle.fillcolor(fillc)turtle.pencolor(penc)turtle.up()pos=(center[0]-length_x/2, center[1]+length_y/2)turtle.goto(pos)turtle.begin_fill()turtle.down()turtle.seth(0)turtle.fd(length_x)turtle.seth(-90)turtle.fd(length_y)turtle.seth(180)turtle.fd(length_x)turtle.seth(90)turtle.fd(length_y)turtle.end_fill()

再来画五角星,我们先来分解,画一个正五角星。

同样的,我们先把数学关系弄出来,见下图:

00cb456d621484a9af970f8374205dfc.png

假设圆的半径为L。

我们先来找到边长关系,因为:sin(54) = T / L0 且 sin(36) = T / L,得到:L0 = L * sin(36) / sin(54),即五角星的边长。

我们观察到五角星的边具有可复制性,A-C1-B重复画5次即可,那么我们先把A-C1-B画出来。

  1. 先不要下笔,从O出发,向北,seth(90),走L的长度,现在在A点。

  2. 向西南方向,seth(180+72),做准备。

  3. 落笔,走L0的长度,到C1点。

  4. 右转72度,right(72),走L0的长度,到B点。

  5. 至此,A-C1-B就画好了。

  6. 然后我们把方向转到下一次画图的方向,左转144度,left(144)。

  7. 重复3-6的动作4次,即可完成整个图形。

  8. 最后fill为黄色。

代码如下:

def star(pos, length, penc, fillc):turtle.pensize(1)turtle.fillcolor(fillc)turtle.pencolor(penc)L = length*math.sin(36*math.pi/180)/math.sin(54*math.pi/180)turtle.up()turtle.goto(pos)turtle.seth(90)turtle.fd(length)turtle.seth(180+72)turtle.down()turtle.begin_fill()for _ in range(5):turtle.fd(L)turtle.right(72)turtle.fd(L)turtle.left(144)turtle.end_fill()
d261bfaa35a6898f51d1e886c8bf6de4.gif

五角星我们已经画出来了,现在我们需要给它旋转一个角度。

这时,我们发现,绘图的过程中,五角星的角度在down之前就已经调整好了,后面画5条折线的时候都是相对位置。

OK,我们把函数改吧改吧就可以了:

def star(pos, angle, length, penc, fillc):turtle.pensize(1)turtle.fillcolor(fillc)turtle.pencolor(penc)L = length*math.sin(36*math.pi/180)/math.sin(54*math.pi/180)turtle.up()turtle.goto(pos)turtle.seth(90+angle)turtle.fd(length)turtle.seth(180+72+angle)turtle.down()turtle.begin_fill()for _ in range(5):turtle.fd(L)turtle.right(72)turtle.fd(L)turtle.left(144)turtle.end_fill()

再来看,旋转20°:

star((0, 0), 0, 90, 'yellow', 'yellow')
star((150, 0), 20, 90, 'red', 'red')
23f372daf5fe80c602b8bbb096d0c6b2.gif

OK,到此,万事俱备,只欠代码。

画国旗

所有的细节都说清楚了,直接上代码吧!!!

#coding: utf-8import turtle
import time
import mathturtle.setup(width=1.0, height=1.0, startx=None, starty=None)
turtle.ht()
turtle.tracer(0, 0)
turtle.bgcolor("black")turtle.pensize(1)def star(center, angle, length, penc, fillc):turtle.pensize(1)turtle.fillcolor(fillc)turtle.pencolor(penc)L = length*math.sin(36*math.pi/180)/math.sin(54*math.pi/180)    turtle.up()turtle.goto(center)turtle.seth(90+angle)turtle.fd(length)turtle.seth(180+72+angle)turtle.down()turtle.begin_fill()for _ in range(5):turtle.fd(L)turtle.right(72)turtle.fd(L)turtle.left(144)turtle.end_fill()def rectangle(center, length_x, length_y, penc, fillc):turtle.pensize(1)turtle.fillcolor(fillc)turtle.pencolor(penc)turtle.up()pos=(center[0]-length_x/2, center[1]+length_y/2)turtle.goto(pos)turtle.begin_fill()turtle.down()turtle.seth(0)turtle.fd(length_x)turtle.seth(-90)turtle.fd(length_y)turtle.seth(180)turtle.fd(length_x)turtle.seth(90)turtle.fd(length_y)turtle.end_fill()W = 1200
H = 800
dW = W/30
dH = H/20#time.sleep(6)rectangle((0,0), W, H, 'red', 'red')
C0 = (-dW*10, dH*5)
A0 = 0
L0 = dW*3
star(C0, A0, L0, 'yellow', 'yellow')
C1 = (-dW*5, dH*8)
A1 = 90+math.atan(3/5)*180/math.pi
L1 = dW
star(C1, A1, L1, 'yellow', 'yellow')
C2 = (-dW*3, dH*6)
A2 = 90+math.atan(1/7)*180/math.pi
L2 = dW
star(C2, A2, L2, 'yellow', 'yellow')
C3 = (-dW*3, dH*3)
A3 = 90-math.atan(2/7)*180/math.pi
L3 = dW
star(C3, A3, L3, 'yellow', 'yellow')
C4 = (-dW*5, dH)
A4 = 90-math.atan(4/5)*180/math.pi
L4 = dW
star(C4, A4, L4, 'yellow', 'yellow')
c83aff18d6398f07d84e4ed8cb575122.gif 3e12dd1dad642699af36b57e9db412bc.png b775b5daa8087bf7abe208c62ce3fe52.gif

这篇关于python与分形0015 - 【教程】绘制national flag的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/379667

相关文章

使用Python绘制蛇年春节祝福艺术图

《使用Python绘制蛇年春节祝福艺术图》:本文主要介绍如何使用Python的Matplotlib库绘制一幅富有创意的“蛇年有福”艺术图,这幅图结合了数字,蛇形,花朵等装饰,需要的可以参考下... 目录1. 绘图的基本概念2. 准备工作3. 实现代码解析3.1 设置绘图画布3.2 绘制数字“2025”3.3

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Golang使用minio替代文件系统的实战教程

《Golang使用minio替代文件系统的实战教程》本文讨论项目开发中直接文件系统的限制或不足,接着介绍Minio对象存储的优势,同时给出Golang的实际示例代码,包括初始化客户端、读取minio对... 目录文件系统 vs Minio文件系统不足:对象存储:miniogolang连接Minio配置Min

使用Python绘制可爱的招财猫

《使用Python绘制可爱的招财猫》招财猫,也被称为“幸运猫”,是一种象征财富和好运的吉祥物,经常出现在亚洲文化的商店、餐厅和家庭中,今天,我将带你用Python和matplotlib库从零开始绘制一... 目录1. 为什么选择用 python 绘制?2. 绘图的基本概念3. 实现代码解析3.1 设置绘图画

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小