Измерьте расстояние между сетками

Для моего проекта мне нужно измерить расстояние между двумя файлами STL. Я написал скрипт, который позволяет читать файлы, располагая их относительно друг друга в желаемом положении. Теперь, на следующем шаге мне нужно проверить расстояние от одного объекта до другого. Есть ли в библиотеке функция или сценарий, позволяющий мне выполнить этот процесс? Потому что тогда я захочу определить такие метрики, как площадь взаимопроникновения, максимальное отрицательное расстояние и т. Д., Поэтому мне нужно сначала проверить расстояние между этими объектами и посмотреть, есть ли пересечение сетки, и измерить это расстояние. Я помещаю URL для комбинации двух объектов, расстояние от которых я хочу измерить:

https://imgur.com/wgNaalh

2 ответа

Pyvista предлагает действительно простой способ расчета:

      import pyvista as pv
import numpy as np

mesh_1 = pv.read(**path to mesh 1**)
mesh_2 = pv.read(**path to mesh 2**)

closest_cells, closest_points = mesh_2.find_closest_cell(mesh_1.points, return_closest_point=True)
d_exact = np.linalg.norm(mesh_1 .points - closest_points, axis=1)
print(f'mean distance is: {np.mean(d_exact)}')

Дополнительные методы и примеры см.

https://docs.pyvista.org/examples/01-filter/distance-between-surfaces.html#using-pyvista-filter

Чтобы рассчитать расстояние между двумя сетками, сначала нужно проверить, пересекаются ли эти сетки. Если нет, то результирующее расстояние можно вычислить как расстояние между двумя ближайшими точками, по одной из каждой сетки (как на картинке ниже).

Если сетки пересекаются, то необходимо найти часть каждой сетки, которая находится внутри другой сетки, затем найти две наиболее удаленные точки, по одной от каждой внутренней части. Расстояние между этими точками и будет максимальной глубиной взаимопроникновения сеток. Его можно вернуть с отрицательным знаком, чтобы отличить его от расстояния между разделенными сетками.

В Python можно использовать библиотеку MeshLib и функцию findSignedDistance из нее следующим образом:

      import meshlib.mrmeshpy as mr
mesh1 = mr.loadMesh("Cube.stl")
mesh2 = mr.loadMesh("Torus.stl"))
z = mr.findSignedDistance(mesh1, mesh2)
print(z.signedDist) // 0.3624192774295807
Другие вопросы по тегам