是否查找.stl(CAD绘图)文件和三维打印(matplotlib)之间的交点?

2024-06-16 12:27:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图找到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对象上的三角形(三角形由三个向量定义)

请告诉我你有什么想法!非常感谢你


Tags: 对象fromimportnumpy绘图pltax向量
2条回答

另一种方法可能是使用VTK。可以将numpy stl对象(obj)转换为vtkPolyData

import vedo
import vtk
import itertools
obj = your_mesh
verts = list(itertools.chain(*(obj.vectors)))
faces = [[i*3, i*3+1, i*3+2] for i in range(len(verts)//3)]
vpoly = vedo.Mesh([verts, faces]).clean().polydata()

然后可以使用vtkCutterhttps://discourse.vtk.org/t/get-intersection-of-polydata-line-and-a-plane/3894/3或vtkIntersectionPolyDataFilterVTK check polydata point objects for intersection

关于您的第一个想法,是的,您可以将STL文件转换为一组三角形,只需查看:

your_mesh.vectors

这是一个三角形三维顶点数组。从中可以构造一个平面,然后计算线段和平面之间的交点

关于第二个想法,只有当轨迹正好与顶点相交时,才能这样做,否则它将无法检测到相交。(或者你需要给它一个余量)

我发现了一种使用pyoctree的方法,pyoctree有一个函数来查找线段和网格之间的交点。这里是链接:https://pypi.org/project/pyoctree/

我能够使用rayIntersection()快速完成我想做的事情。这个Intersection between line and triangle in 3D也有帮助,但是当它处理曲线中的60K+点时,计算速度非常慢

相关问题 更多 >