使用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.mzph.cn/news/655718.shtml

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

相关文章

Python qt.qpa.xcb: could not connect to display解决办法

遇到问题:qt.qpa.xcb: could not connect to display 解决办法,在命令行输入: export DISPLAY:0 然后重新跑python程序,解决! 参考博客:qt.qpa.xcb: could not connect to displayqt.qpa.plugin: Could …

Ubuntu搭建国标平台wvp-GB28181-pro

目录 简介安装和编译1.查看操作系统信息2.安装最新版的nodejs3.安装java环境4.安装mysql5.安装redis6.安装编译器7.安装cmake8.安装依赖库9.编译ZLMediaKit9.1.编译结果说明 10.编译wvp-GB28181-pro10.1.编译结果说明 配置1.WVP-PRO配置文件1.1.Mysql数据库配置1.2.REDIS数据库…

监听项目中指定属性数据,点击或模块显示时

当项目中,需要获取某个页面上、某个标签上、有指定自定义属性时,需要在点击该元素时进行公共逻辑处理,或该元素在显示的时候进行逻辑处理,这时可以定义一个公共的方法,在每个页面引用,并写入数据即可 &…

OpenHarmony RK3568 启动流程优化

目前rk3568的开机时间有21s,统计的是关机后从按下 power 按键到显示锁屏的时间,当对openharmony的系统进行了裁剪子系统,系统app,禁用部分服务后发现开机时间仅仅提高到了20.94s 优化微乎其微。在对init进程的log进行分析并解决其…

面向云服务的GaussDB全密态数据库

前言 全密态数据库,顾名思义与大家所理解的流数据库、图数据库一样,就是专门处理密文数据的数据库系统。数据以加密形态存储在数据库服务器中,数据库支持对密文数据的检索与计算,而与查询任务相关的词法解析、语法解析、执行计划生…

跨境ERP定制趋势预测:数字化转型助您赢得市场先机

随着全球贸易的不断融合和发展,跨境业务已成为许多企业拓展市场的重要途径。在这个背景下,ERP定制正逐渐成为企业数字化转型的关键利器。本文将为您预测跨境ERP定制的趋势,并探讨数字化转型如何助您赢得市场先机。 ERP定制趋势预测 1. 数据…

命令行启动Android Studio模拟器

1、sdk路径查看(打开Android Studio) 以上前提是安装的Android Studio并添加了模拟器!!! 2、复制路径在终端进入到 cd /Users/duxi/Library/Android/sdk目录(命令行启动不用打开Android Studio就能运行模拟…

【Java程序设计】【C00182】基于SSM的高校成绩报送管理系统(论文+PPT)

基于SSM的高校成绩报送管理系统(论文PPT) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的高校成绩报送系统 本系统分为前台系统、管理员、教师以及学生4个功能模块。 前台系统:当游客打开系统的网址后,首…

25考研北大软微该怎么做?

25考研想准备北大软微,那肯定要认真准备了 考软微需要多少实力 现在的软微已经不是以前的软微了,基本上所有考计算机的同学都知道,已经没有什么信息优势了,只有实打实的有实力的选手才建议报考。 因为软微的专业课也是11408&am…

PyTorch自动微分机制的详细介绍

PyTorch深度学习框架的官方文档确实提供了丰富的信息来阐述其内部自动微分机制。在PyTorch中,张量(Tensor)和计算图(Computation Graph)的设计与实现使得整个系统能够支持动态的、高效的自动求导过程。 具体来说&#…

基于团簇阵列中的量子隧穿效应的氢气传感器

在科技日新月异的今天,传感器技术也在不断地发展和创新。其中,基于团簇阵列中的量子隧穿效应的氢气传感器,以其独特的优势和巨大的潜力,成为了气体检测技术领域的一颗新星。 一、什么是基于团簇阵列中的量子隧穿效应的氢气传感器&…

年度重磅更新!“AI+可视化拖拽”实现个性化页面极速开发!组件设计器即将上线!

AI智能开发!网站一键复刻!设计稿秒变成品! 相信对很多关注低代码和AI技术的小伙伴来说, 都觉得像这些还只是停留在概念上的技术,很难落地实践。 但是在「织信」已经全部都做到了! 无图无真相&#xff0…

企业车辆管理乱、用车难?来试试车辆管理系统!

车辆作为最重要的交通工具在企业中得以普及。随着车辆保有量的不断攀升,企业对于车辆管理的要求也越来越高,会要求管理的多维度和车辆使用的灵活性。 传统的表格管理方式很难及时跟进企业车辆的使用状态,导致企业车辆管理效率低、车辆使用调…

喜讯!聚铭网络上榜《CCSIP 2023 中国网络安全行业全景册(第六版)》18项安全细分领域

近日,国内网络安全行业权威媒体FreeBuf咨询正式发布 《CCSIP 2023 中国网络安全行业全景册(第六版)》(以下简称“全景册”),旨在为企业安全建设及产品选型提供参考。 聚铭网络凭借先进的技术创新能力、丰富…

C++入门(一)— 使用VScode开发简介

文章目录 C 介绍C 擅长领域C 程序是如何开发编译器、链接器和库编译预处理编译阶段汇编阶段链接阶段 安装集成开发环境 (IDE)配置编译器:构建配置配置编译器:编译器扩展配置编译器:警告和错误级别配置编译器&#xff1…

Databend 开源周报第 130 期

Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 支持 CREATE OR…

手机壳也能散热了?

作为一个玩了6年的王者荣耀玩家,手机发热真的很影响游戏体验!!游戏掉帧,性能下降很恼人,试过好几个散热工具,实际效果都不太好~ 自从入了Mate 60之后,看着这款微泵液冷壳毫无犹豫第…

计数排序(六)——计数排序及排序总结

目录 一.前言 二.归并小补充 三.计数排序 操作步骤: 代码部分: 四.稳定性的概念: 五.排序大总结: ​六.结语 一.前言 我们已经进入排序的尾篇了,本篇主要讲述计数排序以及汇总各类排序的特点。码字不易&#x…

如何实现一个百万亿规模的时序数据库,百度智能云 BTS 架构解析和实践分享

本文整理自 2023 年 12 月 16 日,百度智能云数据库总架构师朱洁在《国产数据库共话未来趋势》技术沙龙上的主题分享。 随着互联网和物联网的高速发展,产生了大量的结构化、半结构化数据。在百度集团内部, BTS(Baidu Table Storage…

Windows系统本地安装Wnmp服务并结合内网穿透公网远程访问

目录 前言 1.Wnmp下载安装 2.Wnmp设置 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 结语 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊Windows…