在numpy数组中生成填充的多边形

在numpy数组中生成填充的多边形,第1张

在numpy数组中生成填充的多边形

以下解决方案仅需要numpy。它适用于凸多边形的顶点(在[行,列]坐标系中按顺时针顺序定义)。凹面多边形可以工作,但最终会切除凸出的点。

import numpy as npdef check(p1, p2, base_array):    """    Uses the line defined by p1 and p2 to check array of     input indices against interpolated value    Returns boolean array, with True inside and False outside of shape    """    idxs = np.indices(base_array.shape) # Create 3D array of indices    p1 = p1.astype(float)    p2 = p2.astype(float)    # Calculate max column idx for each row idx based on interpolated line between two points    max_col_idx = (idxs[0] - p1[0]) / (p2[0] - p1[0]) * (p2[1] - p1[1]) +  p1[1]        sign = np.sign(p2[0] - p1[0])    return idxs[1] * sign <= max_col_idx * signdef create_polygon(shape, vertices):    """    Creates np.array with dimensions defined by shape    Fills polygon defined by vertices with ones, all other values zero"""    base_array = np.zeros(shape, dtype=float)  # Initialize your array of zeros    fill = np.ones(base_array.shape) * True  # Initialize boolean array defining shape fill    # Create check array for each edge segment, combine into fill array    for k in range(vertices.shape[0]):        fill = np.all([fill, check(vertices[k-1], vertices[k], base_array)], axis=0)    # Set all values inside polygon to one    base_array[fill] = 1    return base_array# (Row, Col) Vertices of Polygon (Defined Clockwise)vertices = np.array([    [5,12],    [8,18],    [13,14],    [11,6],    [4,6],])polygon_array = create_polygon([20,20], vertices)# This section prints numbers at each vertex for visual check, just comment out # to print an array of only zeros and onesfor n, vertex in enumerate(vertices):    polygon_array[vertex[0],vertex[1]] = 10*(n+1)# Simple routine to print the final arrayfor row in polygon_array.tolist():    for c in row:        print '{:4.1f}'.format(c),    print ''


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5667741.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存