Выбор граней сетки на основе координат вершин в numpy - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть два пустых массива, один для трехмерных вершин сетки, назовите его vert, а другой для треугольных граней, назовите его faces:

Массив vert представляет собойN x 3 массив формы float, следовательно, N трехмерных точек.Координата x каждой точки может иметь как положительные, так и отрицательные значения.В качестве чистого примера это может быть массив vert:

[[  2.886495  24.886948  15.909558]
 [ -13.916695 -58.985245  19.655312]
 [ 40.415527   8.968353   8.515955]
 ...
 [ 13.392465 -58.20602   18.752457]
 [ -12.504704 -58.307934  18.912386]
 [ 13.322185 -58.52817   19.165733]]

Так как сетка центрирована, то левая часть сетки - это та, которая имеет положительный компонент x и соответствующую ейиндексы вершин находятся по np.where

i_vert_left = np.where(vert[:,0]>0)[0]

Теперь я хотел бы отфильтровать грани, сделанные из треугольников с координатами полностью по положительной оси x.

Однако у меня естьпроблема в правильном выполнении этой операции indexing .Моя первая попытка заключалась в том, чтобы установить грани таким образом, чтобы их соответствующие вершины имели x>0

faces_left = np.asarray([f for f in faces if np.all(np.isin(i_vert_left,f)) ])

, но операция на больших сетках невероятно медленная.Как я могу использовать умную индексацию лиц?

1 Ответ

0 голосов
/ 19 ноября 2018

Предполагая, что faces - это массив Nx3 целых чисел, индексирующих три вершины каждого треугольника, я думаю, вам просто нужно:

# Check whether each vertex is left or not
vert_left_mask = vert[:, 0] > 0
# Check whether each face has all vertices on left or not
faces_left_mask = np.all(vert_left_mask[faces], axis=1)
# Select resulting left faces
faces_left = faces[faces_left_mask]

Основной "трюк" здесь в vert_left_mask[faces], который заменяет каждое целое число вершин на логическое значение, указывающее, оставлена ​​ли вершина или нет, поэтому легко определить, какая грань полностью оставлена ​​с помощью np.all.

...