Python画3D足球2

news2024/11/14 19:06:20

文章目录

    • 前情提要
    • 补点
    • 球形膨胀

前情提要

足球是正五边形和正六边形拼接而成,由此形成的骨架结构,可通过切割正二十面体获得,所以画足球的第一步是画正二十面体:Python绘制正二十面体

在学会绘制正二十面体之后,就可以通过切割顶点从而得到足球的骨架:用Python画一个足球

在这里插入图片描述

补点

尽管通过对正二十面体削角得到了足球,但这个足球有个非常明显的问题,就是踢不动。接下来,就要想办法将这个足球"吹"圆。

好在最初创建正二十面体的时候,便以原点为中心,所以一个显而易见的方案就是,将足球上的点向外膨胀到球的半径长度。

然而这个时候问题又来了,这个足球总共有60个顶点,每个顶点到圆心的距离都是恒定的,换言之,就算将其膨胀一下,也无非是等比例地将这个足球放大而已,所以问题的第一步,就是对足球补点。

在补点之前,先把正六边形和正五边形的点提取出来。

# 此为五边形面的顶点
penPts = getPtEdges(pts, edges)
# 此为六边形面的顶点
hexPts = [getHexEdges(f) for f in faces]

然后进行补点操作,其方法非常简单,以六边形为例,任选六边形的两个顶点,二者连线后,对线段进行五等分,然后将五等分处的四个点提取出来,就算是点被提取了。

from itertools import combinations
# N表示等分点数
def getMorePts(pts, N=5):
    morePts = []
    for p1, p2 in combinations(pts, 2):
        morePts += [(i*p1+(N-i)*p2)/N for i in range(N)]
    return np.unique(morePts,axis=0)

penMorePts = [getMorePts(pt) for pt in penPts]
hexMorePts = [getMorePts(pt) for pt in hexPts]

接下来绘制一下,

ax = plt.subplot(projection='3d')
for pt in hexMorePts:
    pt = Rx(1)@Ry(1)@pt.T
    ax.plot_trisurf(*pt, color="white")

for pt in penMorePts:
    pt = Rx(1)@Ry(1)@pt.T
    ax.plot_trisurf(*pt, color="black")

ax.axis('off')
plt.show()

效果为

在这里插入图片描述

球形膨胀

补点操作当然不足以让图形变圆,接下来才是见证奇迹的时刻。

其实方法也非常简单,无非对足球上的点进行归一化而已,将所有点到圆心的距离变为某个定值,简单起见,这里暂且设为1。

ptNorm = lambda pts : np.array([p/np.linalg.norm(p) for p in pts])
hexBallPts = [ptNorm(pts) for pts in hexMorePts]
penBallPts = [ptNorm(pts) for pts in penMorePts]

接下来,就是激动人心的画图环节,但这里又涉及到plot_trisurf绘图逻辑引入的Bug,即对于 z > 0 z>0 z>0 z < 0 z<0 z<0的两个区域,plot_trisurf优先连接 x , y x,y x,y相近的位置。

def splitPtByZ(pts):
    zs = pts[:,2]
    if min(zs) > 0 or max(zs) < 0:
        return [pts]
    indPlus = np.where(zs>-0.1)[0]
    indMinus = np.where(zs<0.1)[0]
    indMid = np.where((zs>-0.1) & (zs<0.1))[0]
    return [pts[indPlus], pts[indMid], pts[indMinus]]
    

ax = plt.subplot(projection='3d')
for pt in hexBallPts:
    ptDraw = splitPtByZ(pt)
    for p in ptDraw:
        ax.plot_trisurf(*p.T, color="white")

for pt in penBallPts:
    ptDraw = splitPtByZ(pt)
    for p in ptDraw:
        ax.plot_trisurf(*p.T, color="black")

ax.axis('off')
plt.show()

效果如图所示

在这里插入图片描述

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

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

相关文章

【JavaWeb开发-Servlet】老人言随机语录

需求&#xff1a;点击网页按钮随机显示一句话&#xff1a; 1、内容涵盖&#xff1a; 老人言、励志语录、名言名言、一句情话 2、设计要求&#xff1a; 以老人言为例&#xff1a;①在数据库创建一张表&#xff0c;存放老人言经典语录。字段包括&#xff1a;id、sentence。id为in…

腾讯云特惠专区——永久有效

腾讯云—腾讯倾力打造的云计算品牌,以卓越科技能力助力各行各业数字化转型,为全球客户提供领先的云计算、大数据、人工智能服务,以及定制化行业解决方案和提供可靠企业上云服务。 购买腾讯云的优势是新用户特别便宜;国内访问速度快;个人认证可秒过;缺点是:网站内容或者…

论文投稿指南——中文核心期刊推荐(机械、仪表工业)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384;&#x1f388; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff…

java计算机毕业设计ssm医院预约挂号系统b9971(附源码、数据库)

java计算机毕业设计ssm医院预约挂号系统b9971&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

C# 运算符与表达式

一 运算符 ① 算术运算符&#xff1a;、-、、/、%、、–; ② 关系运算符&#xff1a;>,<,>,<,,!; ③ 逻辑运算符&#xff1a;!,&,|,^,&&,||; ④ 位运算符&#xff1a;&,|,^,~,>>,<<; ⑤ 赋值运算符&#xff1a; 扩展赋值运算符&#…

ESP32 ESP-IDF LVGL8.3.3移植

陈拓 2022/11/27-2022/12/10 1. 概述 在《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示》 ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示_晨之清风的博客-CSDN博客_esp32 tftlcd在ESP32开发框架ESP-IDF中用LVGL库驱动TFT-LCD(ST7735 128x160) 显示屏演示GUIhttps://bl…

游戏开发46课 性能优化5

