首页 > 其他分享 >bresenham_3d绘制3维直线,可设置直线粗细

bresenham_3d绘制3维直线,可设置直线粗细

时间:2024-06-18 15:44:22浏览次数:24  
标签:直线 bresenham thickness dz dx dy err2 err1 3d

  1 import matplotlib.pyplot as plt
  2 from mpl_toolkits.mplot3d import Axes3D
  3 import numpy as np
  4 import nibabel as nib
  5 
  6 def bresenham_3d(p0, p1, thickness):
  7     '''
  8     Bresenham's Line Algorithm in 3D with adjustable thickness\n
  9     CONFIRMED
 10     '''
 11 
 12     def add_thickness(points, thickness):
 13         '''Add thickness to the line'''
 14         if thickness <= 1:
 15             return points
 16         thick_points = set()
 17         r = thickness // 2
 18         for x, y, z in points:
 19             for dx in range(-r, r + 1):
 20                 for dy in range(-r, r + 1):
 21                     for dz in range(-r, r + 1):
 22                         if dx ** 2 + dy ** 2 + dz ** 2 <= r ** 2:
 23                             thick_points.add((x + dx, y + dy, z + dz))
 24         return list(thick_points)
 25 
 26     points = []
 27     x0, y0, z0 = [int((num)) for num in p0]
 28     x1, y1, z1 = [int((num)) for num in p1]
 29     dx, dy, dz = np.abs(x1 - x0), np.abs(y1 - y0), np.abs(z1 - z0)
 30     sx, sy, sz = np.sign(x1 - x0), np.sign(y1 - y0), np.sign(z1 - z0)
 31 
 32     if dx >= dy and dx >= dz:
 33         err1, err2 = 2 * dy - dx, 2 * dz - dx
 34         while x0 != x1:
 35             points.append((x0, y0, z0))
 36             if err1 >= 0:
 37                 y0 += sy
 38                 err1 -= 2 * dx
 39             if err2 >= 0:
 40                 z0 += sz
 41                 err2 -= 2 * dx
 42             err1 += 2 * dy
 43             err2 += 2 * dz
 44             x0 += sx
 45     elif dy >= dx and dy >= dz:
 46         err1, err2 = 2 * dx - dy, 2 * dz - dy
 47         while y0 != y1:
 48             points.append((x0, y0, z0))
 49             if err1 >= 0:
 50                 x0 += sx
 51                 err1 -= 2 * dy
 52             if err2 >= 0:
 53                 z0 += sz
 54                 err2 -= 2 * dy
 55             err1 += 2 * dx
 56             err2 += 2 * dz
 57             y0 += sy
 58     else:
 59         err1, err2 = 2 * dy - dz, 2 * dx - dz
 60         while z0 != z1:
 61             points.append((x0, y0, z0))
 62             if err1 >= 0:
 63                 y0 += sy
 64                 err1 -= 2 * dz
 65             if err2 >= 0:
 66                 x0 += sx
 67                 err2 -= 2 * dz
 68             err1 += 2 * dy
 69             err2 += 2 * dx
 70             z0 += sz
 71     points.append((x1, y1, z1))
 72 
 73     # Apply thickness
 74     return add_thickness(points, thickness)
 75 
 76 
 77 # 创建一个图形对象
 78 fig = plt.figure()
 79 
 80 # 在图形中添加一个子图,参数为行数、列数和子图索引
 81 ax = fig.add_subplot(1, 1, 1, projection='3d')
 82 
 83 # 设置坐标轴的标签
 84 ax.set_xlabel('X')
 85 ax.set_ylabel('Y')
 86 ax.set_zlabel('Z')
 87 
 88 data = np.zeros((50, 50, 50))
 89 
 90 # 定义两个三维空间中的点
 91 p0 = (20, 20, 20)  # 起始点
 92 p1 = (30, 30, 30)  # 结束点
 93 
 94 # 定义线宽
 95 thickness = 25
 96 
 97 # 调用函数
 98 line_with_thickness = bresenham_3d(p0, p1, thickness)
 99 
100 # 打印结果
101 for point in line_with_thickness:
102     data[point[0], point[1], point[2]] = 1
103 
104 # 创建一个新的Nifti1Image对象
105 solid_image = nib.Nifti1Image(data, np.eye(4))
106 
107 # 保存为nii.gz文件
108 nib.save(solid_image, 't25.nii.gz')
109 
110 # 绘制体素图
111 ax.voxels(data)
112 
113 # 显示图形
114 plt.show()

 

