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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。