3. CPU优化 性能优化最主要的一部分工作是CPU&#xff0c;CPU性能优化好了&#xff0c;离目标就成功了一半。 3.1 缓存计算结果 缓存计算是空间换时间的经典应用&#xff0c;它适用于那些耗费大量CPU计算而计算结果无需每帧变化的逻辑。实现伪代码&#xff1a; std::map<…

【Redis场景1】用户登录注册

细节回顾&#xff1a; 关于cookie和session不熟悉的朋友&#xff1b; 建议阅读该博客&#xff1a;https://www.cnblogs.com/ityouknow/p/10856177.html 执行流程&#xff1a; 在单体模式下&#xff0c;一般采用这种模式来存储&#xff0c;传递、认证用户登录、注册等信息&…

阿里巴巴最新推出王者笔记:“Spring MVC 源码与实践”

前言&#xff1a; Spring MVC 是 Spring 框架中用于 Web 应用快速开发的一个模块。Spring MVC 的 MVC 是 Model-View-Contoller 的缩写。它是一个广泛应用于图形化用户交互开发中的设计模式&#xff0c;不仅常见于 Web 开发&#xff0c;也广泛应用于如 Swing 和 JavaFX 等桌面…

Java知识要点

第1章 Java概述 重要特性&#xff1a; Write Once Run Anyway 简单性&#xff1a;相比C移除指针、运算符重载、多重继承等&#xff0c;垃圾自动回收。 平台无关性&#xff1a;Java引进虚拟机&#xff08;JVM&#xff0c;Java Virtual Machine&#xff09;概念。 安全性&am…

论文推荐:Rethinking Attention with Performers

重新思考的注意力机制&#xff0c;Performers是由谷歌&#xff0c;剑桥大学&#xff0c;DeepMind&#xff0c;和艾伦图灵研究所发布在2021 ICLR的论文已经超过500次引用 传统的Transformer的使用softmax 注意力&#xff0c;具有二次空间和时间复杂度。Performers是Transformer…

常用射频器件性能指标

IFM&#xff08;Instantaneous FrequencyMeasurement&#xff09;&#xff1a;瞬时测频接收机&#xff1b; SOC&#xff08;System on Chip&#xff09;&#xff1a;片上系统&#xff0c;可独立实现接收机功能&#xff1b; AIU&#xff1a;前端 一、放大器关键参数 1.1 -1dB压…

如何选择好的软件测试技术?

软件测试技术是指测试软件或软件一部分的方法或方式。每种测试技术都有其自身的优势。不同的技术针对不同类型的缺陷。因此&#xff0c;说一种技术是最好的是错误的。根据软件及其要求&#xff0c;一种测试技术可能比另一种更适合用于该目的。有时&#xff0c;结合使用不同的测…

安卓APP源码和设计报告——魔幻相机

课程设计报告书 Android大作业 学 院 计算机科学与工程学院 专 业 计算机科学与技术一班 学生姓名 小组成员 学生学号 指导教师 课程编号 课程学分 起始日期 教师评语 教师签名&#xff1a;日期&#xff1a; 成绩评定 备注 Android大作业 魔幻相机 一、选题背景 据统计&am…

[激光原理与应用-47]:《焊接质量检测》-4-普雷茨特激光焊接过程监控系统LWM分析

目录 第1章 激光焊接过程监控系统LWM概述 第2章 产品特性与功能 2.1 生产相关的信息 2.2 原始信息检测 2.3 焊接质量分析信息 2.4 缺陷报告与生产控制 2.5 LWM给客户带来的好处 2.6 适用范围 2.7 人机界面 (HMI) 第3章 焊接质量检测的原理 3.1 基本原理 3.2 技术规…

excel_阻止常数值串以科学计数法显示@数据分列@空格分隔符号分列数据

文章目录excel_阻止常数值串以科学计数法显示WPS设置某列的数据显示格式核心步骤数据-分列选择分割符设置文本类型收尾工作数据居中Office-Excelexcel_阻止常数值串以科学计数法显示 WPS 设置某列的数据显示格式 核心步骤 如果您的数据是普通数据,那么类型框里输入0就可以了…

太忙,没时间学?在职人员如何高效备考MBA?

对于很多在职人员来说&#xff0c;想要进一步深造提升学历&#xff0c;备考MBA无疑是个不错的选择。但近几年随着MBA考生人数的增长&#xff0c;其竞争也愈加激烈。因此想要取得好的成绩&#xff0c;成功上岸&#xff0c;不仅仅需要持续不断的努力&#xff0c;时间的科学管理和…

机器人与视觉,基于TCP(工具坐标)偏移

基于工具坐标系的移动偏转。 基于TCP旋转的特点在于&#xff0c;具有1个固定端点&#xff0c;多个活动端的特点。 我们在建立TCP左边偏移的时候&#xff0c;可以将2个点近似的模拟在同一个坐标系下 基于TCP偏转的特点在于&#xff0c;工作的时候&#xff0c;示教点与工作点的位…

CSS -- 03. CSS盒子模型

文章目录盒子模型1 盒子模型1.1 看透网页的本质1.2 盒子模型组成1.3 边框1.4 表格的细线边框1.5 边框会影响盒子实际大小1.6 内边距&#xff08;padding&#xff09;1.7 外边距&#xff08;margin&#xff09;1.8 外边距合并1.9 清除内外边距2 圆角边框3 盒子阴影4 文字阴影盒子…

netfilteriptables探讨(4)——nat的实现与使用

在之前的几篇文章中&#xff0c;我们讨论了netfilter与iptables的实现原理与基本用法。在netfilter&iptables的各种使用场景中&#xff0c;nat是最常用也是最复杂的用法之一。许多常用的网络使用模式都是通过nat iptables规则实现的&#xff0c;例如docker默认的bridge网络…