Python实现不规则图形填充的思路


Posted in Python onFebruary 02, 2020

核心思想:点动成线,线动成面。

以下图为例,要求填充扇子的扇面部分。

Python实现不规则图形填充的思路

一、绘制扇子:

首先要弄清楚它的结构,即能够用代码把扇子绘制出来。(只有先把不规则图形的结构分析清楚,才能进一步填充它。)

先画一个框架:

#调用的库
import math
import numpy as np
import matplotlib.pyplot as plt
#画图的基础设置
fig = plt.figure(1)
ax = fig.add_subplot(111)
plt.axis('off')
plt.axis('equal')
#画框架线条

#画两条圆弧
theta = np.arange(0.5*np.pi,np.pi,0.01)
for i in range(3):
  x = i * np.cos(theta)
  y = i * np.sin(theta)
  ax.plot(x,y,color='black',linewidth=0.7)
#画两条主扇骨
z = np.arange(0,2,0.01)
ax.plot(z * math.cos(math.pi/2), z * math.sin(math.pi/2), color='black',linewidth=0.7)
ax.plot(z * math.cos(math.pi), z * math.sin(math.pi), color='black',linewidth=0.7)

如图:

Python实现不规则图形填充的思路

再把扇子细节部分画出来:

#画10根扇骨
z = np.arange(0,1,0.01)
for i in range(11):
  ax.plot(z * math.cos(math.pi/2+i/10*math.pi/2), z * math.sin(math.pi/2+i/10*math.pi/2), color='black',linewidth=0.7)
#扇面分割为20小份
z = np.arange(1,2,0.01)
for i in range(0,21):
  ax.plot(z * math.cos(math.pi/2+i/20*math.pi/2), z * math.sin(math.pi/2+i/20*math.pi/2), color='black',linewidth=0.7)

这样就可以得到最开始的“素扇子”。

至此,我们也弄清了扇子的“数据”,扇面部分取1/4圆,扇骨部分通过np.arange()函数,把步长设置为0.01即可以创建一条半径,然后通过角度的正余弦变化构建扇骨,从而绘制出整个扇子。

二、填充扇子:

思路:如果两根扇骨的距离足够小,小到人眼难以分辨,当不同颜色的扇骨铺满扇面,就可以实现扇面的颜色填充。

#涂颜色
#选取一个涂色卡
color = ['#cde8f3','#91cfc9','#6bb3c0','#4198b9','#1e5670',
    '#2d4e76','#99bcdd','#c4e5ef','#f3fafa','#bbabd0',
    '#a16e8a','#643f5a','#cfbeb7','#f1ead7','#e99a9a',
    '#e67b79','#f7cece','#eec9bc','#e1f1ea','#91c7c2']

#点动成线
z = np.arange(1.005, 2, 0.01)#边缘修正0.005,露出扇子轮廓

#线动成面
I = np.arange(0,20,0.01)
for i in I:
  ax.plot(z * math.cos(math.pi/2+i/20*math.pi/2), z * math.sin(math.pi/2+i/20*math.pi/2), color=color[int(i)],linewidth=0.7,alpha=0.5)

如图所示:

Python实现不规则图形填充的思路

以上是我在实践过程中遇到无法使用Python库函数填充图形时采取的办法,该方法很好的诠释了数学中“点动成线,线动成面”的思想,仅提供参考,无普适价值。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python合并多个装饰器小技巧
Apr 28 Python
微信跳一跳python辅助软件思路及图像识别源码解析
Jan 04 Python
快速了解python leveldb
Jan 18 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
Tensorflow 查看变量的值方法
Jun 14 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
python redis连接 有序集合去重的代码
Aug 04 Python
python模块和包的应用BASE_PATH使用解析
Dec 14 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
python之MSE、MAE、RMSE的使用
Feb 24 Python
使用matlab 判断两个矩阵是否相等的实例
May 11 Python
让你相见恨晚的十个Python骚操作
Nov 18 Python
Python ORM编程基础示例
Feb 02 #Python
Python 面向对象之类class和对象基本用法示例
Feb 02 #Python
flask 框架操作MySQL数据库简单示例
Feb 02 #Python
python orm 框架中sqlalchemy用法实例详解
Feb 02 #Python
使用Python操作ArangoDB的方法步骤
Feb 02 #Python
详解有关PyCharm安装库失败的问题的解决方法
Feb 02 #Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 #Python
You might like
现磨咖啡骗局!现磨咖啡=新鲜咖啡?现磨咖啡背后的猫腻你不懂!
2019/03/28 冲泡冲煮
PHP实现下载功能的代码
2012/09/29 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
PHP常用字符串函数用法实例总结
2020/06/04 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
JavaScript 学习笔记(十四) 正则表达式
2010/01/22 Javascript
Safari5中alert的无限循环BUG
2011/04/07 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
微信 jssdk 签名错误invalid signature的解决方法
2019/01/14 Javascript
jQuery操作cookie的示例代码
2019/06/05 jQuery
关于uniApp editor微信滑动问题
2021/01/15 Javascript
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
python+django快速实现文件上传
2016/10/24 Python
Python学习笔记之open()函数打开文件路径报错问题
2018/04/28 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
浅谈Django的缓存机制
2018/08/23 Python
ActiveMQ:使用Python访问ActiveMQ的方法
2019/01/30 Python
详解Python绘图Turtle库
2019/10/12 Python
Python关于反射的实例代码分享
2020/02/20 Python
Antonioli美国在线商店:时尚前卫奢华
2019/07/29 全球购物
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
大学生水文观测实习自我鉴定
2013/09/29 职场文书
建筑专业毕业生推荐信
2013/11/21 职场文书
上课迟到检讨书
2014/02/19 职场文书
党校培训自我鉴定范文
2014/03/20 职场文书
公司市场部岗位职责
2015/04/15 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
政协常委会议主持词
2015/07/03 职场文书
springboot利用redis、Redisson处理并发问题的操作
2021/06/18 Java/Android