[Python-turtle]正弦定理能擦出多漂亮的火花?【1】
高中时候,从一个哥们儿那学到了怎么画上边这个图。其实不难,就是随便画个框,然后在框里边画类似于螺旋线的东西,循环迭代,最后汇聚到一起的时候就完成。
突然想到,可不可以写程序来画这个?
分析整理一下:
要素 | 要求、说明 |
---|---|
外边框 | 内角不能超过180度[否则无法正常循环] |
螺旋线偏角 | [偏角:相对于原来的边而言]不能太大 |
每次绘线长度 | 这个需要计算 |
特殊情况 | 随机边框总会长短不一,会导致某些较短的边在循环迭代中长度首先变得过短,那么需要跳过该边[如上动图中左下角的短边】,否则会导致异常 |
结束判断 | 1. 如果迭代过程中,由于跳过“边”导致当前多边形边数小于2,,那么停止;或者,2. 不断地迭代,边数满足要求,但是当前最长边小于某个“小值”,那么结束。 |
内角大于180度:
偏角过大:
跳边条件:
【途中绿色边】
结束条件很判断很容易实现,偏角也可以设置的比较小。那么还剩下的就是每次绘线的长度,该怎么计算?
其实方法就在标题里,正弦定理。
是怎么跟正弦定理扯上关系的呢,上图:
假设L1,L2为多边形的两条相邻边。
首先绘出的是边框,所以,我们可以很容易记录每条边的长度,以及其相对于x轴的偏角{0~360},甚至多边形顶点的坐标。或者说,我们在绘制边框的时候,按我们的规则,让绘制的同时,让程序记录下我们需要的这些基础数据。
所以,按照这个思路。途中蓝色的数据都是已知值。那么很容易可以得到:
Θ3 = Θ2 - Θ1
Θ4 = 180 - Θ3
Θ5 = 180 - Θ4 - dΘ
参数 | 说明 |
---|---|
L1 | ab边的长度 |
L2 | bc边的长度 |
Θ1 | ab边相对于x轴的偏角[0-360] |
Θ2 | bc边相对于x轴的偏角[0-360] |
dΘ | 每次画螺旋线的偏角 |
L3 | 当前螺旋线(长度) |
于是,根据正弦定理:
L1 / sin(Θ5) = L3 / sin(Θ4) = dL2 / sin(dΘ)
到这里,我们已经算得了需要的参数。
初始绘图数据约定
细细分析,完成一次运算,所用到的无非两个数据:ab向量,bc向量。
所以在存取数据初始数据的时候,可以约定如下:
多边形的每条边向量(默认逆时针:如ab,bc,而非cb,ba…)作为一个单独的数据集,保存的内容依次为[与x轴偏角 0-360]、[向量长度(边长)]、[向量起始点坐标]
每条数据按照逆时针的方向存储到列表中。如:[[a],[b],[c]…]
循环迭代过程
每次根据上述过程,选取相邻两个数据计算所需数据值。
于是, 当前画线的偏角(相对于x轴)为Θ1+dΘ,画线长度为L3.
之后,需要更新Θ1=Θ1+dΘ,L1=L3,L2=L2-dL2,还有更新b点为当前绘图终点。
其实数据更新过程很好理解,每次画线后,需要对当前两个向量更新。ab‘向量长度,偏角都改变,但是起始坐标没改变。bc’向量偏角没变,但是长度与起始坐标改变。
显而易见,这些推理适用于符合刚开始约束条件下的所有相邻边。
跳边情况[硬骨头]
就如刚开始分析的那样,有的边,他画着画着就没了,所以程序应该及时识别出它,然后剔除掉。
该怎么去判断呢,上图:
需要跳边,都是L2过短,如上图。
由于L3,dL2,都是根据正弦定理得出[其实追究到底,是由L1和Θ1,Θ2,dΘ通过一些列计算得到的所有数据]。也就是说,整个三角形的角的大小、关系是确定的,所以当L2过短时,必然出现上图情况。
很简单的归纳一下,那就是 dL2 > L2 的时候,需要跳过bc边,并剔除bc向量。
相应措施为:不做螺旋线,直接做ac点的连线。更新ab向量为ac【偏角:两点斜率再换算到0-360;长度:两点间距离;起始点坐标:不变】。
到这里,分析的已经差不多了。
余下 | 说明 |
---|---|
边框绘制并获取约定数据 | 两种思路:随机绘制边框/半手动绘制边框。随机绘制的时候,边框闭合问题,边框合格判定问题;半手动绘制时,需要与程序交互,可实现相对复杂的边框以及嵌套。 |
由一系列有序坐标点(逆时针)获取约定数据 | 偏角、长度的计算 |
余下的,余下的佛系更新吧。
这是整个小项目 目前能做到的样子
将视频转作字符动画【UI加持操作更简单】
2020-QuartusⅡ13.1安装,踩雷
腾讯良心之作-桌面整理
奇怪的思路_让你的桌面更简洁
将图片绘制到Excel表格
好用的屏幕取色器
python制作枯燥的字符图
PIL Image.paste() 透明像素问题
图片变字符画,其实很简单
干货!Windows频幕二维码识别小工具
python 图片拼接、图片转pdf
今日头条美图爬取,有你想要的
python 精美壁纸、简单爬虫,告别壁纸荒
Python 图片拼心,表白利器
Python 以字成图,花式表白,脱单趁早
奇妙的“字符26进制”
从视频中提取图像
[Python-turtle]正弦定理能擦出多漂亮的火花?【1】相关推荐
- python画笔的尺寸_Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图...
介绍 本文不是一篇详尽的.从简到繁的 Maplotlib 画图教程,而是用各种例子快速直观地让读者上手 Matplotlib 画图中的一些常用的.基础的操作.本文不对各种数据图(折线图.柱状图等)作介 ...
- Python仅四步写出完整漂亮的五子棋
最近比较闲,将写游戏练习python的心得发出来.先以五子棋为例,实现基本功能简单四步即可写出完整漂亮的五子棋,代码不过140余行.现一步一步分解发出来,方便初学者交流. 虽然代码看上去不是很专业,不 ...
- python语言创意绘画-Python turtle库能画出什么好玩的东西?
[教你用Python画蛋糕] 我曾经给别人送过的生日礼物是一段Python代码... 用了Python的turtle package,仿照这个网站的代码:Layer Cake using Python ...
- Matplotlib 常用画图命令总结:使用 Python 在论文中画出一手漂亮的数据图
介绍 本文不是一篇详尽的.从简到繁的 Matplotlib 画图教程,而是用各种例子快速直观地让读者上手 Matplotlib 画图中的一些常用的.基础的操作.本文不对各种数据图(折线图.柱状图等)作 ...
- python turtle画画 30排以内_Python竟能画这么漂亮的花,帅呆了(代码分享)
阅读本文大概需要3分钟 关于函数和模块讲了这么久,我一直想用一个好玩有趣的小例子来总结一下,同时也作为实战练习一下. 趣味编程其实是最好的学习途径,回想十几年前我刚毕业的时候,第一份工作就给手机上写a ...
- python程序的书写特点_不一样的Python代码写法,让你写出一手漂亮的代码
Python语言这么火,有很多同学是从其他语言转行过来的(比如c++,java语言),多多少少写代码的时候也会受其他语言的影响!而对于刚开始学语言的小白同学来说,解决问题的思路有的时候会比较单一,其实 ...
- 中软python编码规范考试试题_卓越分享 | 如何写出一手漂亮的Python代码?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Python语言这么火,有很多同学是从其他语言转行过来的(比如c++,java语言),多多少少写代码的时候也会受其他语言的影响!而对于刚开始学编程的小白同 ...
- python什么字体好看_七个不一样的Python代码写法,让你写出一手漂亮的代码
原标题:七个不一样的Python代码写法,让你写出一手漂亮的代码 Python语言这么火,有很多同学是从其他语言转行过来的(比如c++,java语言),多多少少写代码的时候也会受其他语言的影响!而对于 ...
- 用python画漂亮的图案-使用 Python Turtle 设计简单而又美丽的图形
原标题:使用 Python Turtle 设计简单而又美丽的图形 正文 看看本文中这些美丽的图画.正是这样的事情让我爱上了 turtle.优秀的程序员会认为turtle是"落后原始的&quo ...
- 不一样的Python代码写法,让你写出一手漂亮的代码
Python语言这么火,有很多同学是从其他语言转行过来的(比如c++,java语言),多多少少写代码的时候也会受其他语言的影响!而对于刚开始学语言的小白同学来说,解决问题的思路有的时候会比较单一,其实 ...
最新文章
- 负载均衡算法-响应速度均衡
- 南京超过广州!4 月程序员工资统计出炉,平均 14596 元
- eclipse常用设置之自动格式化
- 科大讯飞cordova语音插件填坑及api介绍
- python 宏处理库_常用的Python库,给大家分享一下!
- 剔除异常值栅格计算器_R语言系列 数据清洗3 异常值处理
- 可实现自动设置尺寸的图片上传类
- 如何加入Dave英语学习小组
- 如何训练解决问题的能力?
- 四阶龙格库塔c语言,四阶龙格库塔算法的C语言实现
- std::future ---C++17 多线程
- 2019-02-26-GCN资料
- 学生专用计算机abs什么意思,出现abs标志什么意思
- Nginx配置443端口
- 立创开源 WCHLink/DapLink下载器 沁恒
- 红黑树解析(RB-Tree)
- DataStory·2017大数据商业创新论坛(上海站)圆满结束
- 键盘的复制粘贴快捷键总是需要重复多次才起作用
- 【腾讯TMQ】MBT探索系列 – PRE/POST 模型在网络接口测试MBT的应用和探索
- Navicat Premium链接MySQL时出现2059错误解决方法
热门文章
- python递归排列组合_Python 排列组合
- 逻辑回归实现鸢尾花分类
- cms php 免费,十大免费PHP内容管理系统(CMS)
- Unity说明文档翻译-Time Manager
- 双十一,程序员可太难了
- php展厅控制系统,展厅展馆设计智能中控系统
- 百度招聘实习生:网页搜索部_语法研究实习工程师(七种语
- c 连接oracle otl,C++类库:OTL通用的数据库连接类库
- [架构]京东咚咚架构演进
- Docker 部署 IntelliJ Projector,愉快玩耍 Android Studio、Idea、PyCharm 等 Swing 应用