Я хотел бы пересечь 2 линии с помощью PyVista, получить координаты этого пересечения и построить результат.
Я попробовал следующий код:
import pyvista as pv
line1 = pv.Line(pointa=(-1,0,0), pointb=(2,0,0))
line2 = pv.Line(pointa=(0,-1,0), pointb=(0,2,0))
intersection = line1.intersection(line2)
plotter = pv.Plotter()
plotter.add_mesh(line1)
plotter.add_mesh(line2)
plotter.add_mesh(intersection)
plotter.show()
Но проблема в том, что я получил кортеж из 3-х пустых PolyData элементов:
(PolyData (0x2634b15bee0)
N Cells: 0
N Points: 0
N Strips: 0
X Bounds: 1.000e+299, -1.000e+299
Y Bounds: 1.000e+299, -1.000e+299
Z Bounds: 1.000e+299, -1.000e+299
N Arrays: 0,
PolyData (0x2634b15bac0)
N Cells: 0
N Points: 0
N Strips: 0
X Bounds: 1.000e+299, -1.000e+299
Y Bounds: 1.000e+299, -1.000e+299
Z Bounds: 1.000e+299, -1.000e+299
N Arrays: 0,
PolyData (0x2634b14a100)
N Cells: 0
N Points: 0
N Strips: 0
X Bounds: 1.000e+299, -1.000e+299
Y Bounds: 1.000e+299, -1.000e+299
Z Bounds: 1.000e+299, -1.000e+299
N Arrays: 0)
И я не могу построить кортеж относительно строки: plotter.add_mesh(intersection). Это навело меня на мысль, что пересечения не было, но это невозможно.






Здесь есть две ошибки.
Первая ошибка в том, что intersect() возвращает 3 меша, а не 1 :
Returns
-------
pyvista.PolyData
The intersection line.
pyvista.PolyData
The first mesh split along the intersection. Returns the
original first mesh if ``split_first=False``.
pyvista.PolyData
The second mesh split along the intersection. Returns the
original second mesh if ``split_second=False``.
Если вам нужно только пересечение, вам нужно выбрать первый элемент (индекс 0) в возвращаемом кортеже.
Вторая ошибка заключается в том, что фильтр intersect(), согласно документации,
возвращает пересечение поверхности двух мешей (которое часто разрешается как линия)
Боюсь, этот фильтр не сможет пересекать линии для вас. В общем случае пересечение линий даже не так просто вычислить, потому что вам придется найти единственную точку в реальном пространстве с добавленной сложностью неопределенности с плавающей запятой в численных реализациях. Это все просто для того, чтобы сказать, что я не считаю само собой разумеющимся, что VTK вообще может сделать эту задачу для вас. Вероятно, вам лучше решить уравнение пересечения на бумаге (или решить эквивалентную систему линейных уравнений с помощью кода).
Я также попробовал
ray_trace, который, похоже, также требует 2D-поверхностей.