Поиск точек пересечения между файлом .stl (чертеж САПР) и трехмерным графиком (matplotlib)?

Я пытаюсь найти точки пересечения между файлом .stl 3d-объекта (который я импортировал в python с помощью numpy-stl) и 3d-графиком (который я создал с помощью matplotlib). 3D-объект - это CAD-чертеж, а 3D-график - это набор кривых в 3D. Я могу нанести их на один и тот же рисунок, но понятия не имею, как найти точки пересечения между траекторией и рисунком. Моя идея заключалась в том, чтобы преобразовать кривую в .stl с помощью функции save () из модуля numpy-stl после ее построения и показать их вместе в приложении CAD, таком как freeCAD, и найти пересечение, используя функциональность приложения. Но это не так просто, потому что графики основаны на точках, а .stl - на треугольниках. Если у кого-то есть совет, как решить эту проблему, дайте мне знать !!

Вот код для построения как объекта .stl, так и трехмерного графика. Это то, что у меня есть до сих пор.

#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 в набор плоских функций? Если так, я мог бы сделать графики линиями и найти пересечение между плоскостью и линией?

2-я идея: Или, поскольку .stl являются векторными, я могу использовать векторные вычисления? т.е. посмотрите, имеет ли вектор на кривой (сегмент линии) общую точку в виде треугольника на объекте .stl (треугольник определяется тремя векторами).

Пожалуйста, дайте мне любую идею, которая у вас есть! Большое спасибо.


person Sara S    schedule 24.07.2020    source источник


Ответы (1)


Я нашел способ использовать pyoctree, в котором есть функция для поиска пересечения между линейными сегментами и сеткой. Вот ссылка: https://pypi.org/project/pyoctree/

Я смог использовать rayIntersection (), чтобы делать то, что я хотел, очень быстро. Это пересечение линии и треугольника в 3D также помогло, но расчет был очень медленным, когда имел дело с 60К + точками на кривой.

person Sara S    schedule 11.08.2020