Python绘制正二十面体

news2025/1/8 12:04:32

文章目录

    • 正二十面体的顶点
    • 绘制棱
    • 绘制面

正二十面体的顶点

正20面体的12个顶点刚好可以分为三组,每一组都是一个符合黄金分割比例的长方形,而且这三个长方形是互相正交的。

所以,想绘制一个正二十面体是比较容易的

import numpy as np
from itertools import product
G = (np.sqrt(5)-1)/2
def getVertex():
    pt2 =  [(a,b) for a,b in product([1,-1], [G, -G])]
    pts =  [(a,b,0) for a,b in pt2]
    pts += [(0,a,b) for a,b in pt2]
    pts += [(b,0,a) for a,b in pt2]
    return np.array(pts)

xs, ys zs = getVertex().T
ax = plt.subplot(projection='3d')
ax.scatter(xs, ys, zs)
plt.show()

得到顶点

在这里插入图片描述

绘制棱

接下来将这些顶点连接成线,由于总共只有12个顶点,所以两两相连,也不至于导致运算量爆炸。另一方面,正二十面体的边长是相同的,而这些相同的边连接的也必然是最近的点,所以接下来只需建立顶点之间的距离矩阵,然后将距离最短的线抽出来即可。

def getDisMat(pts):
    N = len(pts)
    dMat = np.ones([N,N])*np.inf
    for i in range(N):
        for j in range(i):
            dMat[i,j] = np.linalg.norm([pts[i]-pts[j]])
    return dMat

pts = getVertex()
dMat = getDisMat(pts)
# 由于存在舍入误差,所以得到的边的数值可能不唯一
ix, jx = np.where((dMat-np.min(dMat))<0.01)

接下来,绘制正二十面体的棱

edges = [pts[[i,j]] for i,j in zip(ix, jx)]

ax = plt.subplot(projection='3d')
for pt in edges:
    ax.plot(*pt.T)

plt.show()

效果如图所示

在这里插入图片描述

绘制面

当然,只是有棱还显得不太好看,接下来要对正二十面体的面进行上色。由于三条棱构成一个面,所以只需得到所有三条棱的组合,然后判定这三条棱是否可以组成一个三角形,就可以获取所有的三角面。当然,这一切的前提是,正二十面体只有30个棱,即使遍历多次,也无非27k的计算量,是完全没问题的。

def isFace(e1, e2, e3):
    pts = np.vstack([e1, e2, e3])
    pts = np.unique(pts, axis=0)
    return len(pts)==3

from itertools import combinations
faces = [es for es in combinations(edges, 3) 
    if isFace(*es)]

接下来绘制一下

ax = plt.subplot(projection='3d')
for f in faces:
    pt = np.unique(np.vstack(f), axis=0)
    try:
        ax.plot_trisurf(*pt.T)
    except:
        pass

plt.show()

如图所示

在这里插入图片描述

由于plot_trisurf的画图逻辑是,先绘制xy坐标系上的三角形,然后再以此为三角形建立z轴坐标。所以这会导致一个Bug,即所绘制的三角面不能垂直于xy坐标系,为了让正二十面体被完整地绘制出来,可以对其绕着x和y轴旋转一下,当然首先要建立一个旋转矩阵。三维空间中的旋转矩阵如下表所示。详情可参考博客:Python动态演示旋转矩阵的作用

R x ( θ ) R_x(\theta) Rx(θ) R x ( θ ) R_x(\theta) Rx(θ) R x ( θ ) R_x(\theta) Rx(θ)
[ 1 0 0 0 C θ − S θ 0 S θ C θ ] \begin{bmatrix}1&0&0\\0&C_\theta&-S_\theta\\0&S_\theta&C_\theta\\\end{bmatrix} 1000CθSθ0SθCθ [ C θ 0 S θ 0 1 0 − S θ 0 C θ ] \begin{bmatrix}C_\theta&0 &S_\theta\\0&1&0\\-S_\theta&0&C_\theta\\\end{bmatrix} Cθ0Sθ010Sθ0Cθ [ C θ S θ 0 − S θ C θ 0 0 0 1 ] \begin{bmatrix}C_\theta &S_\theta&0\\-S_\theta&C_\theta&0\\0&0&1\end{bmatrix} CθSθ0SθCθ0001

写成代码为

# 将角度转弧度后再求余弦
cos = lambda th : np.cos(np.deg2rad(th))
sin = lambda th : np.sin(np.deg2rad(th))

