【问题标题】:annulus with scipy Delaunay带有 scipy Delaunay 的环
【发布时间】:2021-04-18 13:27:57
【问题描述】:

我尝试绘制一个代表环形的 3d 实体。我使用了 scipy 模块和 Delaunay 来进行计算。 不幸的是,该图显示了一个 3d 圆柱体,而不是一个环形空间。有人知道如何修改代码吗? scipy 是正确的模块吗?我可以使用带矩形形状的 Delaunay 吗? 提前致谢!

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from scipy.spatial import Delaunay

points = 50

theta = np.linspace(0,2*np.pi,points)
radius_middle = 7.5
radius_inner = 7
radius_outer = 8

x_m_cartesian = radius_middle * np.cos(theta)
y_m_cartesian = radius_middle * np.sin(theta)
z_m_cartesian = np.zeros(points)
M_m = np.c_[x_m_cartesian,y_m_cartesian,z_m_cartesian]

x_i_cartesian = radius_inner * np.cos(theta)
y_i_cartesian = radius_inner * np.sin(theta)
z_i_cartesian = np.zeros(points)
M_i = np.c_[x_i_cartesian,y_i_cartesian,z_i_cartesian]

x1_m_cartesian = radius_middle * np.cos(theta)
y1_m_cartesian = radius_middle * np.sin(theta)
z1_m_cartesian = np.ones(points)
M1_m = np.c_[x1_m_cartesian,y1_m_cartesian,z1_m_cartesian]

x2_i_cartesian = radius_inner * np.cos(theta)
y2_i_cartesian = radius_inner * np.sin(theta)
z2_i_cartesian = np.ones(points)
M2_i = np.c_[x2_i_cartesian,y2_i_cartesian,z2_i_cartesian]

M = np.vstack((M_m,M_i,M1_m,M2_i))

# Delaunay
CH = Delaunay(M).convex_hull

x,y,z = M[:,0],M[:,1],M[:,2]

fig = plt.figure(figsize=(12,8))
ax = fig.add_subplot(111,projection='3d')
#ax.scatter(x[:,0],y[:,1],z[:,2])
ax.plot_trisurf(x,y,z,triangles=CH, shade=False, color='lightblue',lw=1, edgecolor='k')

plt.show()

【问题讨论】:

  • 点环的convex_hull 是整个磁盘,而不是环。可能有一种“减去”内盘的方法,但基本的形状没有孔。
  • 感谢您的反馈。您能否提出其他工具/模块来创建环。 conve_hull 不能减去内环...

标签: scipy python-3.6 delaunay


【解决方案1】:

如 cmets 中所述,凸包是凸形,因此不能表示环。但是,concave hull(也称为alpha-shape)的概念可能适合您的需要。基本上,alpha 形状会从 Delaunay 三角剖分中移除外接半径大于某个值(由 alpha 参数定义)的三角形(在 3D 情况下为四面体)。

This answer 提供 3D 点的 alpha 形状表面(即外边界)的实现。使用该答案中的 alpha_shape_3D 函数,alpha 值为 3,得到下图。

代码中的以下两行(替换对CH 的赋值和绘图函数)完成了这项工作。

vertices, edges, facets = alpha_shape_3D(pos=M, alpha=3.)

ax.plot_trisurf(x,y,z,triangles=facets, shade=False, color='lightblue',lw=1, edgecolor='k')

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 2011-09-26
    • 2016-08-04
    • 2015-07-05
    • 2020-10-17
    • 2017-10-31
    • 2021-12-26
    • 1970-01-01
    • 2016-05-19
    相关资源
    最近更新 更多