【问题标题】:How to select edges by criterion?如何按标准选择边缘?
【发布时间】:2021-12-06 23:25:25
【问题描述】:

我使用的是 Python 3.7。

有一组点。我通过这些点生成 Delaunay 三角剖分。

import numpy as np
points = np.array([[0, 0], [0, 1.1], [1, 0], [1, 1], [1.5, 0.6], [1.2, 0.5], [1.7, 0.9], [1.1, 0.1]])
from scipy.spatial import Delaunay
tri = Delaunay(points)

将边长计算为 dict1:

simplices = points[tri.simplices]
edge_lengths = {}
for point in points:
    key = tuple(point)
    vertex_edges = edge_lengths.get(key,[])
    adjacency_mask = np.isin(simplices, point).all(axis=2).any(axis=1)
    for simplex in simplices[adjacency_mask]:
        self_mask = np.isin(simplex, point).all(axis=1)
        for other in simplex[~self_mask]:
            dist = np.linalg.norm(point - other)
            if dist not in vertex_edges:
                vertex_edges.append(dist)
    edge_lengths[key] = vertex_edges

计算边长的平均值(连接到同一点)作为dict2:

local_mean_edge_lengths = {}
for point in points:
    key = tuple(point)
    local_mean_edge_lengths[key] = np.mean(edge_lengths[key])

我得到两个字典:

In[1]:edge_lengths

Out[1]: 
{(0.0, 0.0): [1.4142135623730951, 1.1, 1.3, 1.0],
 (0.0, 1.1): [1.004987562112089, 1.3416407864998738, 1.4866068747318506],
 (1.0, 0.0): [1.4866068747318506,0.5385164807134504,0.7810249675906654,1.140175425099138,0.14142135623730956],
 (1.0, 1.0): [1.004987562112089,1.4142135623730951,0.5385164807134504,0.6403124237432849,0.7071067811865475],
 (1.5, 0.6): [0.6403124237432849, 0.36055512754639896, 0.31622776601683794, 0.6403124237432848],
 (1.2, 0.5): [0.5385164807134504, 1.3, 0.31622776601683794, 0.41231056256176607],
 (1.7, 0.9): [0.7071067811865475, 0.36055512754639896],
 (1.1, 0.1): [0.14142135623730956, 0.41231056256176607, 0.6403124237432848]}


In[2]:local_mean_edge_lengths

Out[2]: 
{(0.0, 0.0): 1.2035533905932738,
 (0.0, 1.1): 1.2777450744479377,
 (1.0, 0.0): 0.8175490208744828,
 (1.0, 1.0): 0.8610273620256933,
 (1.5, 0.6): 0.4893519352624517,
 (1.2, 0.5): 0.6417637023230136,
 (1.7, 0.9): 0.5338309543664732,
 (1.1, 0.1): 0.3980147808474535}

如何按标准选择边?

喜欢,

为密钥(0.0, 0.0),

有 4 种边长(1.4142135623730951, 1.1, 1.3, 1.0) 和 1 种平均边长( 1.2035533905932738)

edge_length1 = 1.4142135623730951 > 1.2035533905932738,删除这条边;

edge_length2 = 1.1 < 1.2035533905932738, 保持这一优势;

edge_length3 = 1.3 > 1.2035533905932738,删除这条边;

edge_length4 = 1.0 < 1.2035533905932738, 保持这个优势;

与其他键相同。

如何绘制新的 Delaunay 三角剖分(去除边缘后)?

【问题讨论】:

    标签: python delaunay


    【解决方案1】:

    查看my previous answer,了解如何识别 Delaunay 三角剖分中的大边并绘制结果。下图是从那里拍摄的,其中大边缘用青色着色。稍作修改,它就适合您的问题。

    请注意,您不能从 Delaunay 三角剖分本身移除边,因为这会使三角剖分无效。 因此,通过您的标准的边集将需要在单独的数据结构中表示。在我的回答中,它们表示为一组 (i, j) 对,即一个边列表,然后您可以使用它构建一个图形,例如使用 G.add_edges_from 方法使用 networkx library

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-27
      • 2023-03-22
      • 1970-01-01
      • 2020-05-18
      相关资源
      最近更新 更多