结果:

thickness = 1 时

 

thickness = 4 时

 

thickness = 7 时

 

 

thickness = 10 时

 

thickness = 25 时

 

 

标签:直线,bresenham,thickness,dz,dx,dy,err2,err1,3d
From: https://www.cnblogs.com/hxqmw/p/18254476

相关文章

  • Unity3D 用贝塞尔曲线进行弹道追踪
    usingSystem.Collections;usingSystem.Collections.Generic;usingUnity.Collections.LowLevel.Unsafe;usingUnityEngine;usingUnityEngine.UI;publicclassBulletLogic:MonoBehaviour{//Startiscalledbeforethefirstframeupdate//飞行速度最大......
  • 【名词解释】Unity3D物理射线(Physics Ray)含义及其用法
    Unity3D是一款流行的游戏开发引擎,它提供了一套强大的工具和功能来帮助开发者创建交互式3D内容。在Unity中,"物理射线"(PhysicsRay)通常指的是使用射线检测(Raycasting)来检测物体之间的碰撞或者检测射线与物体的交点。这在游戏开发中非常常见,用于实现如射击、视线检测、物体碰撞检......
  • monocular 3D detection小结
    smoke参考https://zhuanlan.zhihu.com/p/452676265monodle通过大量密集实验(逐步用gt替换预测值测试),localizationerror是3d检测的关键。提出三点策略:1.重新思考了2d中心和3d中心的不对齐影响(用3dcenter替换2dcenter能提高性能,且2d检测能作为辅助任务帮助3d检测)2.去除较远......
  • lidar 3D decetion小结
    1.pointnetpointnet++:实现基于点云的分类和语义分割。提出了基于点云的特征提取网络。(https://zhuanlan.zhihu.com/p/336496973)2.VoxelNet:第一篇提出将点云转体素,进行3d检测。https://zhuanlan.zhihu.com/p/3524193163.SECOND:用spconv替换3d卷积,减少计算量。https://zhuanlan......
  • 3DS MAX课程结业实验报告书
    一、实验内容选题13题目:安静人生模型:表、沙发、抱枕二、实验说明实验工具:3dsmax文具+3DSMAX布料模拟动画插件CGTrader–PolyClothv2.06for3dsMax2016-2024实验课时:两周实验方法:自主制作任务:完成3dsmax源文件的制作,提交实验报告三、实验过程3.1安装......
  • AI + 3D:用单个图像和文本提示创建可交互的3D世界
    你是否曾经梦想过只需一张照片和一些简单的文字描述,就能立即进入一个生动的3D虚拟世界?今天,我们将介绍一个革命性的技术,它就像是一台神奇的3D场景制造机,能够根据你的想象快速构建出令人惊叹的虚拟空间。一、技术概览这项技术不仅仅是一个简单的图像到3D的转换工具,更是一个完整......
  • (slam工具)4 3D点集配准相似变换sRt计算
      https://github.com/Dongvdong/v1_1_slam_tool  importrandomimportmathimportnumpyasnpimportosdefAPI_pose_estimation_3dTo3d_ransac(points_src,points_dst):#NED->slamp=np.array(points_src,dtype=float)q=np.array(......
  • Rayfire 1.85 for 3DSMax软件安装包下载 丨不限速下载丨亲测好用
    软件简介:RayFireTool是3DSMax的高级插件,被广泛引用雨制作很多各种高级特效,如物体碎裂、毁灭、拆毁大型建筑、毁坏、分解、大范围破坏、炸毁、爆破、爆炸、引爆等效果,以及其他类似特效。这些你一直想要的大场面效果,都可以在3dsMax中使用RayFire来实现,安装包获......
  • 11大3D模型销售网站
     无法决定是在在线市场上销售3D模型还是在电子商务平台上销售?让我们帮助你。在这篇博文中,我们列出了10个在线销售3D模型的最佳网站。我们还列出了每个平台的优缺点,以便你做出明智的决定。那么,让我们开始吧!1、SellfySellfy是一种易于使用的电子商务解决方案,具有大......
  • 3D工艺大师:航空航天手册的数字蜕变
    在航空航天领域,技术手册是飞行器操作与维修工作的核心参考工具。常见的技术手册包括AMM(航空器维护手册)、CMM(航空部件维修手册)以及WDM(飞机重量与平衡手册)等,主要用于帮助机组工作人员进行飞行器的操作、维护和修复工作。而技术手册的制作是一项复杂且严谨的工作。常规操作1......