代码之家  ›  专栏  ›  技术社区  ›  ap21

如何向scipy Delaunay三角剖分对象添加简单化

  •  1
  • ap21  · 技术社区  · 6 年前

    我已经有一个矩形被一个 scipy.spatial.Delaunay() 对象。我设法把它拉伸和弯曲,使它看起来像是沿着一条线切割的环形物。下面是一些代码,用于生成具有相同拓扑的对象:

    from scipy.spatial import Delaunay
    
    NR = 22
    NTheta = 36
    
    Rin = 1
    Rout = 3
    alphaFactor = 33/64
    alpha = np.pi/alphaFactor # opening angle of wedge
    
    u=np.linspace(pi/2, pi/2 + alpha, NTheta)
    v=np.linspace(Rin, Rout, NR)
    u,v=np.meshgrid(u,v)
    u=u.flatten()
    v=v.flatten()
    
    #evaluate the parameterization at the flattened u and v
    x=v*np.cos(u)
    y=v*np.sin(u)
    
    #define 2D points, as input data for the Delaunay triangulation of U
    points2D=np.vstack([u,v]).T
    xy0 = np.vstack([x,y]).T
    triLattice = Delaunay(points2D) #triangulate the rectangle U
    triSimplices = triLattice.simplices
    plt.figure()
    plt.triplot(x, y, triSimplices, linewidth=0.5)
    

    Cut annulus

    1 回复  |  直到 6 年前
        1
  •  0
  •   xdze2    6 年前

    一种解决方法是合并间隙周围的点。下面是一种方法,通过跟踪对应点的索引:

    import matplotlib.pylab as plt
    from scipy.spatial import Delaunay
    import numpy as np
    
    NR = 4
    NTheta = 16
    
    Rin = 1
    Rout = 3
    alphaFactor = 33/64  # -- set to .5 to close the gap
    alpha = np.pi/alphaFactor  # opening angle of wedge
    
    u = np.linspace(np.pi/2, np.pi/2 + alpha, NTheta)
    v = np.linspace(Rin, Rout, NR)
    u_grid, v_grid = np.meshgrid(u, v)
    u = u_grid.flatten()
    v = v_grid.flatten()
    
    # Get the indexes of the points on the first and last columns:
    idx_grid_first = (np.arange(u_grid.shape[0]),
                      np.zeros(u_grid.shape[0], dtype=int))
    
    idx_grid_last = (np.arange(u_grid.shape[0]),
                     (u_grid.shape[1]-1)*np.ones(u_grid.shape[0], dtype=int))
    
    # Convert these 2D indexes to 1D indexes, on the flatten array:
    idx_flat_first = np.ravel_multi_index(idx_grid_first, u_grid.shape)
    idx_flat_last = np.ravel_multi_index(idx_grid_last, u_grid.shape)
    
    # Evaluate the parameterization at the flattened u and v
    x = v * np.cos(u)
    y = v * np.sin(u)
    
    # Define 2D points, as input data for the Delaunay triangulation of U
    points2D = np.vstack([u, v]).T
    triLattice = Delaunay(points2D) # triangulate the rectangle U
    triSimplices = triLattice.simplices
    
    # Replace the 'last' index by the corresponding 'first':
    triSimplices_merged = triSimplices.copy()
    for i_first, i_last in zip(idx_flat_first, idx_flat_last):
        triSimplices_merged[triSimplices == i_last] = i_first
    
    # Graph
    plt.figure(figsize=(7, 7))
    plt.triplot(x, y, triSimplices, linewidth=0.5)
    plt.triplot(x, y, triSimplices_merged, linewidth=0.5, color='k')
    plt.axis('equal');
    
    plt.plot(x[idx_flat_first], y[idx_flat_first], 'or', label='first')
    plt.plot(x[idx_flat_last], y[idx_flat_last], 'ob', label='last')
    plt.legend();
    

    它给出:

    merged mesh

    alphaFactor 以便间隙大小合适。