【问题标题】:random sampling of points along a polygon boundary沿多边形边界随机采样点
【发布时间】:2017-02-03 11:44:51
【问题描述】:

我正在尝试在由任意数量的点组成的多边形边界上随机采样点。多边形由一组 x,y 坐标组成。我想保留多边形的原始顶点以及添加随机采样点,并尽可能保留多边形的形状。如本例所示,给定一个原始多边形(蓝色顶点,左),我想要一个随机采样的多边形,沿着原始多边形的边界(红色顶点,右)具有 N=25 个点。

下面的代码是我尝试使用样条插值来做到这一点,但插值的结果最终会显着扭曲多边形的形状(使其更圆),特别是如果多边形有少量顶点首先。

def single_parametric_interpolate(obj_x_loc,obj_y_loc,numPts=50):
    '''
    Interpolate a single given bounding box obj_x_loc,obj_y_loc
    return a new set of coordinates interpolated on numPts 
    '''
    tck, u =splprep(np.array([obj_x_loc,obj_y_loc]),s=0,per=1)
    u_new = np.linspace(u.min(),u.max(),numPts)
    new_points = splev(u_new, tck,der=0)
    return new_points

有没有更好的方法来进行这种不会扭曲多边形最终形状的采样?

【问题讨论】:

  • 添加新点的目标是什么??
  • 添加新点的目的是因为我有很多不同形状和大小的多边形,我希望所有多边形都具有相同数量的点,以便进行下游计算完毕。这就是额外采样背后的动机。

标签: python geometry


【解决方案1】:

您可以计算多边形的周长p(将边长相加)。选择一个角落,在[0,p[ 中获得一个随机数r,然后沿着周边“走”这个长度r,例如逆时针方向并在那里放置一个点。

def single_parametric_interpolate(obj_x_loc,obj_y_loc,numPts=50):
    n = len(obj_x_loc)
    vi = [[obj_x_loc[(i+1)%n] - obj_x_loc[i],
         obj_y_loc[(i+1)%n] - obj_y_loc[i]] for i in range(n)]
    si = [np.linalg.norm(v) for v in vi]
    di = np.linspace(0, sum(si), numPts, endpoint=False)
    new_points = []
    for d in di:
        for i,s in enumerate(si):
            if d>s: d -= s
            else: break
        l = d/s
        new_points.append([obj_x_loc[i] + l*vi[i][0],
                           obj_y_loc[i] + l*vi[i][1]])
    return new_points

【讨论】:

    猜你喜欢
    • 2014-08-21
    • 2023-04-01
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    相关资源
    最近更新 更多