我试图找到3d object.stl文件(我使用numpy stl导入python)和3d plot(我使用matplotlib生成)之间的交点。3d对象是cad绘图,3d绘图是3d中的一组曲线。我可以在同一个图形上绘制它们,但我不知道如何找到轨迹和图形之间的交点。我的想法是在绘制曲线后,使用numpy stl模块中的save()函数将曲线转换为.stl,并在cad应用程序(如freeCAD)上一起显示,然后使用应用程序的功能查找交点。但它并不简单,因为绘图是基于点的,stl是基于三角形的。如果有人对如何解决这个问题有任何建议,请让我知道
下面是绘制.stl对象和3d绘图的代码。这就是我目前所拥有的
#allInitialE is 1D list, allX, allY, allZ are all 2D lists
from stl import mesh
from numpy import *
from mpl_toolkits import mplot3d
from matplotlib import pyplot as plt
fig = plt.figure()
ax = plt.axes(projection = '3d')
your_mesh = mesh.Mesh.from_file('fileName.stl')
your_mesh.translate([0,7,0])
ax.add_collection3d(mplot3d.art3d.Poly3DCollection(your_mesh.vectors))
ax.view_init(azim = -90, elev = 0)
maxE = max(allInitialE)
ax.set_xlabel('x axis (m)') # y and z are flipped to make it easier for me to visualize
ax.set_ylabel('z axix (m)')
ax.set_zlabel('y axix (m)')
plt.title('Particle Trajectory')
for k in range(numParticles): #iterate through each of the particles' xyz data
e = allInitialE[k]
if e < maxE/3:
ax.plot3D(allX[k], allZ[k], allY[k], 'g-')
elif e < maxE/2:
ax.plot3D(allX[k], allZ[k], allY[k], 'b-')
else:
ax.plot3D(allX[k], allZ[k], allY[k], 'r-')
plt.show()
想法1:有没有办法将.stl对象转换为一组平面函数?如果是这样的话,我可以把图画成线,然后找到平面和线之间的交点
第二个想法:或者,既然.stl是基于向量的,我可以使用向量计算吗?i、 e.查看曲线(线段)上的向量是否有一个公共点作为.stl对象上的三角形(三角形由三个向量定义)
请告诉我你有什么想法!非常感谢你
另一种方法可能是使用VTK。可以将numpy stl对象(obj)转换为vtkPolyData
然后可以使用vtkCutterhttps://discourse.vtk.org/t/get-intersection-of-polydata-line-and-a-plane/3894/3或vtkIntersectionPolyDataFilterVTK check polydata point objects for intersection
关于您的第一个想法,是的,您可以将STL文件转换为一组三角形,只需查看:
这是一个三角形三维顶点数组。从中可以构造一个平面,然后计算线段和平面之间的交点
关于第二个想法,只有当轨迹正好与顶点相交时,才能这样做,否则它将无法检测到相交。(或者你需要给它一个余量)
我发现了一种使用pyoctree的方法,pyoctree有一个函数来查找线段和网格之间的交点。这里是链接:https://pypi.org/project/pyoctree/
我能够使用rayIntersection()快速完成我想做的事情。这个Intersection between line and triangle in 3D也有帮助,但是当它处理曲线中的60K+点时,计算速度非常慢
相关问题 更多 >
编程相关推荐