# 即 Rx(th) => Matrix
Rx = lambda th : np.array([
    [1, 0,       0],
    [0, cos(th), -sin(th)],
    [0, sin(th), cos(th)]])
Ry = lambda th : np.array([
    [cos(th),  0, sin(th)],
    [0      ,  1, 0],
    [-sin(th), 0, cos(th)]
])

然后绘图函数

ax = plt.subplot(projection='3d')
for f in faces:
    pt = np.unique(np.vstack(f), axis=0)
    pt = Rx(1)@Ry(1)@pt
    ax.plot_trisurf(*pt.T, alpha=0.9)

for pt in edges:
    ax.plot(*pt.T, lw=2, color='blue')

plt.show()

效果如下

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大环配体配合物1407166-70-4,NODA-GA-NHS ester,NODA-GA-NHS 酯

●外观以及性质&#xff1a; NODA-GA-NHS ester产物呈固体或粘性液体&#xff0c;取决于PEG分子量&#xff0c;一般为白色固体&#xff0c;双功能大环化合物&#xff0c;大环配体配合物是指由多齿配体与环骨架上的O、N、P、S等多个配位原子形成的环配合物。 NODA-GA-NHS ester …

前端面试题2022-CSS篇

关于前端面试的题&#xff0c;最近整理了一些干货&#xff0c;经常被问到的一些问题&#xff0c;出现频率比较高的问题&#xff0c;如有不足之处&#xff0c;请高调指出&#xff0c;&#xff08;⭐代表难度&#xff0c;星星越多越难&#xff0c;以次类推&#xff09;&#xff0…

如何自动备份指定文件扩展名的文件?

关于文件扩展名 文件扩展名&#xff0c;一个点后跟几个字母&#xff0c;例如“.doc”或“.jpg”&#xff0c;构成计算机文档名称的结尾。保存文档时&#xff0c;请务必在单击“保存”之前输入文档名称和文件扩展名。 自动备份具有特定文件扩展名的文件 随着计算机的使用&…

第十章 鲁棒性检查(中)

文章目录10.5 时钟门控检查(Clock Gating Checks)高电平时钟门控(Active-High Clock Gating)10.5 时钟门控检查(Clock Gating Checks) 当一个门控信号&#xff08;gating signal&#xff09;可以控制逻辑单元中时钟信号&#xff08;clock signal&#xff09;的路径时&#xff…

最近面试遇到的面试题

先挖坑&#xff0c;有空再填坑&#xff01; 迭代器 生成器 常用高阶函数 MySQL 建索引几大原则 浅拷贝 深拷贝 区别 实现 Linux 进程名字 查看进程号 Linux 杀死一个进程 python Linux shell 脚本 数据库 主从复制 配置 nginx 权限设置 python 去除空行 pandas 保留最后一个空…

深入浅出 Swift 中的 some、any 关键字以及主关联类型(primary associated types)

问题现象 从 Swift 5.1 开始,Apple 陆续引入 some、any 关键字,并且从 Swift 5.7 开始对 any 关键字的用法做了增强,并且引入了主关联类型(primary associated types)的概念。 那么它们到底是什么意思?使用它们又能如何改进我们书写代码的范儿呢? 在本篇博文中,您将学…

自动依据你的数据库生成SQL练习题及答案,宝藏软件鉴赏

原创软件不易&#xff0c;方面多点赞、收藏、加关注鼓励&#xff01;后续领更多好用功能&#xff01; 引言 各位好&#xff0c;相信看见这篇文章的朋友&#xff0c;应该也去体验过了chatGPT了吧~&#xff0c;确实chatGPT拉近了我们与未来科技的距离&#xff0c;所有别人火也是…

电脑技巧:Microsoft Edge浏览器技巧介绍

目录 1、导入浏览器数据 2、Edge边栏 3、实用的扩展功能 4、创建集锦列表 4.1 集锦的作用 4.2 使用方法 5、查找优惠券 6、Edge效率省电模式 Microsoft Edge是Windows10操作系统预装的一款非常棒的浏览器和之前的IE不同&#xff0c;采用了谷歌浏览器内核&#xff0c;相…

项目的成功标准如何衡量?【一杯咖啡谈项目】

每个项目经理都想自己的项目能够成功&#xff0c;但是&#xff0c;什么才叫项目的成功&#xff0c;成功的定义是什么&#xff1f;项目成功标准是什么呢&#xff1f; 很多看似失败的项目其实是成功的&#xff0c;很多看似成功的项目其实是失败的。研究项目成功的标准&#xff0…

