沿某个轴为2D多边形的每个像素添加点

时间:2019-02-13 08:11:35

标签: python numpy

假设我有一个由2D点列表表示的开放多边形。例如。没有基础的某种三角形多边形的表示形式是:

import numpy as np
polygon_arr = np.array([[0,0], [15,10], [2,4]])

我正在寻找一种丰富表示法的优雅方法,即在 polygon_arr 中添加点,以使多边形本身不会改变,而是对于每个y值(在多边形范围内) )在 polygon_arr 中会有一个匹配点。

示例:

simple_line_polygon = np.array([[0,0], [10,5]])
enriched_representation = foo(simple_line_polygon)
# foo() should return: np.array([[0,0], [2,1], [4,2], [6,3], [8,4], [10,5]])

我考虑过考虑多边形中的每两个相邻点,构造一个线方程(y = mx + n),并在范围内为每个y对其采样;然后处理特殊情况,例如两个点是垂直的(因此未定义线方程),以及两个点之间的距离已经比y像素变化一个像素更近的情况。但是,这并不是那么优雅,希望能有更好的主意。

1 个答案:

答案 0 :(得分:2)

这里不需要线方程。您可以分别缩放点之间的x和y距离。如果两点之间应该有最小距离,则可以通过计算拐角之间的欧式距离来检查。这是一个小函数,希望可以完成您的工作:

import numpy as np

def enrich_polygon(polygon, maxpoints = 5, mindist=1):

    result = []

    ##looping over all lines of the polygon:
    for start, end in zip(polygon, np.vstack([polygon[1:],polygon[:1]])):
        dist = np.sqrt(np.sum((start-end)**2)) ##distance between points
        N = int(min(maxpoints+1,dist/mindist)) ##amount of sub-sections
        if N < 2:                              ##mindist already reached
            result += [start]

        ##generating the new points:
        ##put all points (including original start) on the line into results 
        else:
            result += [
                start+i*(end-start)/(N-1) for i in range(N-1)
            ]
    return np.array(result)

polygon_arr = np.array([[0,0], [15,10], [2,4]])
res = enrich_polygon(polygon_arr)

print(res)

该函数采用原始多边形,并在成对的相邻角点上进行迭代。如果两个角之间的距离大于mindist,则新的点将累加到最大点(每条线最多可增加的点数)。对于给定的示例,结果如下所示:

[[ 0.          0.        ]
 [ 3.          2.        ]
 [ 6.          4.        ]
 [ 9.          6.        ]
 [12.          8.        ]
 [15.         10.        ]
 [12.4         8.8       ]
 [ 9.8         7.6       ]
 [ 7.2         6.4       ]
 [ 4.6         5.2       ]
 [ 2.          4.        ]
 [ 1.33333333  2.66666667]
 [ 0.66666667  1.33333333]]