Python 为二维多边形沿某个轴添加每像素点

Python 为二维多边形沿某个轴添加每像素点,python,numpy,Python,Numpy,假设我有一个由2D点列表表示的开放多边形。例如,无基三角形多边形的表示形式为: import numpy as np polygon_arr = np.array([[0,0], [15,10], [2,4]]) 我正在寻找一种优雅的方法来丰富表示,即向多边形添加点,这样多边形本身不会改变,但对于每个y值(在多边形范围内),多边形中都会有一个匹配点 例如: simple_line_polygon = np.array([[0,0], [10,5]]) enriched_representati

假设我有一个由2D点列表表示的开放多边形。例如,无基三角形多边形的表示形式为:

import numpy as np
polygon_arr = np.array([[0,0], [15,10], [2,4]])
我正在寻找一种优雅的方法来丰富表示,即向多边形添加点,这样多边形本身不会改变,但对于每个y值(在多边形范围内),多边形中都会有一个匹配点

例如:

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值中的一个像素变化的情况。但是,这不是很优雅,希望有更好的想法。

这里不需要直线方程。您可以单独缩放点之间的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)

这里不需要直线方程。您可以单独缩放点之间的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)

谢谢你的回答给了我一个想法,那就是我在使用向量机而不是直线方程时忽略了汉克斯。你的回答给了我一个想法,我不知道如何处理向量而不是线性方程