Chrome 扩展插件:如何开始一个插件的开发

欢迎点击查看个人站首发原文&#xff0c;访问个人站获取更多插件编程知识。 Chrome扩展插件基础是基于前端htmljs开发&#xff0c;然后通过官方提供的项目结构进行开发&#xff0c;需要注意的是&#xff0c;目前Chrome已经支持Manifest V3&#xff0c;FireFox仅仅支持Manifest …

【大数据入门核心技术-Impala】(一)Impala简介

目录 一、Impala介绍 二、Impala优势 三、Impala主要功能 一、Impala介绍 Impala是Cloudera公司主导开发的新型查询系统&#xff0c;它提供SQL语义&#xff0c;能查询存储在Hadoop的HDFS和HBase中的PB级大数据。已有的Hive系统虽然也提供了SQL语义&#xff0c;但由于Hive底层…

代码详细教程+文档+PPT+源码等]SSM框架美妆商城全套|电商购物计算机专业毕业论文java毕业设计网站

&#x1f496;&#x1f496;更多项目资源&#xff0c;最下方联系我们✨✨✨✨✨✨ 目录 Java项目介绍 资料获取 Java项目介绍 计算机毕业设计java毕设之SSM美妆商城项目源码_哔哩哔哩_bilibili项目资料网址: http://itzygogogo.com软件下载地址:http://itzygogogo.com/itsz…

[附源码]Python计算机毕业设计SSM基于框架的在线健康系统设计与实现(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

DRF和vue跨域问题的解决

跨域不一定都会有跨域问题&#xff1a; 因为跨域问题是浏览器对于ajax请求的一种安全限制&#xff1a;一个页面发起的ajax请求&#xff0c;只能是与当前页域名相同的路径&#xff0c;这能有效的阻止跨站攻击。因此&#xff0c;跨域问题 是针对ajax的一种限制。 但是这却给我们…

Birdboot第二天 Request Response

目录 V4 HttpServletRequest保存请求内容 1.此类专门处理请求 把获取请求的readline()和拆分代码移动过来 2.ClientHandler客户端处理器实例化HttpServletRequest 3. 拆分的信息从局部变量 变成属性 4.建方法 解析请求行 消息头 消息正文 V5 发送响应 1.在客户端处理器 …

BI智慧仓储,带你体验数字化仓储物流管理

1、行业背景 智能仓储物流是以信息交互为主线&#xff0c;使用条形码、射频识别、传感器、全球定位系统等先 进的物联网技术&#xff0c;集成自动化、信息化、人工智能技术&#xff0c;通过信息集成、物流全过程优化 以及资源优化&#xff0c;使物品运输、仓储、配送、包装、装…

【小f的刷题笔记】(JS)链表 - 合并 k 个有序链表 LeetCode23 - 顺序合并暴力三种方法

【链表】 合并 k 个有序链表&#xff1a; &#x1f31f; 想办法从一堆节点中找到最小的那个节点 看了很多题解&#xff0c;主要是以下四种方法&#xff08;优先队列我还没有写出来&#xff0c;先遗留着&#xff09;&#xff1a; ✔ 顺序合并 ✔ 分治合并&#xff08;归并&a…

【单片机】矩阵键盘/定时器

目录 一、矩阵键盘 1、矩阵按键原理 1.1工作方式 1.2工作原理 1.3单片机IO口 2、矩阵键盘数字显示代码 3、矩阵键盘密码锁 二、定时器&#xff08;工作模式1&#xff09; 1、定时器的原理 2、寄存器 2.1模式选择寄存器TMOD&#xff08;不可位寻址&#xff09; 2.2…

CentOS 搭建 WordPress 站点

博客链接:https://www.aiiyx.cn 内容纲要 1. 版本相关2. 主要内容3. 安装并配置 PHP4. 安装并配置 WordPress5. 配置 Nginx6. 配置 MySQL7. 初始化 WordPress 1. 版本相关 WordPress 版本 5.9.3PHP 版本 8.1MySQL 版本 5.7Nginx 版本 1.18 2. 主要内容 由于我的 CentOS 服务…

ChatGPT:将你的微信变成智能聊天机器人!

天天用微信的你有没有做个这样一种设想&#xff1a;让最先进的人工智能算法帮你聊天! 这机器人可以回答各种问题&#xff0c;上知天文下知地理&#xff0c;甚至还能写代码。无论是哄女朋友&#xff0c;应付老婆&#xff0c;或者勾搭陌生小姐姐&#xff0c;都能做到24小时在线&…