Отчет по учебной
Скачать 415.93 Kb.
|
Поиск центральных ребер и вершин с помощью логических операций Set:После разделения края на 3 края выделяются все три. Не существует непосредственного простого способа узнать, какой из них является централь ным краем, который должен быть разделен снова. Один из способов заключается в сравнении индексов вершин между тре мя ребрами. Центральное ребро разделяет оба своих верта с двумя другими ребрами, в то время как периферийные ребра разделяют только одну верши ну с другой реброй. Поэтому, если найдется ребро с двумя общими вершина ми, то найдется и центральное ребро. Относительно быстрый способ определить, сколько общих верт имеет граница, — использовать логические операции Set. Если есть два множества, можно легко выполнить пересечение, объеди нение или симметричную разницу между множествами, чтобы получить об щие элементы, все элементы или только необщие элементы, соответственно: Листинг 3.1 – Создание объекта MESH из данных объекта. o = bpy . context . object d = o. data bm = bmesh . from_edit_mesh ( d) bv = bm. verts 5 selected_edges = { e. index : set ([ v. index for v in e. verts ]) \ for e in bm. edges if e. select 9 } Листинг 3.2 – Внутреннее ребро будет иметь общие вершины с другими ребрами. mid = 42 for i in selected_edges . keys (): other_edges = set ( selected_edges . keys ()) - set ([ i]) 4 num_of_joint_verts = 0 for oe in other_edges : if selected_edges [ i] & selected_edges [ oe ]: num_of_joint_verts += 1 9 if num_of_joint_verts == 2: mid = i break Листинг 3.3 – Выбрав внутреннее ребро, отменим выбор всех вершин. bpy . ops . mesh . select_all ( action = ’ DESELECT ’) for v in selected_edges [ mid ]: bv[ v]. select = True 4 5 bm. select_flush ( True ) Используем аналогичную технику, чтобы найти самую внутреннюю вер шину, созданную после того, как центральное ребро снова подразделяется. Ребро разделено на два ребра, которые имеют 3 вершины. Два ребра разделяют только одну вершину, которая является центральной вершиной. Таким образом, пересечение между наборами вершин обоих рёбер обна ружит центральную вершину: Листинг 3.4 – Нахождение вершины, которые не являются совместными. selected_edges_verts = [ set ([ v. index for v in e. verts ]) for e in bm. edges if e. select 3 ] 4 joint_vert = list ( selected_edges_verts [0] & amp ; selected_edges_verts [1] 7 ). pop () 8 9 other_verts = list ( 10 selected_edges_verts [0] ^ selected_edges_verts [1] 11 ) |