前言
关键词: 回旋图形,泰森多边形(Voronoi),Processing,Python,生成艺术
由于专栏暂时不支持文章位置跳转,为方便大家阅读,可Crtl/Command + F搜索以下关键词跳转到对应位置。
0. 成品展示
1. Processing + Python
1.1 WHY
1.2 Hello World:第一次握手
2. 生成回旋子多边形
3. 多边形分割
3.1 泰森多边形 (Voronoi Diagram)
3.2 随机点坐标的生成和命名规则
3.3 泰森多边形裁剪
3.4 填充回旋子多边形 (完结)
3.5 Bonus: 递归泰森图
4. 读者作品
1.1 WHYp>
1.2 Hello World: 第一次握手
部署本地Python服务端
该项目Python后端开发使用的框架是FastAPI。在Python3.6+的环境下,需要安装fastapi和uvicorn两个框架。
接下来我们创建一个新文件,命名为“server.py”,并复制如下代码
在终端执行python server.py后,我们就能通过在浏览器中输入“127.0.0.1:5699”得到返回结果(图1-3)。
如果不成功,请不要灰心,我会在置顶评论中提供该项目源码。如果你对该项目有任何问题或建议,可以发送到评论区、私信或Issue。
为了灵活地控制子多边形的形态,我定义了以下4个参数:displacement_f: 子多边形节点相对于父多边形各边长度位移的比例
displacement: 子多边形在父多边形各边上位移的距离
min_area: 子多边形的最小面积
max_iter: 子多边形最多个数
动画演示(图2-1):
因此,我们需要在多边形顶点数量过多时删除一些顶点,幸运的是,Shapely库的simplify函数可以达到该目的: 移除掉多余的顶点后,我们能得到以下结果(图2-3)
3. 多边形分割
3.1 泰森多边形 (Voronoi Diagram)
本项目主要使用泰森法分割画板多边形。生活中,泰森多边形无处不在,王八壳、碎玻璃、石墙、哈密瓜皮、泥地甚至蜥蜴的皮肤上都有泰森多边形的特征(图3-2)。
根据上图(图3-3)我们可以大致推测出使用每个库构建泰森多边形的时间复杂度:Scipy
经过将近2个小时的debug,我终于发现了端倪:scipy.spatial.Voronoi会使用-1这个索引来表示处于无限远的顶点,但该索引下储存的点坐标毫无意义 – 该坐标的索引仅用于告诉scipy不要将无限远的顶点考虑到计算中。解决办法也很简单:在points中添加四个划定画板边界的点,且regions中不再考虑包含-1索引的多边形(图3-5)。
以上就是该项目制作的完整过程,欢迎补充。
3.5 Bonus: 递归泰森图
前面的方法中我们讲了如何根据给定的画板区域裁剪泰森多边形,那如果我们以泰森多边形的每个子多边形为画板,在其内部再次生成新的泰森多边形,如此往复呢将会得到下面的结果(图3-7、图3-8)
代码和制作思路我会近期投稿到新的专栏,请各位耐心等待。
文章知识点与官方知识档案匹配,可进一步学习相关知识Python入门技能树首页概览214541 人正在系统学习中 相关资源:WPE封包软件- 络监控工具类资源-CSDN文库
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!