此问题已在此处有答案:
How to check if a 3D point is inside a cylinder(1个答案)
22小时前关门了。
我有一个关于3D数据集的问题。我有两个由3D坐标组成的不同数据集,其中一个数据集用于创建圆柱体形式的表面(让我们称之为蓝色的现在),从其他数据集,我应该能够计数的数量'点'(x,y,z)在该圆柱体表面中(让我们现在称这个数据集为橙子)。我在stackoverflow上找到了一些代码,我用它在3D中创建了一个圆柱体,用于2点蓝色数据集,这一切工作。然而,现在我应该分类橙子数据集的每个坐标,如果它福尔斯在这个圆柱表面内。
这是我用来绘制柱面的代码(可以在这里找到:Plotting a solid cylinder centered on a plane in Matplotlib):
p0 = np.array([-0.0347944, 0.0058072, -0.022887199999999996]) #point at one end
p1 = np.array([-0.0366488, 0.0061488, -0.023424) #point at other end
R = 0.00005
#vector in direction of axis
v = p1 - p0
#find magnitude of vector
mag = norm(v)
#unit vector in direction of axis
v = v / mag
#make some vector not in the same direction as v
not_v = np.array([1, 0, 0])
if (v == not_v).all():
not_v = np.array([0, 1, 0])
#make vector perpendicular to v
n1 = np.cross(v, not_v)
#normalize n1
n1 /= norm(n1)
#make unit vector perpendicular to v and n1
n2 = np.cross(v, n1)
#surface ranges over t from 0 to length of axis and 0 to 2*pi
t = np.linspace(0, mag, 2)
theta = np.linspace(0, 2 * np.pi, 100)
rsample = np.linspace(0, R, 2)
#use meshgrid to make 2d arrays
t, theta2 = np.meshgrid(t, theta)
rsample,theta = np.meshgrid(rsample, theta)
#generate coordinates for surface
# "Tube"
X, Y, Z = [p0[i] + v[i] * t + R * np.sin(theta2) * n1[i] + R * np.cos(theta2) * n2[i] for i in [0, 1, 2]]
# "Bottom"
X2, Y2, Z2 = [p0[i] + rsample[i] * np.sin(theta) * n1[i] + rsample[i] * np.cos(theta) * n2[i] for i in [0, 1, 2]]
# "Top"
X3, Y3, Z3 = [p0[i] + v[i]*mag + rsample[i] * np.sin(theta) * n1[i] + rsample[i] * np.cos(theta) * n2[i] for i in [0, 1, 2]]
ax=plt.subplot(111, projection='3d')
ax.plot_surface(X, Y, Z, color='blue', alpha=0.5)
ax.plot_surface(X2, Y2, Z2, color='blue', alpha=0.5)
ax.plot_surface(X3, Y3, Z3, color='green', alpha=0.7)
plt.show()
现在假设我需要将以下点分类为柱面的“内部”或“外部”:point1 = (-0.0321, 0.003, -0.01) point2 = (-0.5, 0.004, 0.03) point3 = (0.0002, -0.02, 0.00045)
值得一提的是,橙子数据集中的这些点,我需要找出这些点是在圆柱体表面内部还是外部,不必是包围圆柱体表面的顶部和底部的点,这些点可以在圆柱体表面内外的3D空间中的任何地方。
这里提到的代码输出以下结果。
包含蓝色数据集两点的圆柱面
更新:我在这里找到了解决方案:How to check if a 3D point is inside a cylinder
1条答案
按热度按时间lyr7nygr1#
你的问题听起来更像是几何学而不是编码。你到底需要什么?
从几何学上讲,如果你想检查点(a,B,c)是否位于(规范的)圆柱面内
(x,y,z)使得{x^2 + y^2 = r^2,z in [zi,zf] },
只需检查
a^2 + b^2 < r^2 and c in [zi, zf]
是否为True
。如果你的圆柱体的轴没有和z轴对齐,只要把点(a,B,c)到新系统,其中圆柱体是标准形式。如果圆柱体轴线沿着(单位)矢量
v
。相对于z轴的Angular 简单地为beta = arccos(v[2])
(v
已经标准化了!)。然后您需要使用Rodrigues' rotation formula,其中k = v,theta = -beta(注意符号)变换(a,B,c)。您还应该检查旋转后的p0
和p1
是否已经位于(旋转)z轴,否则应在进行比较之前对(a,B,c)应用附加平移。如果你需要的是帮助编码,那么,发布你的尝试并询问:)