使用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进行分析并解决其…

【Spring Boot 3】异步线程任务

【Spring Boot 3】异步线程任务 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费或多或…

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

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

【工具】raw与jpg互转python-cpp

在工作中常常需要将图像转化为raw数据或者yuv数据&#xff0c;这里将提供 cpp 版本和 python 版本的互转代码 代码链接见文档尾部。 cpp 版本 jpg2raw.cpp #include <fstream> #include <iostream> #include <opencv2/core.hpp> #include <opencv2/hig…

oracle版本号中的i,G,C代表什么含义

大家都熟悉的 Oracle 版本号有 9i、10G、11G、12C、19C 等&#xff0c;但在早期&#xff0c;Oracle 的版本号并不包含这些字母。 最初&#xff0c;Oracle 的版本号简单地是 1、2、3、4 等&#xff0c;一直发展到 1999 年发布的 8i 版本。20 世纪末是互联网爆发式发展的时代。 …

将一个excel文件里面具有相同参数的行提取后存入新的excel

功能描述&#xff1a; 一个excel里面有很多行数据&#xff0c;其中“交易时间”这一列有很多交易日期&#xff0c;有些行的交易日期是一样的&#xff0c;那么就把所有交易日期相同的行挑出来&#xff0c;形成一个新的以交易日期命名的文件。import pandas as pd import os# 读取…

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

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

命令行启动Android Studio模拟器

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

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

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

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

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

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

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

掌握Java多线程利器:ConcurrentHashMap详解

在并发编程的世界里&#xff0c;每一个微小的延迟都可能积累成为性能瓶颈。今天&#xff0c;让我们一起揭开Java中ConcurrentHashMap的神秘面纱&#xff0c;这是一个在多线程环境中不可或缺的高性能组件。从它的设计理念到底层实现&#xff0c;我们将详细探讨ConcurrentHashMap…

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

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

浅谈Java主流锁

浅谈Java主流锁 synchronized关键字 synchronized是Java中最基本的锁机制&#xff0c;可以用来修饰方法或代码块。 修饰方法&#xff1a; public synchronized void method() {// 代码 }修饰代码块&#xff1a; public void method() {synchronized (this) {// 代码} }synch…

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

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

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

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

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

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