使用plotly dash 画3d圆柱(Python)

plotly3D (3d charts in Python)可以画3维图形

在做圆柱的3D装箱项目,需要装箱的可视化,但是Mesh (3d mesh plots in Python)只能画三角形,所以需要用多个三角形拼成一个圆柱(想做立方体的可视化,可以进入使用plotly dash 画3d立方体_python 3d绘图立方体-CSDN博客):

1 画上下底面的边线:因为只能画直线,所以只能用n边形代替圆(我感觉30-50就足够了)

# 找圆柱底边 num_points 个点 
def to_cylinder_point(cylinder:Cylinder):print(cylinder)# 设置圆形参数num_points = 30  # 圆形上的点的数量# 计算圆上的点的坐标theta = np.linspace(0, 2 * np.pi, num_points)x = cylinder.coordinate[0] + cylinder.radius * np.cos(theta)y = cylinder.coordinate[1] + cylinder.radius * np.sin(theta)z_underside = np.full(num_points, cylinder.coordinate[2])  z_top = np.full(num_points, cylinder.coordinate[2]+cylinder.height)return x,y,z_underside,z_top
# 画出下底边的轮廓
fig.add_scatter3d(x=x, y=y, z=z_bottom, mode="lines", line={'color': 'black', 'width': 2})

2 拼上下底面:以上下底面圆心为中心,上一步计算出来的“圆柱底边 num_points 个点”做边画三角形。

        # 将圆心插入首位b_x = np.insert(x,0,p.coordinate[0])b_y =np.insert(y,0,p.coordinate[1])b_z = np.insert(z_bottom,0,p.coordinate[2])t_z = np.insert(z_top, 0, p.coordinate[2] + p.height)i, j, k = to_planes(len(b_x))# 画底面fig.add_mesh3d(x=b_x,y=b_y,z=b_z,i=i,j=j,k=k,color='pink')# 画顶面fig.add_mesh3d(x=b_x,y=b_y,z=t_z,i=i,j=j,k=k,color='pink')

3 拼侧面:以上一步计算出来的 上下“圆柱底边 各num_points 个点”做边画三角形。

        s_x = np.concatenate((x,x))s_y = np.concatenate((y,y))s_z = np.concatenate((z_top,z_bottom))ii, jj, kk = to_side(len(s_z))# 画侧面fig.add_mesh3d(x=s_x,y=s_y,z=s_z,i=ii,j=jj,k=kk,color='pink')

所有代码:

