Главная страница

Отчет по учебной


Скачать 415.93 Kb.
НазваниеОтчет по учебной
Дата06.12.2022
Размер415.93 Kb.
Формат файлаdocx
Имя файлаKursovaya_rabota_v_1_8.docx
ТипОтчет
#830166
страница6 из 12
1   2   3   4   5   6   7   8   9   ...   12

Поиск центральных ребер и вершин с помощью логических операций Set:


После разделения края на 3 края выделяются все три. Не существует непосредственного простого способа узнать, какой из них является централь­ ным краем, который должен быть разделен снова.

Один из способов заключается в сравнении индексов вершин между тре­ мя ребрами. Центральное ребро разделяет оба своих верта с двумя другими ребрами, в то время как периферийные ребра разделяют только одну верши­ ну с другой реброй. Поэтому, если найдется ребро с двумя общими вершина­ ми, то найдется и центральное ребро.

Относительно быстрый способ определить, сколько общих верт имеет граница, использовать логические операции Set.

Если есть два множества, можно легко выполнить пересечение, объеди­ нение или симметричную разницу между множествами, чтобы получить об­ щие элементы, все элементы или только необщие элементы, соответственно:

Листинг 3.1 Создание объекта MESH из данных объекта.

  1. o = bpy . context . object

  2. d = o. data

  3. bm = bmesh . from_edit_mesh ( d)

  4. bv = bm. verts

5

  1. selected_edges = {

  2. e. index : set ([ v. index for v in e. verts ]) \

  3. for e in bm. edges if e. select

9 }
Листинг 3.2 Внутреннее ребро будет иметь общие вершины с другими ребрами.

  1. mid = 42

  2. for i in selected_edges . keys ():

  3. other_edges = set ( selected_edges . keys ()) - set ([ i])

4

  1. num_of_joint_verts = 0

  2. for oe in other_edges :

  3. if selected_edges [ i] & selected_edges [ oe ]:

  4. num_of_joint_verts += 1

9

  1. if num_of_joint_verts == 2:

  2. mid = i

  3. break


Листинг 3.3 Выбрав внутреннее ребро, отменим выбор всех вершин.

    1. bpy . ops . mesh . select_all ( action = DESELECT ’)

    2. for v in selected_edges [ mid ]:

    3. bv[ v]. select = True

4

5 bm. select_flush ( True )
Используем аналогичную технику, чтобы найти самую внутреннюю вер­ шину, созданную после того, как центральное ребро снова подразделяется.

Ребро разделено на два ребра, которые имеют 3 вершины. Два ребра разделяют только одну вершину, которая является центральной вершиной.

Таким образом, пересечение между наборами вершин обоих рёбер обна­ ружит центральную вершину:

Листинг 3.4 Нахождение вершины, которые не являются совместными.

  1. selected_edges_verts = [

  2. set ([ v. index for v in e. verts ]) for e in bm. edges if e. select

3 ]

4

  1. joint_vert = list (

  2. 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 )


    1. 1   2   3   4   5   6   7   8   9   ...   12


написать администратору сайта