从 Shewchuk 三角收集数据和属性

问题描述 投票:0回答:0

假设我有一个区域区域,我执行一个受约束的 Delaunay Rufat's Shewchuk 三角(python)的实现

import numpy as np
import triangle as tr
import matplotlib.pyplot as plt

# data
vertices = [[0, 0], [5, 0], [5, 5], [0, 5],
            [1, 1], [2, 1], [2, 2], [1, 2],
           [3, 3], [4, 3], [4, 4], [3, 4],
           [2, 3], [1, 3],
           [4, 1], [4, 2]]
segments = [[0, 1], [1, 2], [2, 3], [3, 0],
           [4, 5], [5, 6], [6, 7], [7, 4],
           [8, 9], [9, 10], [10, 11], [11, 8],
           [6, 12], [12, 13], [7, 13],
           [5, 14], [14, 15], [6, 15]]
regions = [[1.5, 1.5, 1, 0],
          [3.5, 3.5, 3, 0],
          [1.5, 2.5, 2, 0],
          [3, 1.5, 4, 0],]

A = dict(vertices=vertices, segments=segments, regions=regions)
B = tr.triangulate(A, 'pAn')
    
tr.compare(plt, A, B)
plt.show()

image

用字典

B
看起来像:

{'vertices': array([[0., 0.],
        [5., 0.],
        [5., 5.],
        [0., 5.],
        ...
        [1., 3.],
        [4., 1.],
        [4., 2.]]),
 'vertex_markers': array([[1],
        [1],
        [1],
        [1],
       ...
        [0],
        [0],
        [0]], dtype=int32),
 'triangles': array([[ 0,  4,  7],
        [ 4,  0,  5],
        [ 7,  5,  6],
        [ 5,  7,  4],
        ...
        [ 2, 10,  9],
        [ 9, 15,  2],
        [11,  2,  3],
        [ 8, 11, 12]], dtype=int32),
 'triangle_attributes': array([[0.],
        [0.],
        [1.],
        [1.],
        ...
        [0.],
        [0.],
        [0.]]),
 'neighbors': array([[ 3,  5,  1],
        [ 4,  3,  0],
        [12, 10,  3],
        ...
        [15, 22, 18],
        [-1, 11, 21],
        [11,  9, 20]], dtype=int32),
 'segments': array([[ 1,  0],
        [ 2,  1],
        [ 3,  2],
        ...
        [ 5, 14],
        [14, 15],
        [ 6, 15]], dtype=int32),
 'segment_markers': array([[1],
        [1],
        [1],
        [1],
        ...
        [0],
        [0]], dtype=int32),
 'regions': array([[1.5, 1.5, 1. , 0. ],
        [3.5, 3.5, 3. , 0. ],
        [1.5, 2.5, 2. , 0. ],
        [3. , 1.5, 4. , 0. ]])}

i) 我如何迭代每个区域 1-4(不是 0);
ii) 收获 bounds 该区域的每个片段;
iii) 提取每段的2个顶点的坐标;随着
iv) 该区域的属性加上线段另一侧区域的属性?

Thufar 我有:

for i, region in enumerate(regions):
    region_triangles = np.where(Tr['triangle_attributes'] == i+1)[0]
    region_segments = []
    for tri in region_triangles:
        tri_vertices = Tr['triangles'][tri]
        for j in range(3):
            seg = sorted([tri_vertices[j], tri_vertices[(j+1)%3]])
            if seg not in region_segments:
                if seg in segments:
                    region_segments.append(seg)
    print("Region", i+1, "is bounded by segments:", region_segments)

产生:

Region 1 is bounded by segments: [[5, 6], [6, 7], [4, 5]]  
Region 2 is bounded by segments: [[6, 12], [12, 13], [7, 13], [6, 7]]  
Region 3 is bounded by segments: [[9, 10], [10, 11], [8, 9]]  
Region 4 is bounded by segments: [[5, 14], [5, 6], [6, 15], [14, 15]]

区域 1 和 3 不正确

python dictionary triangulation delaunay
© www.soinside.com 2019 - 2024. All rights reserved.