import plotly.graph_objects as go
import numpy as np
import mathclass Cylinder:def __init__(self, name, diameter,height,num = 0):self.name = nameself.diameter = int(diameter)self.radius = int(diameter/2)self.height = int(height)self.num = numself.coordinate = Nonedef cylinder_copy(cylinder:Cylinder,height):new_cylinder = Cylinder(cylinder.name,cylinder.diameter,cylinder.height,cylinder.num)new_cylinder.coordinate = cylinder.coordinate+[height]return new_cylinderclass Box:def __init__(self, name, long,wide,height):self.name = nameself.long = int(long)self.wide = int(wide)self.height = int(height)def toline(cx,cy,cz):# 通过立方体的8个顶点,画出立方体的轮廓.cx(x轴8个坐标)x = [cx[0],cx[1],cx[2],cx[3],cx[0],cx[4],cx[5],cx[1],cx[5],cx[6],cx[2],cx[6],cx[7],cx[3],cx[7],cx[4]]y = [cy[0],cy[1],cy[2],cy[3],cy[0],cy[4],cy[5],cy[1],cy[5],cy[6],cy[2],cy[6],cy[7],cy[3],cy[7],cy[4]]z = [cz[0],cz[1],cz[2],cz[3],cz[0],cz[4],cz[5],cz[1],cz[5],cz[6],cz[2],cz[6],cz[7],cz[3],cz[7],cz[4]]return x,y,zdef toxyz(begin,end):# 通过开始结束位置确定立方体的8个顶点#        0       1                2         3               4         5         6         7x = [begin[0],begin[0],end[0],end[0],begin[0],begin[0],end[0],end[0]]y = [begin[1],end[1],end[1],begin[1],begin[1],end[1],end[1],begin[1]]z = [begin[2],begin[2],begin[2],begin[2],end[2],end[2],end[2],end[2]]return x,y,z# 根据圆的边线,填满圆
def to_planes(n):ii=[]jj=[]kk=[]for v in range(1,n):ii.append(0)jj.append(v)if v+1>=n:kk.append(1)else:kk.append(v+1)return ii,jj,kk# 根据圆上下底面的边线,填满侧边
def to_side(n):ii=[]jj=[]kk=[]half = int(n/2)for i in range(half):ii.append(i)if i+1>=half:jj.append(0)else:jj.append(i+1)kk.append(i+half)if i+1>=half:ii.append(0)else:ii.append(i+1)jj.append(i+half)if i+half+1>=n:kk.append(half)else:kk.append(i+half+1)return ii,jj,kkdef to_cylinder_point(cylinder:Cylinder):print(cylinder)# 设置圆形参数num_points = 30  # 圆形上的点的数量# 计算圆上的点的坐标theta = np.linspace(0, 2 * np.pi, num_points)x = cylinder.coordinate[0] + cylinder.radius * np.cos(theta)y = cylinder.coordinate[1] + cylinder.radius * np.sin(theta)z_underside = np.full(num_points, cylinder.coordinate[2])  # 在 z 轴上的坐标都为圆心的 z 坐标z_top = np.full(num_points, cylinder.coordinate[2]+cylinder.height)  # 在 z 轴上的坐标都为圆心的 z 坐标return x,y,z_underside,z_topdef getfig(box:Box,position):box_xyz = toxyz([0, 0, 0], [box.long, box.wide, box.height])box_line = toline(box_xyz[0], box_xyz[1], box_xyz[2])fig=go.Figure(data=[go.Scatter3d(x=box_line[0],y=box_line[1],z=box_line[2],mode='lines',line={'color': 'black', 'width': 2})])for p in position:x, y, z_bottom, z_top = to_cylinder_point(p)# 画下底面的线fig.add_scatter3d(x=x, y=y, z=z_bottom, mode="lines", line={'color': 'black', 'width': 2})# 画顶面的线fig.add_scatter3d(x=x, y=y, z=z_top, mode="lines", line={'color': 'black', 'width': 2})b_x = np.insert(x,0,p.coordinate[0])b_y =np.insert(y,0,p.coordinate[1])b_z = np.insert(z_bottom,0,p.coordinate[2])t_z = np.insert(z_top, 0, p.coordinate[2] + p.height)i, j, k = to_planes(len(b_x))# 画底面fig.add_mesh3d(x=b_x,y=b_y,z=b_z,i=i,j=j,k=k,color='pink')# 画顶面fig.add_mesh3d(x=b_x,y=b_y,z=t_z,i=i,j=j,k=k,color='pink')s_x = np.concatenate((x,x))s_y = np.concatenate((y,y))s_z = np.concatenate((z_top,z_bottom))ii, jj, kk = to_side(len(s_z))# 画侧面fig.add_mesh3d(x=s_x,y=s_y,z=s_z,i=ii,j=jj,k=kk,color='pink')fig.update_layout(clickmode='event+select',# 设置xyz轴比例原本比例:draw axes in proportion to the proportion of their rangesscene_aspectmode='data',scene=dict(xaxis_title='x-长'+str(box.long)+'mm',yaxis_title='y-宽'+str(box.wide)+'mm',zaxis_title='z-高'+str(box.height)+'mm',xaxis=dict(backgroundcolor="rgb(230, 230,200)",gridcolor="white",showbackground=True,zerolinecolor="black", ),yaxis=dict(backgroundcolor="rgb(230, 230,200)",gridcolor="white",showbackground=True,zerolinecolor="black"),zaxis=dict(backgroundcolor="rgb(230, 230,200)",gridcolor="white",showbackground=True,zerolinecolor="black", ),),height=600,width=800,)return figcylinder = Cylinder('a',70,30)
cylinder.coordinate=[50+2*math.sqrt(3),70,10]box = Box('b',100,200,70)
fig = getfig(box,[cylinder])
fig.show()

代码结果展示:

多个圆柱展示:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站小程序分类目录网源码系统+会员注册登录功能 附带完整的搭建教程

随着互联网的发展,小程序分类目录网站已经成为了人们获取各类信息的重要渠道。而在这个领域中,罗峰给大家分享一款网站小程序分类目录网源码系统以其强大的功能和易用性,脱颖而出。本系统集成了会员注册登录功能,让用户能够更加便…

【git】git update-index --assume-unchanged(不改动.gitignore实现忽略文件)

文章目录 原因分析:添加忽略文件(取消跟踪)的命令:取消忽略文件(恢复跟踪)的命令:查看已经添加了忽略文件(取消跟踪)的命令: 原因分析: 已经维护的项目,文件已经被追踪,gitignore文件不方便修…

Layui + Echarts 5.0

