Как я могу пересечь 2 строки с помощью PyVista?

Я хотел бы пересечь 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). Это навело меня на мысль, что пересечения не было, но это невозможно.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
89
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь есть две ошибки.

Первая ошибка в том, что 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(), согласно документации,

возвращает пересечение поверхности двух мешей (которое часто разрешается как линия)

Глядя на документы базового vtkIntersectionPolyDataFilter , там также есть очень убедительные предположения, что этот фильтр предназначен для пересечения поверхностей. Он даже не может пересекать копланарные многоугольники. Как вы уже знаете, у него также есть проблемы с пересечением нетриангулированных поверхностей.

Боюсь, этот фильтр не сможет пересекать линии для вас. В общем случае пересечение линий даже не так просто вычислить, потому что вам придется найти единственную точку в реальном пространстве с добавленной сложностью неопределенности с плавающей запятой в численных реализациях. Это все просто для того, чтобы сказать, что я не считаю само собой разумеющимся, что VTK вообще может сделать эту задачу для вас. Вероятно, вам лучше решить уравнение пересечения на бумаге (или решить эквивалентную систему линейных уравнений с помощью кода).

Я также попробовал ray_trace, который, похоже, также требует 2D-поверхностей.

Matthew Flamm 29.04.2023 00:06

Другие вопросы по теме