Layui 怎么整合最新版本的 Echarts 5.0,Echarts 4 升级到 5后,有了很大改变,新的配置项4是无法兼容的,所以想要使用新的功能,都需要升级! 新建一个echarts.js文件 layui.define(function (exports) {// 这…

Optional lab: Linear Regression using Scikit-LearnⅠ

scikit-learn是一个开源的、可用于商业的机器学习工具包,此工具包包含本课程中需要使用的许多算法的实现 Goals In this lab you will utilize scikit-learn to implement linear regression using Gradient Descent Tools You will utilize functions from sci…

微服务技术总结

微服务! SrpingClound 微服务主要解决项目拆分后所产生的一系列问题。SpringClound主要解决服务的治理问题 单体VS分布式 单体:部署简单、成本低 缺点:服务耦合度高 2兼容1 服务拆分注意事项 远程调用分析 提供者:服务的提供方…

QT 使用XML保存操作记录

文章目录 1 实现程序保存操作记录的思路2 XML文档基本结构3 QDomDocument实现XML读写3.1 QDomDocument实现生成XML文件3.2 QDomDocument实现读取XML文件 4 QXmlStreamWriter实现读写4.1 QXmlStreamWriter实现生成XML4.2 QXmlStreamWriter实现读取XML 1 实现程序保存操作记录的思…

【大数据】Flink 架构(三):事件时间处理

《Flink 架构》系列(已完结),共包含以下 6 篇文章: Flink 架构(一):系统架构Flink 架构(二):数据传输Flink 架构(三):事件…

04.对象树

一、引入 1.QT实现输出"hello world" 使用QT编写"hello world"程序,有两种实现方式: (1)直接在生成的ui文件中,拖入一个label控件,双击控件编辑内容即可实现 (2&#xff0…

【CSS】flex布局用法解析,快速上手flex布局,flex:1是什么意思?肯定看的懂好吧?

一、flex布局 flex 是 flexible box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为 flex 布局。 采用 flex 布局的元素,称为 flex 容器(flex container),…

计算机视觉:高级图像处理,满足您的所有需求。

一、说明 特征提取是机器学习管道中的关键步骤,可增强模型在不同数据集上的泛化和良好表现能力。特征提取方法的选择取决于数据的特征和机器学习任务的具体要求。本文揭示图像处理的数学原理,实现增强的计算机视觉 二、关于计算机视觉的普遍问题 在计算机…

CSS基础细节学习

目录 一.CSS--网页的美容师 二.语法规范及选择器的介绍 一.CSS--网页的美容师 CSS是层叠样式表( Cascading Style Sheets )的简称,有时我们也会称之为CSS样式表或级联样式表。 CSS是也是一种标记语言,CSS主要用于设置HTML页面中的文本内容(字体、大小…

Linux:共享内存VS消息队列VS信号量

文章目录 共享内存的通信速度消息队列msggetmsgsndmsgrcvmsgctl 信号量semgetsemctl 内核看待ipc资源单独设计的模块ipc资源的维护 本篇主要是基于共享内存,延伸出对于消息队列和信号量,再从内核的角度去看这三个模块实现进程间通信 共享内存的通信速度…

2024 新年HTML5+Canvas制作3D烟花特效(附源码)

个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻‍❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…

RK3568 Android 13 系统裁剪

android 13 系统裁剪是个大工程,裁剪也是需要大量的测试,才能保证系统的稳定性,以下是RK官方给出的裁剪方案,有兴趣的可以去看一下,对裁剪不是要求过高的可以根据官方的建议,对系统进行裁剪: Rockchip And…

专科拿到季军:微茫星火,奋起直追!

Datawhale干货 作者:“不啻微茫”团队,季军方案 前 言 大家好,我们是 飞桨星河社区 X 智海Mo平台 AI 大模型创意应用大赛 获奖团队——"不啻微茫",很荣幸能有机会与大家分享这次比赛经验,我们从零开始的过程…

【CanvasKeyFrames - HTML5 Canvas 图片序列帧播放工具】

前言 一、CanvasKeyFrames 是什么&#xff1f; 用来做canvas动画的工具。 二、使用步骤 效果如图&#xff1a;上下波动的线条 1.引入库 代码如下&#xff08;示例&#xff09;&#xff1a; 在html中引入&#xff1a; <script src"canvas-keyframes.js"><…

【linux】运维-磁盘空间不足-用到的命令(简洁)

【linux】运维-磁盘空间不足-用到的命令 常用&#xff1a; 注&#xff1a;du -s 和 -d 不能同时都用, -s | -d n 注&#xff1a;df -H 和 -h 区别 -H 1K1000 -h 1K1024 #-T 显示文件系统类型 -h 高可读性显示 df -Th #-c显示总和 ;sort -r 倒序显示 ;2>/dev/nul…

LiveGBS流媒体平台GB/T28181常见问题-如何快速查看推流上来的摄像头并停止摄像头推流?

LiveGBS流媒体平台GB/T28181常见问题-如何快速查看推流上来的摄像头并停止摄像头推流&#xff1f; 1、负载信息2、负载信息说明3、会话列表查看3.1、会话列表 4、停止会话5、搭建GB28181视频直播平台 1、负载信息 实时展示直播、回放、播放、录像、H265、级联等使用数目 2、负…

蓝桥杯AT24C02问题记录

问题1&#xff1a;从这个图片上可以看出这两个在IIC的.c文件里延时时间不一样&#xff0c;第一张图使用了15个_nop_(); 12M晶振机器周期是 1/12M*121uS&#xff1b;nop()要延时1个指令周期。延时时间不对会对时序产生影响&#xff0c;时序不对&#xff0c;则AT24C02有没被使用…

时序分解 | MATLAB实现CEEMDAN+SE自适应经验模态分解+样本熵计算

时序分解 | MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算 目录 时序分解 | MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算效果一览基本介绍程序设计参考资料 效果一览 基本介绍 MATLAB实现CEEMDANSE自适应经验模态分解样本熵计算 包括频谱图 附赠案例数据 可直接运行 …